標(biāo)簽:Python,Matplotlib,瀑布圖我們將用Python制作瀑布圖,特別是使用matplotlib庫。瀑布圖顯示了運(yùn)行總數(shù)以及增減,這對(duì)于屬性分析來說是很好的選擇。Matplotlib沒有像“waterfall_chart()”這樣的神奇函數(shù),使我們能夠用一行代碼就繪制瀑布圖。然而,可以使用一點(diǎn)小小的技巧在Python中自定義自己的瀑布圖。1.創(chuàng)建標(biāo)準(zhǔn)的條形圖。2.創(chuàng)建另一個(gè)條形圖并將其放在第一個(gè)條形圖的頂部,然后將新條形圖的顏色設(shè)置為與背景色相同的顏色,以隱藏第一個(gè)條形圖的底部。實(shí)際上,因?yàn)槲覀兛床坏降诙M條形圖,所以我們可以使用它們來“隱藏”另一組條形圖。import matplotlib.pyplot as pltdf= pd.DataFrame({'category':['Sales','Service','Expenses','Taxes','Interest'], 'num':[100,10,-20,-30,60]})任務(wù)現(xiàn)在變成創(chuàng)建兩個(gè)條形圖,其中一個(gè)應(yīng)該記錄運(yùn)行總數(shù),另一個(gè)只是運(yùn)行總數(shù)的變化,我們稍后就會(huì)看到。可以使用cumsum()方法計(jì)算一個(gè)運(yùn)行總數(shù),然后將其下移1行。這兩個(gè)新的列tot和tot1為我們提供了每個(gè)瀑布條的起點(diǎn)和終點(diǎn)。例如,在第2行Expenses(費(fèi)用)中,起點(diǎn)是110,終點(diǎn)是90。df['tot']= df['num'].cumsum()df['tot1']= df['tot'].shift(1).fillna(0)由于起點(diǎn)和終點(diǎn)可以位于兩個(gè)新列中的任意一列(取決于值的符號(hào)),因此我們可以再創(chuàng)建兩列來捕獲upper點(diǎn)和lower點(diǎn):lower= df[['tot','tot1']].min(axis=1)upper= df[['tot','tot1']].max(axis=1)我們使用upper點(diǎn)繪制第一組條形圖。注意,這些條形的顏色與背景顏色不同。然后,我們使用lower點(diǎn)繪制第二組條形圖,并將顏色設(shè)置為與背景顏色相同,默認(rèn)情況下為白色。ax.bar(x=df['category'],height=upper,)ax.bar(x=df['category'],height=lower,color='white')現(xiàn)在我們得到一個(gè)類似下面圖3所示的圖表?;旧希捎谂c背景顏色相同,高度為“lower點(diǎn)”的條形圖是不可見的。現(xiàn)在,我們有了一個(gè)基本的瀑布圖,再給它添加一些顏色。這里使用綠色表示增加,紅色表示減少。數(shù)據(jù)在num列中隨時(shí)可用,讓我們創(chuàng)建一個(gè)新的color列來存儲(chǔ)每個(gè)類別的適當(dāng)顏色。df.loc[df['num']>= 0, 'color'] = 'green'df.loc[df['num']< 0, 'color'] = 'red'ax.bar(x=df['category'],height=upper,color= df['color'])瀑布圖顯示了每個(gè)類別對(duì)總數(shù)的貢獻(xiàn),因此可在每個(gè)條形的中間添加標(biāo)簽信息。也可以添加“連接符”,將上一個(gè)條形的起點(diǎn)和終點(diǎn)連接到下一個(gè)條形。下面將完整的瀑布圖代碼轉(zhuǎn)換為一個(gè)方便的Python函數(shù),以便以后可以重用它。該函數(shù)接受三個(gè)參數(shù):包含數(shù)據(jù)的數(shù)據(jù)框架、要放置為x軸的數(shù)據(jù)列的名稱以及要用作y軸的數(shù)據(jù)列的名稱。 df['tot'] = df[y].cumsum() df['tot1']=df['tot'].shift(1).fillna(0) # 條形圖的lower點(diǎn)和upper點(diǎn) lower = df[['tot','tot1']].min(axis=1) upper = df[['tot','tot1']].max(axis=1) # 正數(shù)顯示綠色, 負(fù)數(shù)顯示紅色 df.loc[df[y] >= 0, 'color'] = 'green' df.loc[df[y] < 0, 'color'] = 'red' connect= df['tot1'].repeat(3).shift(-1) bars = ax.bar(x=df[x],height=upper, color=df['color']) plt.bar(x=df[x],height=lower,color='white') plt.plot(connect.index,connect.values, 'k') for i, v in enumerate(upper): plt.text(i-.15, mid[i],f'{df[y][i]:,.0f}')waterfall(df,'category','num')注:本文學(xué)習(xí)整理自pythoninoffice.com,供有興趣的朋友參考。歡迎在下面留言,完善本文內(nèi)容,讓更多的人學(xué)到更完美的知識(shí)。歡迎到知識(shí)星球:完美Excel社群,進(jìn)行技術(shù)交流和提問,獲取更多電子資料,并通過社群加入專門的微信討論群,更方便交流。
|