循序漸進,學會用pyecharts繪制瀑布圖
作者大部分時間周更,為了不錯過精彩內容,請點擊上方“Python碎片 ”,“ 星標 ”公眾號
瀑布圖簡介
瀑布圖(Waterfall Plot)是由麥肯錫顧問公司所獨創(chuàng)的圖表類型,因為形似瀑布流水而稱之為瀑布圖。
瀑布圖采用絕對值與相對值結合的方式,適用于表達多個特定數值之間的數量變化關系。當用戶想表達兩個數據之間數量的演變過程時,可以使用瀑布圖。當用戶想表達一連續(xù)的數值加減關系時,也可以使用瀑布圖。
這種效果的圖形能夠在反映數據多少的同時,更直觀地反映出數據的增減變化過程。
瀑布圖經常用于財務分析,以了解多種因素對特定對象的正面和負面影響??梢燥@示基于時間或基于類別的效果,基于類別的圖表表示費用或銷售額的收益或損失,基于時間的圖表表示一段時間內的收益或損失。
在Python中,可以使用pyecharts庫中繪制柱狀圖的組件 Bar 實現瀑布圖,本文就循序漸進地介紹一步步將柱狀圖演變成瀑布圖。
繪制柱狀圖
繪圖前需要先安裝pyecharts庫,如果你還沒有安裝,請先用 pip install pyecharts 安裝。
本文繪圖使用虛擬數據,假設你是一個老板,本文的數據表示2023年你公司的總人數、招聘人數和離職人數。你要求在展示每個月總人數的同時,還可以清晰地看出人數變化。
數據如下:
month?=?[f'2023-0{i}'?for?i?in?range(1,?10)]?+?[f'2023-{i}'?for?i?in?range(10,?13)]
#?每月總人數
total?=?[50,?48,?42,?48,?58,?63,?61,?65,?58,?63,?69,?67]
#?每月入職人數
entry?=?[0,?2,?12,?10,?5,?0,?4,?0,?10,?8,?3,?0]
#?每月離職人數
resign?=?[2,?8,?6,?0,?0,?2,?0,?7,?5,?2,?5,?1]
繪制柱狀圖使用pyecharts中的 Bar 組件,先初始化一個 Bar 對象,調用 add_xaxis()方法添加橫軸數據,鏈式調用add_yaxis()方法添加縱軸數據。再鏈式調用set_global_opts()設置坐標軸格式、字體等,最后鏈式調用render()方法將圖形渲染到HTML文件中,可以用瀏覽器打開繪圖結果。
from?pyecharts.charts?import?Bar
from?pyecharts?import?options?as?opts
#?柱狀圖
bar?=?Bar(init_opts=opts.InitOpts(width='800px',?height='500px'))
bar.add_xaxis(month).add_yaxis(
????'各月總人數',?y_axis=total,?category_gap=2
).set_global_opts(
????xaxis_opts=opts.AxisOpts(
????????axislabel_opts=opts.LabelOpts(font_size=8,?color='green',?font_weight='bolder')
????),?yaxis_opts=opts.AxisOpts(
????????axislabel_opts=opts.LabelOpts(font_size=10,?color='blue',?font_weight='bolder')
????)
).render('people_total.html')

此時繪制了一個普通的柱狀圖,展示了每個月的員工總人數。但是每個月的入職人數和離職人數沒有展示在圖形中。
繪制并列柱狀圖
要將多組數據的柱狀圖并列展示,可以多次鏈式調用add_yaxis()方法添加多組數據。
#?并列柱狀圖
bar?=?Bar(init_opts=opts.InitOpts(width='800px',?height='500px'))
bar.add_xaxis(month).add_yaxis(
????'各月總人數',?y_axis=total,?gap=0,?category_gap=0,
).add_yaxis(
????'各月入職人數',?y_axis=entry,?gap=0,?category_gap=0
).add_yaxis(
????'各月離職人數',?y_axis=resign,?gap=0,?category_gap=0
).set_global_opts(
????xaxis_opts=opts.AxisOpts(
????????axislabel_opts=opts.LabelOpts(font_size=8,?color='green',?font_weight='bolder')
????),?yaxis_opts=opts.AxisOpts(
????????axislabel_opts=opts.LabelOpts(font_size=10,?color='blue',?font_weight='bolder')
????)
).render('people_total_and_other.html')

