當前位置:首頁 > 公眾號精選 > AI科技大本營
[導讀]作者|黃偉呢來源|數(shù)據(jù)分析與統(tǒng)計學之美簡介瀑布圖,由麥肯錫顧問公司所獨創(chuàng)的圖表類型,因為形似瀑布流水,所以被大家稱之為瀑布圖(WaterfallPlot),在企業(yè)經(jīng)營分析、財務分析中使用較多,用以表示企業(yè)成本的構成、變化等情況。瀑布圖本質(zhì):堆積柱形圖的繪制。瀑布圖的繪圖原理那么,...


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


作者|黃偉呢


來源|數(shù)據(jù)分析與統(tǒng)計學之美


簡介

瀑布圖,由麥肯錫顧問公司所獨創(chuàng)的圖表類型,因為形似瀑布流水,所以被大家稱之為瀑布圖(Waterfall Plot),在企業(yè)經(jīng)營分析、財務分析中使用較多,用以表示企業(yè)成本的構成、變化等情況。


瀑布圖本質(zhì):堆積柱形圖的繪制。


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


瀑布圖的繪圖原理

那么,如何用Python繪制這樣一個瀑布圖呢?


很多人不知道如何繪制瀑布圖,是由于對瀑布圖的繪圖原理,不夠清楚。


因此,這里先來講述一下瀑布圖的繪圖原理。


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


有這樣一份原始數(shù)據(jù):


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


從最開始的銷售,經(jīng)過退貨、信用費、回扣、滯納金、運費,這一系列的操作后,最后肯定還有一個凈總量。因此,我們需要添加這樣一行。


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


注意:在瀑布圖中,最初的“銷售”與最后的“凈總量”,都是以坐標軸原點為起點。


瀑布圖本身就是要體現(xiàn)這個增減變動過程。因此,這里涉及到一個占位,如圖所示:


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


除了首尾兩個字段,都是以原點起步的,中間過程要體現(xiàn)這個波動過程。我特意用不同顏色,為大家圈出了這個占位的高度,但是在瀑布圖中,我們并不顯示出來。


文章最開始就說了,瀑布圖的本質(zhì)其實就是堆積的柱形圖。


為了構造這個占位數(shù)據(jù),我們需要對數(shù)據(jù)進行一定的處理。讓首尾字段的數(shù)據(jù)都為0,中間部分,表示占位高度。


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


最后,我們利用原始數(shù)據(jù)與占位高度數(shù)據(jù),做一個堆疊的柱形圖,就可以展示出這個瀑布效果了。


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


瀑布圖的繪圖步驟

現(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


結果如下:


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


瀑布圖的最大問題就是弄清楚,底部堆積的條形圖應該是什么。


首先,先求累積和。


df["金額"].cumsum()


結果如下:


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


原理部分,已經(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「瀑布圖」的整個制作流程!


其實,一行Python代碼,就可以完成瀑布圖的繪制。


df.plot(kind='bar', stacked=True, bottom=blank,legend=None, title="瀑布")

plt.xticks(rotation=60)
plt.ylim(-100000,400000)
plt.grid()


結果如下:


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


其實,到這里瀑布圖的繪制已經(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()


結果如下:


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


值得注意的問題

在下面這行代碼中,有一個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()


結果如下:


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!


觀察上圖,我為大家標注好了起始點,如果數(shù)據(jù)為正,柱子都是朝上,否則就朝下。


簡介 原理 繪制,詳解?Python「瀑布圖」的整個制作流程!



本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉
關閉