Matplotlibのヒストグラム#
公開日
Matplotlibでヒストグラムを出力するには、ax.hist
を使用します。ax.hist
の最初の引数に表示するデータを配列で与えます。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(seed=0)
x = np.random.normal(10, 5, 100) # 平均10, 標準偏差5の正規分布で100点のデータを生成
fig, ax = plt.subplots()
ax.hist(x)
plt.show()
![../_images/41b8c2008baf3b8b31e7abb330c9d1b1768f6972ffaf4d002ad12c3198f16e57.png](../_images/41b8c2008baf3b8b31e7abb330c9d1b1768f6972ffaf4d002ad12c3198f16e57.png)
表示する棒の数はbins
オプションで指定できます(デフォルトは10
)。
fig, ax = plt.subplots()
ax.hist(x, bins=5)
plt.show()
![../_images/f97e146173c041b2270182790561ef25c0f52cf9187001f93c50869631b63f09.png](../_images/f97e146173c041b2270182790561ef25c0f52cf9187001f93c50869631b63f09.png)
棒の太さ・色を変更する#
棒の太さはrwidth
オプションで指定できます。0から1の範囲を取り、値が小さいほど細くなります。
fig, ax = plt.subplots()
ax.hist(x, rwidth=0.2)
plt.show()
![../_images/ee6111f866e98dfaa9a0bcde33605488ca566f5c9c5dd87cdf732bbb92902852.png](../_images/ee6111f866e98dfaa9a0bcde33605488ca566f5c9c5dd87cdf732bbb92902852.png)
棒の色はcolor
オプションで指定できます。color
オプションの詳細は以下の記事を参考にして下さい。
fig, ax = plt.subplots()
ax.hist(x, color="green")
plt.show()
![../_images/a59881562a087fba92f69441617a985697bdea785ecfff16a7ee04fd9ef9a680.png](../_images/a59881562a087fba92f69441617a985697bdea785ecfff16a7ee04fd9ef9a680.png)
また、alpha
オプションで透明度を変更できます。0
から1
の範囲を取り、値が小さいほど透明に近づきます。
fig, ax = plt.subplots()
ax.hist(x, color="green", alpha=0.5)
plt.show()
![../_images/93d26d9950d20a1dfe6d1368ccd98bb0ab58ae8f589234a22c1528fe4c57fa60.png](../_images/93d26d9950d20a1dfe6d1368ccd98bb0ab58ae8f589234a22c1528fe4c57fa60.png)
表示範囲#
表示範囲はrange
オプションで指定できます。最小値と最大値の順にタプルで与えます。range
の外側にあるデータは無視されます。
fig, ax = plt.subplots()
ax.hist(x, range=(5, 15))
plt.show()
![../_images/73f15b2beba8c1b0d0ecefdb86606ee97f99618cca40ae012b5357ea809ee9d7.png](../_images/73f15b2beba8c1b0d0ecefdb86606ee97f99618cca40ae012b5357ea809ee9d7.png)
正規化#
density
オプションをTrue
にすると、合計面積(棒の横幅×縦の長さの合計)が1になるように正規化されます。
fig, ax = plt.subplots()
ax.hist(x, density=True)
plt.show()
![../_images/8d1b4ff3f1e2c00af4d08c00d0101c042742dca3af8ea25f6da072e8c82cf2b9.png](../_images/8d1b4ff3f1e2c00af4d08c00d0101c042742dca3af8ea25f6da072e8c82cf2b9.png)
累積値#
ヒストグラムを小さい値からの累積値で表示する場合、cumulative
オプションをTrue
に指定します。反対に、大きい値からの累積値で表示する場合、cumulative
を-1
に指定します。
fig, ax = plt.subplots()
ax.hist(x, cumulative=True)
plt.show()
![../_images/fd8ef332cb5f0aef6b5652303a1ed3a390a7a6af550a7d3eecddf295f66aba97.png](../_images/fd8ef332cb5f0aef6b5652303a1ed3a390a7a6af550a7d3eecddf295f66aba97.png)
fig, ax = plt.subplots()
ax.hist(x, cumulative=-1)
plt.show()
![../_images/4499d498fdf54540ce2600b56cee6325155f4c33927ea55fccf19452a44227ff.png](../_images/4499d498fdf54540ce2600b56cee6325155f4c33927ea55fccf19452a44227ff.png)
線のみのヒストグラム#
histtype
オプションを"step"
にすることで、塗り潰しをしない線のみのヒストグラムになります。
fig, ax = plt.subplots()
ax.hist(x, histtype="step")
plt.show()
![../_images/c81a4fcaf59449120a0cd6d9009374dea56de7f6ee1cafd82742bc9c87beb019.png](../_images/c81a4fcaf59449120a0cd6d9009374dea56de7f6ee1cafd82742bc9c87beb019.png)
横向きのヒストグラム#
orientation
オプションをTrue
にすることで、ヒストグラムが横向きになります。
fig, ax = plt.subplots()
ax.hist(x, orientation="horizontal")
plt.show()
![../_images/b7c23b731567f24b54e2fc7df64c899fc6ea1a6f1317fa46f638b7c34b58c0fc.png](../_images/b7c23b731567f24b54e2fc7df64c899fc6ea1a6f1317fa46f638b7c34b58c0fc.png)
縦軸を対数にする#
log
オプションをTrue
とすることで、縦軸を対数表示できます。
fig, ax = plt.subplots()
ax.hist(x, log=True)
plt.show()
![../_images/fd6027b2a71d5429d68a3d7c8b96daee247c6cd00d13f34787a3e35b5f181bea.png](../_images/fd6027b2a71d5429d68a3d7c8b96daee247c6cd00d13f34787a3e35b5f181bea.png)
複数系列のヒストグラム#
複数系列のデータからヒストグラムを作成する方法を示します。
横に並べる#
まず、単純に棒を横に並べる例です。ax.hist
に複数のデータをリストで渡します。
np.random.seed(seed=0)
x1 = np.random.normal(10, 5, 100) # 平均10, 標準偏差5の正規分布で100点のデータを生成
x2 = np.random.normal(20, 10, 100) # 平均20, 標準偏差10の正規分布で100点のデータを生成
fig, ax = plt.subplots()
ax.hist([x1, x2])
ax.legend(["x1", "x2"])
plt.show()
![../_images/0bf4eb29c899efe31b94ad7604b7f9e4eac3fb9511bf18e00800c3c792cf0636.png](../_images/0bf4eb29c899efe31b94ad7604b7f9e4eac3fb9511bf18e00800c3c792cf0636.png)
透過させて重ねる#
alpha
オプションを使って棒を透過させ、重ねて表示することも可能です。
fig, ax = plt.subplots()
ax.hist(x1, alpha=0.5, label="x1")
ax.hist(x2, alpha=0.5, label="x2")
ax.legend()
plt.show()
![../_images/be44798da9dee6c85ca91e8806c4650230bf2375912e16b4602e298f03eba63c.png](../_images/be44798da9dee6c85ca91e8806c4650230bf2375912e16b4602e298f03eba63c.png)
積み上げる#
ヒストグラムを積み上げる場合、histtype="barstacked"
とするか、stacked=True
とします。
fig, ax = plt.subplots()
ax.hist([x1, x2], histtype="barstacked")
# ax.hist([x1, x2], stacked=True) # これも同じ結果になる
ax.legend(["x1", "x2"])
plt.show()
![../_images/62d6381a03f1eb6e844c1b77778367fa841a30cad82e352fa31edd080e47698d.png](../_images/62d6381a03f1eb6e844c1b77778367fa841a30cad82e352fa31edd080e47698d.png)