簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!
時間:2021-10-20 16:39:26
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]作者|黃偉呢來源|數(shù)據(jù)分析與統(tǒng)計學之美簡介瀑布圖,由麥肯錫顧問公司所獨創(chuàng)的圖表類型,因為形似瀑布流水,所以被大家稱之為瀑布圖(WaterfallPlot),在企業(yè)經(jīng)營分析、財務分析中使用較多,用以表示企業(yè)成本的構成、變化等情況。瀑布圖本質(zhì):堆積柱形圖的繪制。瀑布圖的繪圖原理那么,...
簡介
瀑布圖,由麥肯錫顧問公司所獨創(chuàng)的圖表類型,因為形似瀑布流水,所以被大家稱之為瀑布圖(Waterfall Plot),在企業(yè)經(jīng)營分析、財務分析中使用較多,用以表示企業(yè)成本的構成、變化等情況。
瀑布圖的繪圖原理
那么,如何用Python繪制這樣一個瀑布圖呢?
增減變動過程。因此,這里涉及到一個占位,如圖所示:
除了首尾兩個字段,都是以原點起步的,中間過程要體現(xiàn)這個波動過程。我特意用不同顏色,為大家圈出了這個占位的高度,但是在瀑布圖中,我們并不顯示出來。
文章最開始就說了,瀑布圖的本質(zhì)其實就是堆積的柱形圖。
為了構造這個占位數(shù)據(jù),我們需要對數(shù)據(jù)進行一定的處理。讓首尾字段的數(shù)據(jù)都為0,中間部分,表示占位高度。
最后,我們利用原始數(shù)據(jù)與占位高度數(shù)據(jù),做一個堆疊的柱形圖,就可以展示出這個瀑布效果了。
瀑布圖的繪圖步驟
現(xiàn)在我就為大家講解詳細的步驟。
1. 導入相關庫
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
2. 創(chuàng)建數(shù)據(jù)
index = ['銷售','退貨','信用費','回扣','滯納金','運費']
data = {'金額': [350000,-30000,-7500,-25000,95000,-7000]}
df = pd.DataFrame(data=data,index=index)
df
結果如下:
瀑布圖的最大問題就是弄清楚,底部堆積的條形圖應該是什么。
首先,先求累積和。
df["金額"].cumsum()
結果如下:
原理部分,已經(jīng)為大家講述過,瀑布圖 = 原始數(shù)據(jù) 占位數(shù)據(jù),堆積而成。
因此,對于占位數(shù)據(jù),它的首位數(shù)據(jù),我們必須將其變?yōu)?.
total = df.sum()["金額"]
df.loc["凈總量"] = total
blank = df["金額"].cumsum().shift(1).fillna(0)
blank.loc["凈總量"] = total
blank.loc["凈總量"] = 0
結果如下
其實,一行Python代碼,就可以完成瀑布圖的繪制。
df.plot(kind='bar', stacked=True, bottom=blank,legend=None, title="瀑布")
plt.xticks(rotation=60)
plt.ylim(-100000,400000)
plt.grid()
結果如下:
其實,到這里瀑布圖的繪制已經(jīng)結束了。但是,為了是這個增減變動更加清楚,我們可以添加一個階梯。
# 多添加一個繪圖代碼
step = blank.reset_index(drop=True).repeat(3).shift(-1)
step[1::3] = np.nan
my_plot = df.plot(kind='bar', stacked=True, bottom=blank,legend=None, title="瀑布圖")
my_plot.plot(step.index, step.values,'k')
plt.xticks(rotation=60)
plt.ylim(-100000,400000)
plt.grid()
結果如下:
值得注意的問題
在下面這行代碼中,有一個bottom參數(shù)。
df.plot(kind='bar', stacked=True, bottom=blank,legend=None, title="瀑布圖")
其實該參數(shù),表示的是堆積柱形圖的起始點,如果數(shù)據(jù)為正,則柱子在該起始點之上,如果數(shù)據(jù)為負,則柱子在該起始點之下。
我們?yōu)榇蠹遗e例說明:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(5)
a = np.array([10, 15, 20, 15, 5])
b = np.array([5, -20, 7, -25, 9])
plt.bar(x, b, bottom=a, label='b')
plt.grid()
plt.show()
結果如下:
觀察上圖,我為大家標注好了起始點,如果數(shù)據(jù)為正,柱子都是朝上,否則就朝下。