电竞比分网-中国电竞赛事及体育赛事平台

分享

在Python Matplotlib中制作瀑布圖

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

標(biāo)簽:Python,Matplotlib瀑布圖
 
我們將用Python制作瀑布圖,特別是使用matplotlib庫。瀑布圖顯示了運行總數(shù)以及增減,這對于屬性分析來說是很好的選擇。
 
Matplotlib沒有像“waterfall_chart()”這樣的神奇函數(shù),使我們能夠用一行代碼就繪制瀑布圖。然而,可以使用一點小小的技巧在Python中自定義自己的瀑布圖。
 
1.創(chuàng)建標(biāo)準(zhǔn)的條形圖。
 
2.創(chuàng)建另一個條形圖并將其放在第一個條形圖的頂部,然后將新條形圖的顏色設(shè)置為與背景色相同的顏色,以隱藏第一個條形圖的底部。
 
實際上,因為我們看不到第二組條形圖,所以我們可以使用它們來“隱藏”另一組條形圖。
 
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]})
 
代碼運行結(jié)果如下圖1所示。
圖片
1
 
任務(wù)現(xiàn)在變成創(chuàng)建兩個條形圖,其中一個應(yīng)該記錄運行總數(shù),另一個只是運行總數(shù)的變化,我們稍后就會看到。
 
可以使用cumsum()方法計算一個運行總數(shù),然后將其下移1行。這兩個新的列tottot1為我們提供了每個瀑布條的起點和終點。例如,在第2Expenses(費用)中,起點是110,終點是90
df['tot']= df['num'].cumsum()
df['tot1']= df['tot'].shift(1).fillna(0)
 
代碼運行結(jié)果如下圖2所示。
圖片
2
 
由于起點和終點可以位于兩個新列中的任意一列(取決于值的符號),因此我們可以再創(chuàng)建兩列來捕獲upper點和lower點:
lower= df[['tot','tot1']].min(axis=1)
upper= df[['tot','tot1']].max(axis=1)
 
我們使用upper點繪制第一組條形圖。注意,這些條形的顏色與背景顏色不同。然后,我們使用lower點繪制第二組條形圖,并將顏色設(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)在我們得到一個類似下面圖3所示的圖表。基本上,由于與背景顏色相同,高度為“lower點”的條形圖是不可見的。
圖片
3
 
現(xiàn)在,我們有了一個基本的瀑布圖,再給它添加一些顏色。這里使用綠色表示增加,紅色表示減少。
 
數(shù)據(jù)在num列中隨時可用,讓我們創(chuàng)建一個新的color列來存儲每個類別的適當(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'])
 
運行結(jié)果如下圖4所示。
圖片
4
 
瀑布圖顯示了每個類別對總數(shù)的貢獻,因此可在每個條形的中間添加標(biāo)簽信息。也可以添加“連接符”,將上一個條形的起點和終點連接到下一個條形。
 
下面將完整的瀑布圖代碼轉(zhuǎn)換為一個方便的Python函數(shù),以便以后可以重用它。該函數(shù)接受三個參數(shù):包含數(shù)據(jù)的數(shù)據(jù)框架、要放置為x軸的數(shù)據(jù)列的名稱以及要用作y軸的數(shù)據(jù)列的名稱。
def waterfall(df, x, y):
 
    # 計算運行總數(shù)
    df['tot'] = df[y].cumsum()
    df['tot1']=df['tot'].shift(1).fillna(0)
 
    # 條形圖的lower點和upper
    lower = df[['tot','tot1']].min(axis=1)
    upper = df[['tot','tot1']].max(axis=1)
 
    # 為標(biāo)簽位置的中間點
    mid = (lower + upper)/2
 
    # 正數(shù)顯示綠色, 負(fù)數(shù)顯示紅色
    df.loc[df[y] >= 0, 'color'] = 'green'
    df.loc[df[y] < 0, 'color'] = 'red'
 
    # 計算連接點
    connect= df['tot1'].repeat(3).shift(-1)
    connect[1::3] = np.nan
 
    fig,ax = plt.subplots()
 
    # 繪制具有顏色的第一個條形
    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')
 
    # 繪制條形標(biāo)簽
    for i, v in enumerate(upper):
        plt.text(i-.15, mid[i],f'{df[y][i]:,.0f}')
 
waterfall(df,'category','num')
 
代碼運行的結(jié)果如下圖5所示。
圖片
5

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多