日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

在Python Matplotlib中制作瀑布圖

 hercules028 2022-05-24 發(fā)布于四川
excelperfect

標(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 pandas as pd
import matplotlib.pyplot as plt
import numpy as np
 
df= pd.DataFrame({'category':['Sales','Service','Expenses','Taxes','Interest'],
                   'num':[100,10,-20,-30,60]})
 
代碼運(yùn)行結(jié)果如下圖1所示。
圖片
1
 
任務(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è)新的列tottot1為我們提供了每個(gè)瀑布條的起點(diǎn)和終點(diǎn)。例如,在第2Expenses(費(fèi)用)中,起點(diǎn)是110,終點(diǎn)是90。
df['tot']= df['num'].cumsum()
df['tot1']= df['tot'].shift(1).fillna(0)
 
代碼運(yùn)行結(jié)果如下圖2所示。
圖片
2
 
由于起點(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)情況下為白色。
fig,ax= plt.subplots()
ax.bar(x=df['category'],height=upper,)
ax.bar(x=df['category'],height=lower,color='white')
 
現(xiàn)在我們得到一個(gè)類似下面圖3所示的圖表?;旧希捎谂c背景顏色相同,高度為“lower點(diǎn)”的條形圖是不可見的。
圖片
3
 
現(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'])
 
運(yùn)行結(jié)果如下圖4所示。
圖片
4
 
瀑布圖顯示了每個(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ù)列的名稱。
def waterfall(df, x, y):
 
    # 計(jì)算運(yùn)行總數(shù)
    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)
 
    # 為標(biāo)簽位置的中間點(diǎn)
    mid = (lower + upper)/2
 
    # 正數(shù)顯示綠色, 負(fù)數(shù)顯示紅色
    df.loc[df[y] >= 0, 'color'] = 'green'
    df.loc[df[y] < 0, 'color'] = 'red'
 
    # 計(jì)算連接點(diǎn)
    connect= df['tot1'].repeat(3).shift(-1)
    connect[1::3] = np.nan
 
    fig,ax = plt.subplots()
 
    # 繪制具有顏色的第一個(gè)條形
    bars = ax.bar(x=df[x],height=upper, color=df['color'])
 
 
    # 繪制第二個(gè)條形 - 不可見
    plt.bar(x=df[x],height=lower,color='white')
 
    # 繪制連接線
    plt.plot(connect.index,connect.values, 'k')
 
    # 繪制條形標(biāo)簽
    for i, v in enumerate(upper):
        plt.text(i-.15, mid[i],f'{df[y][i]:,.0f}')
 
waterfall(df,'category','num')
 
代碼運(yùn)行的結(jié)果如下圖5所示。
圖片
5

注:本文學(xué)習(xí)整理自pythoninoffice.com,供有興趣的朋友參考。
歡迎在下面留言,完善本文內(nèi)容,讓更多的人學(xué)到更完美的知識(shí)。
歡迎到知識(shí)星球:完美Excel社群,進(jìn)行技術(shù)交流和提問,獲取更多電子資料,并通過社群加入專門的微信討論群,更方便交流。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多