matplotlib bar()實現(xiàn)多組數(shù)據(jù)并列柱狀圖通用簡便創(chuàng)建方法
在使用柱狀圖時,經(jīng)常遇到需要多組數(shù)據(jù)進行比較的情況。
繪制單個數(shù)據(jù)系列的柱形圖比較簡單,多組數(shù)據(jù)柱狀圖繪制的關鍵有三點:
- 多次調(diào)用bar()函數(shù)即可在同一子圖中繪制多組柱形圖。
- 為了防止柱子重疊,每個柱子在x軸上的位置需要依次遞增,如果柱子緊挨,這個距離即柱子寬度。
- 為了使刻度標簽居中,需要調(diào)整x軸刻度標簽的位置。
由上述可知,多組數(shù)據(jù)并列柱狀圖需要計算柱子x
軸上的位置和x
軸刻度標簽。
因此,有兩種實現(xiàn)方案:
x
軸刻度標簽位置固定,根據(jù)x
軸刻度計算每個柱子的寬度- 每個柱子的寬度固定,計算
x
軸刻度標簽位置,使之居中
下面使用第一種方法演示兩組數(shù)據(jù)、三組數(shù)據(jù)、四組數(shù)據(jù)的并列柱狀圖。
使用方法一、方法二演示通用多組并列柱狀圖的創(chuàng)建方法。
兩組數(shù)據(jù)、三組數(shù)據(jù)、四組數(shù)據(jù)的并列柱狀圖
import matplotlib import matplotlib.pyplot as plt import numpy as np plt.figure(figsize=(13, 4)) # 構(gòu)造x軸刻度標簽、數(shù)據(jù) labels = ['G1', 'G2', 'G3', 'G4', 'G5'] first = [20, 34, 30, 35, 27] second = [25, 32, 34, 20, 25] third = [21, 31, 37, 21, 28] fourth = [26, 31, 35, 27, 21] # 兩組數(shù)據(jù) plt.subplot(131) x = np.arange(len(labels)) # x軸刻度標簽位置 width = 0.25 # 柱子的寬度 # 計算每個柱子在x軸上的位置,保證x軸刻度標簽居中 # x - width/2,x + width/2即每組數(shù)據(jù)在x軸上的位置 plt.bar(x - width/2, first, width, label='1') plt.bar(x + width/2, second, width, label='2') plt.ylabel('Scores') plt.title('2 datasets') # x軸刻度標簽位置不進行計算 plt.xticks(x, labels=labels) plt.legend() # 三組數(shù)據(jù) plt.subplot(132) x = np.arange(len(labels)) # x軸刻度標簽位置 width = 0.25 # 柱子的寬度 # 計算每個柱子在x軸上的位置,保證x軸刻度標簽居中 # x - width,x, x + width即每組數(shù)據(jù)在x軸上的位置 plt.bar(x - width, first, width, label='1') plt.bar(x, second, width, label='2') plt.bar(x + width, third, width, label='3') plt.ylabel('Scores') plt.title('3 datasets') # x軸刻度標簽位置不進行計算 plt.xticks(x, labels=labels) plt.legend() # 四組數(shù)據(jù) plt.subplot(133) x = np.arange(len(labels)) # x軸刻度標簽位置 width = 0.2 # 柱子的寬度 # 計算每個柱子在x軸上的位置,保證x軸刻度標簽居中 plt.bar(x - 1.5*width, first, width, label='1') plt.bar(x - 0.5*width, second, width, label='2') plt.bar(x + 0.5*width, third, width, label='3') plt.bar(x + 1.5*width, fourth, width, label='4') plt.ylabel('Scores') plt.title('4 datasets') # x軸刻度標簽位置不進行計算 plt.xticks(x, labels=labels) plt.legend() plt.show()
通用多組并列柱狀圖的簡便創(chuàng)建方法
上面的示例比較簡易,有一些問題沒有考慮。為了便于重復使用,下面的通用方法可調(diào)整x軸標簽刻度步長、每組柱子的總寬度、每組柱子之間的間隙、組與組之間的間隙。
方法一
import matplotlib import matplotlib.pyplot as plt import numpy as np label = ['G1', 'G2', 'G3', 'G4', 'G5'] first = [20, 34, 30, 35, 27] second = [25, 32, 34, 20, 25] third = [21, 31, 37, 21, 28] fourth = [26, 31, 35, 27, 21] data = [first, second, third, fourth] def create_multi_bars(labels, datas, tick_step=1, group_gap=0.2, bar_gap=0): ''' labels : x軸坐標標簽序列 datas :數(shù)據(jù)集,二維列表,要求列表每個元素的長度必須與labels的長度一致 tick_step :默認x軸刻度步長為1,通過tick_step可調(diào)整x軸刻度步長。 group_gap : 柱子組與組之間的間隙,最好為正值,否則組與組之間重疊 bar_gap :每組柱子之間的空隙,默認為0,每組柱子緊挨,正值每組柱子之間有間隙,負值每組柱子之間重疊 ''' # ticks為x軸刻度 ticks = np.arange(len(labels)) * tick_step # group_num為數(shù)據(jù)的組數(shù),即每組柱子的柱子個數(shù) group_num = len(datas) # group_width為每組柱子的總寬度,group_gap 為柱子組與組之間的間隙。 group_width = tick_step - group_gap # bar_span為每組柱子之間在x軸上的距離,即柱子寬度和間隙的總和 bar_span = group_width / group_num # bar_width為每個柱子的實際寬度 bar_width = bar_span - bar_gap # baseline_x為每組柱子第一個柱子的基準x軸位置,隨后的柱子依次遞增bar_span即可 baseline_x = ticks - (group_width - bar_span) / 2 for index, y in enumerate(datas): plt.bar(baseline_x + index*bar_span, y, bar_width) plt.ylabel('Scores') plt.title('multi datasets') # x軸刻度標簽位置與x軸刻度一致 plt.xticks(ticks, labels) plt.show() create_multi_bars(label, data, bar_gap=0.1)
方法二
import matplotlib import matplotlib.pyplot as plt import numpy as np label = ['G1', 'G2', 'G3', 'G4', 'G5'] first = [20, 34, 30, 35, 27] second = [25, 32, 34, 20, 25] third = [21, 31, 37, 21, 28] fourth = [26, 31, 35, 27, 21] data = [first, second, third, fourth] def create_multi_bars(labels, datas, tick_step=1, group_gap=0.2, bar_gap=0): ''' labels : x軸坐標標簽序列 datas :數(shù)據(jù)集,二維列表,要求列表每個元素的長度必須與labels的長度一致 tick_step :默認x軸刻度步長為1,通過tick_step可調(diào)整x軸刻度步長。 group_gap : 柱子組與組之間的間隙,最好為正值,否則組與組之間重疊 bar_gap :每組柱子之間的空隙,默認為0,每組柱子緊挨,正值每組柱子之間有間隙,負值每組柱子之間重疊 ''' # x為每組柱子x軸的基準位置 x = np.arange(len(labels)) * tick_step # group_num為數(shù)據(jù)的組數(shù),即每組柱子的柱子個數(shù) group_num = len(datas) # group_width為每組柱子的總寬度,group_gap 為柱子組與組之間的間隙。 group_width = tick_step - group_gap # bar_span為每組柱子之間在x軸上的距離,即柱子寬度和間隙的總和 bar_span = group_width / group_num # bar_width為每個柱子的實際寬度 bar_width = bar_span - bar_gap # 繪制柱子 for index, y in enumerate(datas): plt.bar(x + index*bar_span, y, bar_width) plt.ylabel('Scores') plt.title('multi datasets') # ticks為新x軸刻度標簽位置,即每組柱子x軸上的中心位置 ticks = x + (group_width - bar_span) / 2 plt.xticks(ticks, labels) plt.show() create_multi_bars(label, data[:3], bar_gap=0.1)
相關文章
Django使用模板后無法找到靜態(tài)資源文件問題解決
這篇文章主要介紹了Django使用模板后無法找到靜態(tài)資源文件問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07Python Web框架Django的模型和數(shù)據(jù)庫遷移詳解
Django 是一個極其強大的 Python Web 框架,它提供了許多工具和特性,能夠幫助我們更快速、更便捷地構(gòu)建 Web 應用,在本文中,我們將會關注 Django 中的模型(Models)和數(shù)據(jù)庫遷移(Database Migrations)這兩個核心概念,需要的朋友可以參考下2023-08-08Python實現(xiàn)url長短鏈接的轉(zhuǎn)換
短鏈接,通俗來說,就是將長的URL網(wǎng)址,通過程序計算等方式,轉(zhuǎn)換為簡短的網(wǎng)址字符串。本文將用Python語言實現(xiàn)這一效果,需要的可以參考一下2022-11-11