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

表示する棒の数はbinsオプションで指定できます(デフォルトは10)。

fig, ax = plt.subplots()
ax.hist(x, bins=5)
plt.show()
../_images/f97e146173c041b2270182790561ef25c0f52cf9187001f93c50869631b63f09.png

棒の太さ・色を変更する#

棒の太さはrwidthオプションで指定できます。0から1の範囲を取り、値が小さいほど細くなります。

fig, ax = plt.subplots()
ax.hist(x, rwidth=0.2)
plt.show()
../_images/ee6111f866e98dfaa9a0bcde33605488ca566f5c9c5dd87cdf732bbb92902852.png

棒の色はcolorオプションで指定できます。colorオプションの詳細は以下の記事を参考にして下さい。

Matplotlib 色の書式

fig, ax = plt.subplots()
ax.hist(x, color="green")
plt.show()
../_images/a59881562a087fba92f69441617a985697bdea785ecfff16a7ee04fd9ef9a680.png

また、alphaオプションで透明度を変更できます。0から1の範囲を取り、値が小さいほど透明に近づきます。

fig, ax = plt.subplots()
ax.hist(x, color="green", alpha=0.5)
plt.show()
../_images/93d26d9950d20a1dfe6d1368ccd98bb0ab58ae8f589234a22c1528fe4c57fa60.png

表示範囲#

表示範囲はrangeオプションで指定できます。最小値と最大値の順にタプルで与えます。rangeの外側にあるデータは無視されます。

fig, ax = plt.subplots()
ax.hist(x, range=(5, 15))
plt.show()
../_images/73f15b2beba8c1b0d0ecefdb86606ee97f99618cca40ae012b5357ea809ee9d7.png

正規化#

densityオプションをTrueにすると、合計面積(棒の横幅×縦の長さの合計)が1になるように正規化されます。

fig, ax = plt.subplots()
ax.hist(x, density=True)
plt.show()
../_images/8d1b4ff3f1e2c00af4d08c00d0101c042742dca3af8ea25f6da072e8c82cf2b9.png

累積値#

ヒストグラムを小さい値からの累積値で表示する場合、cumulativeオプションをTrueに指定します。反対に、大きい値からの累積値で表示する場合、cumulative-1に指定します。

fig, ax = plt.subplots()
ax.hist(x, cumulative=True)
plt.show()
../_images/fd8ef332cb5f0aef6b5652303a1ed3a390a7a6af550a7d3eecddf295f66aba97.png
fig, ax = plt.subplots()
ax.hist(x, cumulative=-1)
plt.show()
../_images/4499d498fdf54540ce2600b56cee6325155f4c33927ea55fccf19452a44227ff.png

線のみのヒストグラム#

histtypeオプションを"step"にすることで、塗り潰しをしない線のみのヒストグラムになります。

fig, ax = plt.subplots()
ax.hist(x, histtype="step")
plt.show()
../_images/c81a4fcaf59449120a0cd6d9009374dea56de7f6ee1cafd82742bc9c87beb019.png

横向きのヒストグラム#

orientationオプションをTrueにすることで、ヒストグラムが横向きになります。

fig, ax = plt.subplots()
ax.hist(x, orientation="horizontal")
plt.show()
../_images/b7c23b731567f24b54e2fc7df64c899fc6ea1a6f1317fa46f638b7c34b58c0fc.png

縦軸を対数にする#

logオプションをTrueとすることで、縦軸を対数表示できます。

fig, ax = plt.subplots()
ax.hist(x, log=True)
plt.show()
../_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

透過させて重ねる#

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

積み上げる#

ヒストグラムを積み上げる場合、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