將總人數、入職人數、離職人數全部添加到柱狀圖中,三組數據都展示了。
不過,這三組數據的大小變化是有關系的,會相互影響,并列的柱狀圖看不出來彼此之間的關系。
繪制堆疊柱狀圖
并列展示的柱狀圖不符合要求,所以嘗試將柱狀圖堆疊起來展示。堆疊柱狀圖的實現方法是在每個add_yaxis()方法中設置 stack 參數,要將哪幾組柱狀圖堆疊在一起,就給它們的 stack 參數設置一樣的值(這個值可以自定義)。
#?堆疊柱狀圖
bar?=?Bar(init_opts=opts.InitOpts(width='800px',?height='500px'))
bar.add_xaxis(month).add_yaxis(
????'各月總人數',?y_axis=total,?stack='人數',?category_gap=2,
).add_yaxis(
????'各月入職人數',?y_axis=entry,?stack='人數',?category_gap=2
).add_yaxis(
????'各月離職人數',?y_axis=resign,?stack='人數',?category_gap=2
).set_global_opts(
????xaxis_opts=opts.AxisOpts(
????????axislabel_opts=opts.LabelOpts(font_size=8,?color='green',?font_weight='bolder')
????),?yaxis_opts=opts.AxisOpts(
????????axislabel_opts=opts.LabelOpts(font_size=10,?color='blue',?font_weight='bolder')
????)
).render('people_total_stack.html')

不難發(fā)現,將柱狀圖堆疊在一起可以展示“疊加”的效果。不過,本文中的數據不完全適合疊加展示,入職人數是在總人數的基礎上相加,離職人數則要在總人數的基礎上相減。堆疊圖只能展示不斷疊加,還要在此基礎上把減少的效果也展示出來,所以需要做進一步的改造。
根據前面對瀑布圖的介紹,當用戶想表達一連續(xù)的數值加減關系時,可以使用瀑布圖。下面就來看如何實現。
繪制瀑布圖
根據瀑布圖的特征,它采用絕對值與相對值結合的方式,適用于表達數個特定數值之間的數量變化關系。所以在繪制瀑布圖前,要先對數據做一定的改造,能體現絕對值和相對值的關系。
每個月的入職人數和離職人數計算的絕對值就是每個月的增加人數或減少人數。如果入職人數大于離職人數,則這個月增加人數為正數、無減少人數(用'-'表示,方便繪圖),反之,如果入職人數小于離職人數,則增加人數為'-',減少人數為正數,入職人數和離職人數相等則增加人數、減少人數都為'-'。
每個月的入職人數和總人數,離職人數和總人數計算的相對值是每個月穩(wěn)定的人數。如果某個月人數增加,則這個月的穩(wěn)定人數就是月初的總人數,如果某個月人數減少,則這個月的穩(wěn)定人數就是月初的總人數減掉減少的人數。
舉例:2023年1月,總人數50,入職0,離職2,則這個月減少2人,穩(wěn)定人數為50-2=48人。2023年3月,總人數42,入職12,離職6,則這個月增加6人,穩(wěn)定人數為42人。同理可以推出其他所有月的數據。
改造好數據后,開始繪制瀑布圖,瀑布圖的代碼與堆疊圖大部分一樣。瀑布圖主要是體現數據變化的部分,所以一般都將“數據穩(wěn)定”的部分隱藏(rgba顏色值中將a通道設置為0),本文用rgb顏色值把“穩(wěn)定數據”設置成灰色。
#?瀑布圖
#?穩(wěn)定人數
fixed?=?[48,?42,?42,?48,?58,?61,?61,?58,?58,?63,?67,?66]
#?增加人數
add?=?['-',?'-',?6,?10,?5,?'-',?4,?'-',?5,?6,?'-',?'-']
#?減少人數
reduce?=?[2,?6,?'-',?'-',?'-',?2,?'-',?7,?'-',?'-',?2,?1]
bar?=?Bar(init_opts=opts.InitOpts(width='800px',?height='500px'))
bar.add_xaxis(month).add_yaxis(
????'各月穩(wěn)定人數',?y_axis=fixed,?category_gap=2,
????stack="人數",?itemstyle_opts=opts.ItemStyleOpts(color="rgb(240,240,240)")
).add_yaxis(
????'各月增加人數',?y_axis=add,?stack='人數',?category_gap=2
).add_yaxis(
????'各月減少人數',?y_axis=reduce,?stack='人數',?category_gap=2
).set_global_opts(
????xaxis_opts=opts.AxisOpts(
????????axislabel_opts=opts.LabelOpts(font_size=8,?color='green',?font_weight='bolder')
????),?yaxis_opts=opts.AxisOpts(
????????axislabel_opts=opts.LabelOpts(font_size=10,?color='blue',?font_weight='bolder')
????)
).render('people_total_waterfall.html')

經過以上幾個步驟的演進,完成了瀑布圖的繪制,可以很清晰地看到每個月人數的增加和減少,完美展示了數據變化的過程。這樣一步一步地調整和演進,相信看完后你已經知道如何繪制瀑布圖了,歡迎一鍵三連。
參考文檔:?
[1] pyecharts官方文檔:https://gallery.pyecharts.org/#/Bar/README
相關閱讀??

分享

收藏

點贊

在看
