Matplotlib實戰(zhàn)之百分比柱狀圖繪制詳解
百分比堆疊式柱狀圖是一種特殊的柱狀圖,它的每根柱子是等長的,總額為100%。
柱子內(nèi)部被分割為多個部分,高度由該部分占總體的百分比決定。
百分比堆疊式柱狀圖不顯示數(shù)據(jù)的“絕對數(shù)值”,而是顯示“相對比例”。
但同時,它也仍然具有柱狀圖的固有功能,即“比較”——我們可以通過比較多個柱子的構(gòu)成,分析數(shù)值之間的相對差異,或者得出數(shù)值變化的趨勢。
1. 主要元素
百分比柱狀圖是一種用于可視化比較不同類別或組的百分比或比例的圖表。
它的主要元素包括:
- 橫軸:表示數(shù)據(jù)的主分類。
- 縱軸:每個子分類的比例關(guān)系。
- 堆疊的矩形:每個柱狀圖由多個堆疊部分組成,和堆疊柱狀圖不同的是,每個柱子都是一樣高的。
- 圖例:每個堆疊部分代表的意義。

2. 適用的場景
百分比柱狀圖適用的場景很多,比如:
- 市場份額:比較不同產(chǎn)品或服務(wù)的市場份額,幫助決策者了解市場競爭情況。
- 人口比例:顯示不同地區(qū)或不同群體的人口比例,或不同年齡段的人口比例。
- 問卷調(diào)查結(jié)果:比較不同選項或答案的頻率或比例,或者用戶對產(chǎn)品特性的滿意度。
- 部門預(yù)算分配:顯示不同部門或項目的預(yù)算分配比例,幫助管理者了解資源分配情況。
- 等等。。。
3. 不適用的場景
百分比柱狀圖也有不適用于的場景,比如:
- 比較絕對數(shù)值:如果需要比較具體的數(shù)值大小而不僅僅是比例,那么百分比柱狀圖可能不是最合適的選擇。
- 數(shù)據(jù)存在重疊:如果不同類別的數(shù)據(jù)存在重疊或者相互依賴的情況,百分比柱狀圖可能無法清晰地展示比例關(guān)系。
- 數(shù)據(jù)量過大或過小:如果數(shù)據(jù)量過大或過小,百分比柱狀圖可能無法有效地顯示比例關(guān)系。
4. 分析實戰(zhàn)
和上一篇堆疊柱狀圖使用相同的原始數(shù)據(jù),繪制圖形之后可以看看這兩種柱狀圖展示分析結(jié)果的區(qū)別。
4.1. 數(shù)據(jù)來源
數(shù)據(jù)來自國家統(tǒng)計局公開的人民生活數(shù)據(jù),可從下面的網(wǎng)址下載:databook.top/nation/A0A
使用的是其中 A0A0A.csv文件(全國居民主要食品消費量)
fp = "d:/share/A0A0A.csv" df = pd.read_csv(fp) df

4.2. 數(shù)據(jù)清理
選取和上一篇堆疊柱狀圖一樣,還是5類:
- 居民人均蔬菜及食用菌消費量(千克)
- 居民人均肉類消費量(千克)
- 居民人均禽類消費量(千克)
- 居民人均水產(chǎn)品消費量(千克)
- 居民人均蛋類消費量(千克)
和堆疊柱狀圖不同的是,繪制百分比柱狀圖用的是百分比數(shù)值,所有要把原始數(shù)據(jù)中每年的絕對數(shù)值轉(zhuǎn)換為百分比數(shù)值。
data = df[(df["sj"] >= 2013) &
(df["sj"] <= 2021) &
(df["zb"].isin(["A0A0A03",
"A0A0A04",
"A0A0A05",
"A0A0A06",
"A0A0A07"]))].copy()
data["年消耗總量"] = data.groupby("sj").value.transform("sum")
data["各類消耗量占比"] = data["value"] / data["年消耗總量"]
data.loc[:, ["sjCN", "zbCN", "各類消耗量占比"]].head(10)
4.3. 分析結(jié)果可視化
import matplotlib.ticker as mticker
data = data.sort_values("sj")
data["各類消耗量占比"] = data["各類消耗量占比"]*100
with plt.style.context("seaborn-v0_8"):
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
years = data["sjCN"].drop_duplicates(keep="first").tolist()
bar_data = {
"蔬菜及菌類(%)": data[data["zb"] == "A0A0A03"]["各類消耗量占比"].tolist(),
"肉類(%)": data[data["zb"] == "A0A0A04"]["各類消耗量占比"].tolist(),
"禽類(%)": data[data["zb"] == "A0A0A05"]["各類消耗量占比"].tolist(),
"水產(chǎn)品(%)": data[data["zb"] == "A0A0A06"]["各類消耗量占比"].tolist(),
"蛋類(%)": data[data["zb"] == "A0A0A07"]["各類消耗量占比"].tolist(),
}
bottom = np.zeros(len(years))
for key, vals in bar_data.items():
ax.bar(years, vals, label=key, bottom=bottom)
bottom += vals
# 設(shè)置Y軸刻度的顯示格式
ax.set_ylim(0, 110)
yticks = ax.get_yticks().tolist()
ax.yaxis.set_major_locator(mticker.FixedLocator(yticks))
ax.set_yticklabels(["{}%".format(x) for x in yticks])
ax.set_title("全國居民主要糧食消耗情況")
ax.legend(loc="upper left", ncol=5)
百分比柱狀圖每年的數(shù)據(jù)高度都一樣,與堆疊柱狀圖相比,更容易比較每個種類糧食的消耗情況。
不過,這種圖看不出糧食總量的變化情況了。
到此這篇關(guān)于Matplotlib實戰(zhàn)之百分比柱狀圖繪制詳解的文章就介紹到這了,更多相關(guān)Matplotlib百分比柱狀圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python人工智能之混合高斯模型運動目標(biāo)檢測詳解分析
運動目標(biāo)檢測是計算機視覺領(lǐng)域中的一個重要內(nèi)容,其檢測效果將會對目標(biāo)跟蹤與識別造成一定的影響,本文將介紹用Python來進行混合高斯模型運動目標(biāo)檢測,感興趣的朋友快來看看吧2021-11-11
Python循環(huán)結(jié)構(gòu)的應(yīng)用場景詳解
這篇文章主要介紹了Python循環(huán)結(jié)構(gòu)的應(yīng)用場景詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
Python利用PySimpleGUI實現(xiàn)自制桌面翻譯神器
工作上經(jīng)常需要與外國友人郵件溝通,奈何工作電腦沒有安裝有道詞典一類的翻譯軟件,結(jié)合自己的需要,自己用PySimpleGUI擼一個桌面翻譯神器,感興趣的可以了解一下2022-09-09
Python基于回溯法子集樹模板解決數(shù)字組合問題實例
這篇文章主要介紹了Python基于回溯法子集樹模板解決數(shù)字組合問題,簡單描述了數(shù)字組合問題并結(jié)合實例形式分析了Python回溯法子集樹模板解決數(shù)字組合問題的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-09-09

