這篇文章是要介紹如何使用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 | 設定顯示的範圍(指定最大和最小) |
density | True的話面積會面成1(default是False) |
cumulative | True的話會累積(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()
結果

留言