Python matplotlib 畫圖 – 柱狀圖 (長條圖)

應用篇

這篇文章是要介紹如何使用matplotlib來畫柱狀圖。如果對於figure, axes有不了解的地方的話可以先看看下面的文章。

Python matplotlib繪圖:figure和axes

柱狀圖的基礎

簡單的例

首先,我們先從製作一個最簡單的sample開始。下面的sample中,我們先製作平均是0,標準差是10的亂數1000個,接著把它做成柱狀圖。

import matplotlib.pyplot as plt
import numpy as np

# 製作平均是0,標準差是10的亂數1000個
x = np.random.normal(0, 10, 1000)

# 製作figure
fig = plt.figure()

# 設定ax
ax = fig.add_subplot(1, 1, 1)

# 在axes上畫圖
ax.hist(x, bins=10)

# show
plt.show()

結果

Option

在完成最簡單的sample之後,我們來看看追加的option。下面是hist()的追加選項。

axes.hist(x, bins, range, density, cumulative, color, ec, alpha)

Parameter 說明
x(必須)數據的順序
bins柱狀圖數量的最小單位,default是10
range設定顯示的範圍(指定最大和最小)
densityTrue的話面積會面成1(default是False)
cumulativeTrue的話會累積(default是False)
color顏色
ec柱狀圖邊筐的顏色
alpha透明度(0~1, 0 : 完全透明, 1 : 不透明

接著,我們利用上面的option來試著製作各式各樣的柱狀圖吧!

bins

當不指定bins時他的default數值是10,跟橫軸的最小單位一樣,因此每一個單位會有一個柱狀圖。當我們把bins設定成20時,橫軸的每一個最小單位中便會有兩個柱狀圖。

ax.hist(x, bins=20)

結果

Density

將Density設定成True的話,柱狀圖的總面積就會變成1。因此當sample的數據非常多並且bins也設定相當高的話,柱狀圖就會和機率密度函數非常接近。我們可以從下面的代碼以及結果中看到,當density = True, bins = 30時,柱狀圖會和機率密度函數非常接近。

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm

# 製作平均是0,標準差是10的亂數1000個
x = np.random.normal(0, 10, 1000)

# 製作figure
fig = plt.figure()

# 設定ax
ax = fig.add_subplot(1, 1, 1)

# 在axes上畫圖
ax.hist(x, bins=30, density=True)

# 製作平均是0,標準差是10的的機率密度函數
X = np.linspace(-50, 50 , 100)
Y = norm.pdf(X, loc=0, scale=10)
ax.plot(X, Y, c='red')

# show
plt.show()

結果

Cumulative 累積柱狀圖

cumulative = True時,就可以製作累積柱狀圖。

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm

# 製作平均是0,標準差是10的亂數1000個
x = np.random.normal(0, 10, 1000)

# 製作figure
fig = plt.figure()

# 設定ax
ax = fig.add_subplot(1, 1, 1)

# 在axes上畫圖
ax.hist(x, bins=30, cumulative=True)

# show
plt.show()

結果

顏色和邊線

指定color, ec的話就可以調整柱狀圖的顏色和邊線的顏色。

ax.hist(x, bins=10, color='#FF8888', ec='#33FF22')

結果

重疊以及透明度

另外,將複數個柱狀圖重疊在同一張圖上也是可以的,這時候只要調整alpha(透明度)就可以讓重疊的部分看得更清楚。

import matplotlib.pyplot as plt
import numpy as np

# data1 製作平均是0,標準差是10的亂數1000個
x1 = np.random.normal(0, 10, 1000)

# data2 製作平均是5,標準差是10的亂數1000個
x2 = np.random.normal(5, 10, 1000)

# 製作figure
fig = plt.figure()

# 設定ax
ax = fig.add_subplot(1, 1, 1)

# 在axes上畫圖
ax.hist(x1, bins=10, color='#0055FF', ec='#0000FF', alpha=0.5)
ax.hist(x2, bins=10, color='#FF8800', ec='#FF0000', alpha=0.5)

# show
plt.show()

結果

留言