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

此時繪制了一個普通的柱狀圖,展示了每個月的員工總?cè)藬?shù)。但是每個月的入職人數(shù)和離職人數(shù)沒有展示在圖形中。
繪制并列柱狀圖
要將多組數(shù)據(jù)的柱狀圖并列展示,可以多次鏈式調(diào)用add_yaxis()方法添加多組數(shù)據(jù)。
#?并列柱狀圖
bar?=?Bar(init_opts=opts.InitOpts(width='800px',?height='500px'))
bar.add_xaxis(month).add_yaxis(
????'各月總?cè)藬?shù)',?y_axis=total,?gap=0,?category_gap=0,
).add_yaxis(
????'各月入職人數(shù)',?y_axis=entry,?gap=0,?category_gap=0
).add_yaxis(
????'各月離職人數(shù)',?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')

將總?cè)藬?shù)、入職人數(shù)、離職人數(shù)全部添加到柱狀圖中,三組數(shù)據(jù)都展示了。
不過,這三組數(shù)據(jù)的大小變化是有關(guān)系的,會相互影響,并列的柱狀圖看不出來彼此之間的關(guān)系。
繪制堆疊柱狀圖
并列展示的柱狀圖不符合要求,所以嘗試將柱狀圖堆疊起來展示。堆疊柱狀圖的實現(xiàn)方法是在每個add_yaxis()方法中設(shè)置 stack 參數(shù),要將哪幾組柱狀圖堆疊在一起,就給它們的 stack 參數(shù)設(shè)置一樣的值(這個值可以自定義)。
#?堆疊柱狀圖
bar?=?Bar(init_opts=opts.InitOpts(width='800px',?height='500px'))
bar.add_xaxis(month).add_yaxis(
????'各月總?cè)藬?shù)',?y_axis=total,?stack='人數(shù)',?category_gap=2,
).add_yaxis(
????'各月入職人數(shù)',?y_axis=entry,?stack='人數(shù)',?category_gap=2
).add_yaxis(
????'各月離職人數(shù)',?y_axis=resign,?stack='人數(shù)',?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ā)現(xiàn),將柱狀圖堆疊在一起可以展示“疊加”的效果。不過,本文中的數(shù)據(jù)不完全適合疊加展示,入職人數(shù)是在總?cè)藬?shù)的基礎(chǔ)上相加,離職人數(shù)則要在總?cè)藬?shù)的基礎(chǔ)上相減。堆疊圖只能展示不斷疊加,還要在此基礎(chǔ)上把減少的效果也展示出來,所以需要做進一步的改造。
根據(jù)前面對瀑布圖的介紹,當用戶想表達一連續(xù)的數(shù)值加減關(guān)系時,可以使用瀑布圖。下面就來看如何實現(xiàn)。
繪制瀑布圖
根據(jù)瀑布圖的特征,它采用絕對值與相對值結(jié)合的方式,適用于表達數(shù)個特定數(shù)值之間的數(shù)量變化關(guān)系。所以在繪制瀑布圖前,要先對數(shù)據(jù)做一定的改造,能體現(xiàn)絕對值和相對值的關(guān)系。
每個月的入職人數(shù)和離職人數(shù)計算的絕對值就是每個月的增加人數(shù)或減少人數(shù)。如果入職人數(shù)大于離職人數(shù),則這個月增加人數(shù)為正數(shù)、無減少人數(shù)(用'-'表示,方便繪圖),反之,如果入職人數(shù)小于離職人數(shù),則增加人數(shù)為'-',減少人數(shù)為正數(shù),入職人數(shù)和離職人數(shù)相等則增加人數(shù)、減少人數(shù)都為'-'。
每個月的入職人數(shù)和總?cè)藬?shù),離職人數(shù)和總?cè)藬?shù)計算的相對值是每個月穩(wěn)定的人數(shù)。如果某個月人數(shù)增加,則這個月的穩(wěn)定人數(shù)就是月初的總?cè)藬?shù),如果某個月人數(shù)減少,則這個月的穩(wěn)定人數(shù)就是月初的總?cè)藬?shù)減掉減少的人數(shù)。
舉例:2023年1月,總?cè)藬?shù)50,入職0,離職2,則這個月減少2人,穩(wěn)定人數(shù)為50-2=48人。2023年3月,總?cè)藬?shù)42,入職12,離職6,則這個月增加6人,穩(wěn)定人數(shù)為42人。同理可以推出其他所有月的數(shù)據(jù)。
改造好數(shù)據(jù)后,開始繪制瀑布圖,瀑布圖的代碼與堆疊圖大部分一樣。瀑布圖主要是體現(xiàn)數(shù)據(jù)變化的部分,所以一般都將“數(shù)據(jù)穩(wěn)定”的部分隱藏(rgba顏色值中將a通道設(shè)置為0),本文用rgb顏色值把“穩(wěn)定數(shù)據(jù)”設(shè)置成灰色。
#?瀑布圖
#?穩(wěn)定人數(shù)
fixed?=?[48,?42,?42,?48,?58,?61,?61,?58,?58,?63,?67,?66]
#?增加人數(shù)
add?=?['-',?'-',?6,?10,?5,?'-',?4,?'-',?5,?6,?'-',?'-']
#?減少人數(shù)
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)定人數(shù)',?y_axis=fixed,?category_gap=2,
????stack="人數(shù)",?itemstyle_opts=opts.ItemStyleOpts(color="rgb(240,240,240)")
).add_yaxis(
????'各月增加人數(shù)',?y_axis=add,?stack='人數(shù)',?category_gap=2
).add_yaxis(
????'各月減少人數(shù)',?y_axis=reduce,?stack='人數(shù)',?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')

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

分享

收藏

點贊

在看
