首頁 > 軟體

Matplotlib條形圖之分組條形圖和堆疊條形圖詳解

2022-03-09 13:00:27

分組條形圖

拓展一下問題複雜度:使用水平條形圖展示每位員工前三個月的銷售額。此時,我們需要將每位員工的銷售額按月分組,分別繪製條形圖進行展示。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號
member = [u'小紅', u'小王', u'小李', u'小張']
sales_jan = [30, 42, 25, 35]  # 一月銷售額
sales_feb = [60, 55, 10, 27]  # 二月銷售額
sales_mar = [40, 20, 5, 68]  # 三月銷售額
bar_width = 0.2  # 設定分組條形的寬度
# 繪圖
plt.bar(range(4), sales_jan, label=u'一月', width=bar_width, align='center', color='steelblue', alpha=0.7)
# 也可以使用numpy模組的arange()函數構造橫座標
plt.bar(np.arange(4) + bar_width, sales_feb, label=u'二月', color='indianred', alpha=0.7, width=bar_width)
plt.bar(np.arange(4) + bar_width * 2, sales_mar, label=u'三月', color='green', alpha=0.7, width=bar_width)
# 新增Y軸標籤
plt.ylabel(u'月度銷售額(萬元)')
# 新增標題
plt.title(u'員工第一季度銷售額對比')
# 新增刻度標籤
plt.xticks(np.arange(4) + bar_width, member)
# 新增圖例
plt.legend()
plt.xlim(-0.5, 4.5)
plt.show()

分組條形圖比簡單條形圖的複雜之處在於,在放資料 x 軸座標和刻度位置時,需要進行額外的計算和調整。在執行座標的計算時,推薦使用 numpy ,因為它支援廣播機制,向量化的算術運算更加簡單。例如,上例中在設定第二個和第三個條形的 x 軸座標時,我們使用了 np.arange(4) + bar_width 和 np.arange(4) + bar_width * 2,而利用 Python 列表實現將十分複雜。

堆疊條形圖

堆疊條形圖是分組條形圖展示的另一種形式,它把分類的資料堆疊在一起,顯得更簡約緊密,同時提供了求和資訊。在實現上,繪製的思路與條形圖相似,不過前者是垂直偏移,後者是水平偏移。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號
member = [u'小紅', u'小王', u'小李', u'小張']
sales_jan = [30, 42, 25, 35]  # 一月銷售額
sales_feb = [60, 55, 10, 27]  # 二月銷售額
sales_mar = [40, 20, 5, 68]  # 三月銷售額
bar_width = 0.2  # 設定分組條形的寬度
# 繪圖
plt.bar(np.arange(4), sales_jan, label=u'一月', color='steelblue', alpha=0.7)
plt.bar(np.arange(4), sales_feb, bottom=sales_jan, label=u'二月', color='indianred', alpha=0.7)
plt.bar(np.arange(4), sales_mar, bottom=np.array(sales_jan) + np.array(sales_feb), label=u'三月', color='green',
        alpha=0.7)
# 新增Y軸標籤
plt.ylabel(u'月度銷售額(萬元)')
# 新增標題
plt.title(u'員工第一季度銷售額對比')
# 新增刻度標籤
plt.xticks(np.arange(4), member)
# 新增圖例
plt.legend()
plt.xlim(-0.5, 4.5)
plt.show()

這裡有兩點非常關鍵:一是 botom 選項的使用讓資料在該基礎之上有一個偏移;二是 NumPy 模組 array()函數的使用,將列表型別的資料轉換為 ndarray ,以便元素級別(向量化)運算。

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!  


IT145.com E-mail:sddin#qq.com