瀑布圖有什麼用?怎麼畫?

2021-02-19 林驥
瀑布圖,因為形似瀑布而得名,它能夠比較好地體現數據分析的對比思維和細分思維。比如說,假設某公司一月份銷售額 1000 萬,二月份銷售額 500 萬,為了體現各地區的銷售額變化,我們可以畫一張瀑布圖如下。通過對比,發現銷售額下降了 50%;通過細分,發現不同地區的銷售變化差異較大,其中上海地區的銷售額增加了 30 萬,湖北地區的銷售額下降了 150 萬,其他地區的銷售額也都有不同程度的下降。你可能會問,銷售額增加的原因是什麼?銷售額下降的原因又是什麼?這些都需要根據業務的實際情況,具體問題具體分析,找到問題的本質原因,從而有針對性地提出解決問題的辦法,本文給出的數據完全是虛擬的,所以這裡不做進一步的分析。
本文的重點,是介紹怎麼使用 Python 畫出瀑布圖,讓你能夠舉一反三,應用於自己的實際工作當中。你只需要把數據文件準備好,然後運行一遍代碼,就能自動生成所需的瀑布圖。首先,我們導入所需的庫,並從 Excel 文件中讀取不同地區的銷售額數據。

# 導入所需的庫
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 設置正常顯示中文標籤
plt.rcParams['font.sans-serif'] = ['SimHei']

########## 準備繪圖數據 ###############

# 從 Excel 文件中讀取數據,第一列設置為索引
sale = pd.read_excel('data/不同地區的銷售額變化.xlsx', index_col=0)

sale

其次,我們對原始數據進行處理,把數據轉換成繪圖所需的格式。

########## 處理數據 ###############

# 計算銷售額的變化
sale['銷售變化'] = sale.iloc[:, 1] - sale.iloc[:, 0]

# 把銷售匯總作為第一行
change = pd.concat([pd.DataFrame(sale.sum()).T, sale])

# 修改第一行的索引名稱:上個月
change.rename(index={0: sale.columns[0]}, inplace=True)

# 設置瀑布圖的第一個數值
change.iloc[0, 2] = change.iloc[0, 0]

# 排除沒有變化的項目
change = change[abs(change.銷售變化) > 0]

# 降序排列
change = change.sort_values('銷售變化', ascending=False)

# 不要包含匯總,後面會自動計算
index = change.index
data = change.銷售變化
trans = pd.DataFrame(data=data, index=index)

# 為瀑布圖創建空白序列,用於把柱子撐起來
blank = trans.銷售變化.cumsum().shift(1).fillna(0)

# 計算瀑布圖的最後一個數值:當月收入
thismonth = sale.columns[1]
total = trans.sum().銷售變化

# 設置瀑布圖中每個項目的變化
step = blank.reset_index(drop=True).repeat(3).shift(-1)
step[1::3] = np.nan

# 最後一根柱子是從 0 開始
blank.loc[thismonth] = 0
trans.loc[thismonth] = total

trans

接下來,我們開始畫圖,在畫圖函數所使用的數據中,trans 存儲的是瀑布圖中柱子對應的數據,blank 存儲的是柱子底端的高度數據。

########## 開始畫圖 ###############

# 設置標題
title = '\n各地區銷售額變化瀑布圖\n'

# 使用 Pandas 中的畫圖函數
waterfall = trans.plot(kind='bar', stacked=True, bottom=blank, legend=None, figsize=(16, 8), fontsize=20, width=0.8)

# 設置 x 軸標籤
waterfall.set_xlabel("")

# 計算標籤位置的偏移量
max = trans.max()
neg_offset = max / 25
pos_offset = max / 50
plot_offset = int(max / 10)

# 獲取標籤的高度位置
y_height = trans.銷售變化.cumsum().shift(1).fillna(0)

# 循環設置標籤
loop = 0
for index, row in trans.iterrows():
    x = row['銷售變化']
    # 最後一個標籤的位置不要雙倍
    if x == total:
        y = y_height[loop]
    else:
        y = y_height[loop] + x

    # 決定向上還是向下偏移
    if x > 0:
        y += pos_offset
    else:
        y -= neg_offset

    # 添加數字標籤,負數用紅色
    waterfall.annotate("{:.1f}".format(x), (loop, y), ha="center", fontsize=20, color=('k' if x>0 else 'r'))
    loop+=1

