日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

【數(shù)據(jù)處理】Python matplotlib繪制雙柱狀圖以及繪制堆積柱狀圖——保姆級教程

作者:別出BUG求求了 更新時間: 2023-11-11 編程語言

Python matplotlib繪制雙柱狀圖以及繪制堆積柱狀圖

  • 雙柱狀圖
    • 一、雙柱狀圖的原理
    • 二、雙柱狀圖的完善
      • 1. 增加圖片標題
      • 2. 增加x軸y軸標題
      • 3. 增加x軸注釋
    • 四、完整代碼
  • 堆積柱狀圖
    • 一、堆積柱狀圖的繪制原理
    • 二、plt.bar參數(shù)介紹
    • 三、完整代碼:

雙柱狀圖

一、雙柱狀圖的原理

繪制雙柱狀圖的原理用最樸素的話來講就是:

先繪制第一個系列的柱體(如先繪制男生柱體),然后在第一個系列柱狀體的右邊繪制第二個系列的柱體(如女生柱體)。

這時就需要解決一個問題:應該如何確定第二個系列的柱狀體所應在的位置信息呢?要想解決這個問題,就需要了解繪制柱狀圖plt.bar()中的兩個參數(shù):x和width。

x:用于控制主體應該繪制在哪
width:柱狀體的寬度

有了這兩個參數(shù),便可以知道柱體右側(cè)的位置信息了:x+width

寫一份簡單的代碼示意一下:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = [u'SimHei'] 
plt.rcParams['axes.unicode_minus'] = False

boyNum=[2, 3, 4]
girlNum=[4, 5, 6]

width=0.4
plt.bar([i for i in range(len(boyNum))], boyNum, width=width, label='男生')
plt.bar([i+width for i in range(len(boyNum))], girlNum, width=width, label='女生')

plt.legend()
plt.show()

結(jié)果:
在這里插入圖片描述
這里主要關注這兩行代碼:

plt.bar([i for i in range(len(boyNum))], boyNum, width=width, label='男生')
plt.bar([i+width for i in range(len(boyNum))], girlNum, width=width, label='女生')

第一行代碼是繪制男生系列柱狀體,它的位置是:[0, 1, 2],寬度width為0.4
第二行代碼是繪制女生系列柱狀體,它的位置是:[0+0.4, 1+0.4, 2+0.4],寬度仍為0.4

二、雙柱狀圖的完善

1. 增加圖片標題

plt.title('各班級人數(shù)')

結(jié)果:
在這里插入圖片描述

2. 增加x軸y軸標題

plt.bar([i for i in range(len(boyNum))], boyNum, width=width, label='男生')
plt.bar([i+width for i in range(len(boyNum))], girlNum, width=width, label='女生')

結(jié)果:
在這里插入圖片描述

3. 增加x軸注釋

我們希望在每兩個柱狀圖中間寫上類似:班級一,班級二等,就像這樣:

在這里插入圖片描述
那么如何保證注釋在兩個柱狀體之間呢?仔細觀察可以發(fā)現(xiàn),注釋所在的位置=第一個系列柱體所在的位置+1/2*width

因此,可以使用如下代碼解決:

plt.xticks([x+width/2 for x in range(3)], ['班級1', '班級2', '班級3'])

最終的效果圖:

在這里插入圖片描述

四、完整代碼

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = [u"SimHei"] 
plt.rcParams["axes.unicode_minus"] = False

totalWidth=0.8 # 一組柱狀體的寬度
labelNums=2 # 一組有兩種類別(例如:男生、女生)
barWidth=totalWidth/labelNums # 單個柱體的寬度
seriesNums=3 # 一共有3組(例如:3個班級)

plt.bar([x for x in range(seriesNums)], height=[4,5,6], label="男生", width=barWidth)
plt.bar([x+barWidth for x in range(seriesNums)], height=[2,3,4], label="女生", width=barWidth)

plt.xticks([x+barWidth/2*(labelNums-1) for x in range(seriesNums)], ["班級1","班級2","班級3"])
plt.xlabel("班級")
plt.ylabel("人數(shù)")
plt.title("班級人數(shù)占比")
plt.legend()
plt.show()

堆積柱狀圖

一、堆積柱狀圖的繪制原理

如何使用matplotlib繪制簡單的柱狀圖,例如:

import matplotlib.pyplot as plt

plt.bar([1,2,3],[4,5,6])
plt.show()

結(jié)果:
在這里插入圖片描述
但是當數(shù)據(jù)分組分類別的時候例如我們想繪制一下每個班級的男女生人數(shù)的時候,我們往往想出來類似這樣的效果:
在這里插入圖片描述
那么這種圖是怎么做的呢?其實它還是基于plt.bar(),但是更改了部分參數(shù)。

二、plt.bar參數(shù)介紹

讓我們直接看一下matplotlib官方文檔【1】是怎么介紹plt.bar()的參數(shù)的:

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, , align='center', data=None, *kwargs)

這里詳細介紹bottom參數(shù)(堆積柱狀圖就是基于此參數(shù)):

bottom: float or array-like, default: 0

The y coordinate(s) of the bars bases

翻譯成中文是什么意思呢?就是說,我們的每一個“柱子”的高度是從y軸的哪一個值開始往上長。還不明白?沒關系,還是以班級男女為例:
一開始我們畫了一個bar為各班級男性人數(shù):[4,5,6],現(xiàn)在我們再畫一個女生bar,但是這次女生bar不再是從0開始,而是分別從[4,5,6]開始,即:

bar1=plt.bar([1,2,3],[4,5,6], label='男生')
bar2=plt.bar([1,2,3],[1,2,3],color='g',bottom=[4,5,6], label='女生')

三、完整代碼:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = [u'SimHei'] 
plt.rcParams['axes.unicode_minus'] = False
bar1=plt.bar([1,2,3],[4,5,6], label='男生')
bar2=plt.bar([1,2,3],[1,2,3],color='g',bottom=[4,5,6], label='女生')
plt.xticks([1,2,3], ['班級1', '班級2', '班級3'])
plt.xlabel('班級')
plt.ylabel('人數(shù)')
plt.title('各班級男女人數(shù)對比')
plt.legend()
plt.show()

原文鏈接:https://blog.csdn.net/weixin_39589455/article/details/127938201

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新