# 設置 y 軸的偏移量
waterfall.set_ylim(0, blank.max()+int(plot_offset))

# 設置 x 軸標籤的角度
waterfall.set_xticklabels(trans.index, rotation=0)

# 設置標題並顯示圖片
plt.title(title, fontsize=36, loc='center', color='k')

plt.show()

運行之後得到的圖片,就是本文開頭顯示的那張瀑布圖。本文介紹了瀑布圖的一個應用案例,並給出了詳細的 Python 實現代碼,在公眾號後臺發送「瀑布」兩個字,可以獲得本文的數據文件和完整代碼。雖然 Excel 也能畫瀑布圖,但是我個人覺得用 Python 能夠更加靈活高效。Python 能讓數據分析等工作變得更加自動化、標準化、流程化。所以,我漸漸地把很多工作,都轉換為使用 Python 來完成,以提升自己的工作效率和工作質量,讓自己有時間去做更多更有價值的事情。多花一些時間,去提升自己的能力,讓自己獲得成長和進步,我覺得是非常值得的,所謂「磨刀不誤砍柴工」,這也是我們要學習時間管理的重要原因之一。

相關焦點

  • 雙代號時標網絡圖用Excel畫
    網絡計劃圖有三種:單代號網絡圖、雙代號網絡圖、時標網絡圖,前不久我發了Excel自動生成橫道圖的模板;但是,橫道圖與網絡圖相比
  • No.4 一圖說清怎麼畫流程
    的流程圖。哪個人做什麼事,前後節點各是哪一步等等,一覽即知。左邊欄是角色,右邊欄是流程動作,照著這個模板畫就行(本文會給出我畫的樣例供大家參考)。接下來的問題就是用什麼工具畫這個圖了,如果公司有品味又恰好有錢,那就選用visol、iGrafx等;像我這樣就直接用PPT畫,品味一般但省錢,上手快.不說了,我先去畫個圖。下圖是我用PPT畫的,用時半小時,自評7分訂單處理到回款流程V1.0
  • PPT繪圖技巧 | 光照圖怎麼畫?
    PowerPoint(PPT)在教學中應用廣泛,但其繪畫功能大家卻很少知道,不少教師因為未熟練PPT的繪圖技術,認為PPT繪圖費時費力、效果不好,甚至因此轉向用其他軟體完成本可在PPT中完成的繪圖任務,這顯然會增加製作PPT課件的額外「開銷」,為此,我們決定不定期的推出相關PPT繪圖的小技巧,提供給各位,希望對各位有所啟發和幫助。下面簡單介紹一下PPT繪圖那點事。
  • 有用的心智圖
  • 用excel表格畫的畫,令人嘆服!
    看到這麼美的畫,首先你會想到是用是什麼畫的?
  • O 裡畫 √ 怎麼打出來?
    以前我們介紹過怎麼在方框裡畫√ ,這次蘭色在一個excel模板中看到的是O 裡畫 √。它是怎麼打出來的呢?
  • 什麼是點9圖?看這一篇就夠了!
    我們都是直接把PSD砸過去,研發乖乖自己切<( ̄ˇ ̄)/然而對於安卓而言,多了一個叫「點9圖」的名詞,很多人就困惑了,到底點9圖是神馬鬼,什麼時候切點9,什麼時候直接切dpi,點9圖到底要不要畫那個線,那個線到底做什麼用?
  • 怎樣畫出高大上的平面圖
    什麼是平面圖?平面圖需要包含什麼信息?怎麼樣進行平面表現?首先大家應該了解的一個問題是為什麼要在每次方案匯報時放上我們的平立剖以及透視。
  • 學了這麼多年設計還不會畫泡泡圖?
    學會如何畫泡泡必須理解泡泡的作用、內涵、進階也就是1. 為什麼要畫泡泡圖?2. 泡泡圖要表達什麼?3. 如何把泡泡圖變成設計方案?第一個問題為什麼要畫泡泡圖?第二畫泡泡圖覺得沒什麼好畫一方面是缺積累,更重要的是因為對泡泡圖的理解過於狹隘,泡泡圖不是單純表達功能,還能表達各個功能空間的大小、功能之間的相互關係(動靜分區、特殊功能分區)、更重要的是要反映功能之間如何互動、如何串接,真正的泡泡圖不是只畫幾個泡泡就完事的!!!這幾個泡泡反映出的背後思考,是大有內涵的!
  • 【辦公幫手】怎樣使用excel畫曲線圖
    excel是日常辦公必不可少的工具之一,其有很強大的功能。今天給大家分享一下怎樣使用excel繪製曲線圖。
  • 科研乾貨 | 我是一個可以用PPT畫一切的女子 | 用PPT畫出一張Nature Materials的示意圖
    >】直接跳轉 2:15;【畫反應容器】直接跳轉 6:55 ;        周一的時候在朋友圈做了調查,摸了一摸大家都對什麼話題感興趣 10個話題 4個學術 2個美妝和皮膚 2個日常vlog 2個情感其實很容易想到大家會對情感比較感興趣(哈哈哈,誰能不八卦但是除了【情感】以外
  • [Excel圖表]「樹狀圖」了解一下
    它有點像餅圖,採用面積大小來表示項目佔比。對於這個圖表,很多朋友可能都不知道是怎麼做出來的。其實很簡單,使用Excel就能夠完成任務。這個圖表在Excel中有一個官方名字,叫做「樹狀圖」。在某些文章中也有把它直接叫做「矩形餅圖」的。很多朋友之所以對它比較陌生,是因為這個圖表是從Excel2016中開始新增的一個圖表。
  • plotmeans圖,用ggplot2這樣畫
    gplot的plotmeans這張圖可以直觀的展示各組數據的均值和置信區間,並顯示了每組的樣本量。可以用ggplot2畫的更好看一些。仿畫思路1.直接搜索!找ggplot2版的plotmeans,找到了,但是現成的代碼不包含樣本數。2.但是可以找到帶有每組樣本數的箱線圖代碼!
  • 從一篇Science文章,告訴你怎麼用PPT進行論文圖排版.
    數據圖、示意圖、照片等等,怎麼準確、美觀、清晰地拼合在一起? 必須要用PS嗎?NO,PPT就夠了!看看下面的Science期刊上的樣圖你就懂了!小通總結了這類拼圖的幾點經驗:信息量大,往往在Communication、Letter或Review等文章或學位論文中比較常見;需要將示意圖(如下圖A)和數據圖、照片等圖片類型拼合在一起;怎麼排版才好看?小通建議你多看看Science、Nature、PNAS或Cell等頂級期刊的樣圖!
  • 如何用Excel畫順眼的曲線圖
    本篇文章位置:論文寫作-->技巧今天分享一下我用Excel畫曲線圖的方法。
  • 我用3秒,畫完了老闆要求的30個折線圖!
    每次你給我畫的趨勢圖,折線沒有超過5條的,為啥人家運營給我的圖,十幾二十條折線都能隨便畫?」老闆有點不爽。「這麼密,看得清啥啊?」小z沒能忍住吐槽的欲望。「看得清人家沒有偷工減料!不過,我找你來,是想線又多,又看得清楚,做數據的這點應該難不倒你吧」
  • 你畫的UML圖,別人能看懂嗎?還是看一下UML的規範吧!
    作者:碼匠筆記公眾號:碼匠筆記(ID:majiangbiji)在團隊協作過程中最常見的就是開會、開會最常用的就是圖,而圖中最常見的就是流程圖、時序圖、類圖,這三個圖可以清楚的描述你想解釋的內容。學好類圖不僅僅能幫助自己更清楚的梳理業務,還能提高開會效率。但是話說回來,你是否真的看懂別人畫的圖了?或者你真的會畫嗎?
  • 別眨眼,下一秒這張圖就動起來了!
    大家,早上好呀~杏子知道小夥伴們修靜圖修到膩了那今天我們換一種修法吧教大家怎麼把靜圖修成動圖~
  • 如何用excel畫幅像素畫?像十字繡一樣簡單!
    什麼?聽說隔壁的程序猿小李戀愛了!僅憑Excel俘獲公司財務小姐姐芳心?簡單來說就這位小哥粗中有細,竟然會用Excel畫像素畫!
  • 魚骨圖這麼畫,分分鐘解決難題!
    全文總計1581字,需閱讀4分鐘,以下為正文:作為職場奮青,每個人都想擁有自己「不可複製」的能力;作為老闆,都希望員工有才能、有創意、有想法。但是,願望都是美好的,在現實職場生活中,不管是員工還是老闆都會遇到一些瓶頸問題。那麼如何突破這些瓶頸?答案就是魚骨圖!魚骨圖是由日本管理大師石川馨先生所發明出來的,故又名石川圖。