matplotlib

【matplotlib】ヒストグラムの描画方法 ~ hist, hist2d, hexbin ~

【matplotlib】ヒストグラムの描画方法 _ hist, hist2d, hexbin _

Pythonによるデータ分析をする際にグラフなどの可視化でよく利用されるmatplotlibヒストグラムを描画する方法について解説します。

ヒストグラムの描画方法

matplotlibでヒストグラムを描画する際のメソッドとしては、hist, hist2d, hexbinといったメソッドがあります。それぞれの使い方を以降で解説します。

histによるヒストグラムの描画

基本的な使い方

histメソッドを用いてヒストグラムを表示する場合には、以下の例のように使用します。

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('seaborn-whitegrid')

# 正規分布に従うデータの生成
d = np.random.randn(1000)

# ヒストグラムの表示
plt.hist(d)

plt.show()
matplotlib hist ヒストグラム

この例では、標準正規分布に従うデータ点をnp.random.randnメソッドで1,000点用意して、当該データに対するヒストグラムを表示しています。以降正規分布をベースに紹介しますが、データの種類はどういった入力でも構いません。

ヒストグラムのカスタマイズ

一般的な使い方では、各値の階級(これをビン(bins)と言います。)の数などは自動で設定されます。これらの値を設定したい場合には、histの引数として以下の例のように各値を入れることでヒストグラムの描画の見た目を変えることができます。

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('seaborn-whitegrid')

# 正規分布に従うデータの生成
d = np.random.randn(1000)

# ヒストグラムの表示(各種設定)
plt.hist(d, bins=30, color='red', edgecolor='k', alpha=0.5)

plt.show()
matplotlib hist ヒストグラム パラメータ

この例では、階級(bins)の数を30と設定し、色(color)を赤、枠線(edgecolor)を黒、色の透過度(alpha)を0.5として表示してみています。色々なパラメータについては、histメソッドのドキュメントを確認してみてください。

Note

histメソッドの公式ドキュメントはこちらを参照してください。

複数のヒストグラムを同時に描画

色々なデータの分析をしていると、複数のデータセットを重ねて描画して、各分布の違いを比較したい場合があります。複数のヒストグラムを同時に描画したい場合には以下の例のように実行することができます。

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('seaborn-whitegrid')

# 正規分布に従うデータを複数生成
# 平均0, 標準偏差1
d1 = np.random.normal(0, 1, 1000)
# 平均-2, 標準偏差0.5
d2 = np.random.normal(-2, 0.5, 1000)
# 平均5, 標準偏差3
d3 = np.random.normal(5, 3, 1000)

# 設定値の作成
kwargs = dict(bins=30, alpha=0.5, histtype='stepfilled', edgecolor='k')

# ヒストグラムの表示
plt.hist(d1, **kwargs)
plt.hist(d2, **kwargs)
plt.hist(d3, **kwargs)

plt.show()
matplotlib hist 複数ヒストグラム 重ねる

この例では、平均や標準偏差が異なるランダムなデータを生成して各ヒストグラムを表示しています。

結局やっていることは連続でhistメソッドを実行しているだけです。ただ、透過率(alpha)を指定しないと各グラフが見えなくなってしまうため、透過度を設定して各グラフの重なりが分かるようにしています。

設定値を毎回同じような記載するのが面倒なのでkwargsという辞書にまとめて、histメソッドの引数として渡しています。各ヒストグラムでそれぞれ見た目を変えたい場合は、histメソッドにそれぞれパラメータを設定してください。

hist2dによる2次元ヒストグラムの描画

2次元のヒストグラムを描画したい場合には、hist2dメソッドを使用します。hist2dメソッドを用いて2次元ヒストグラムを表示する場合には、以下の例のように使用します。

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('seaborn-whitegrid')

# 2次元正規分布の平均と共分散を定義
# 平均
m = [0, 0]
# 共分散
cov = [[1, 1], [1, 2]]
# データの生成
x, y = np.random.multivariate_normal(m, cov, 1000).T

# 2次元ヒストグラムの表示
plt.hist2d(x, y, bins=30, cmap='Purples')
plt.colorbar()

plt.show()
matplotlib hist2d 二次元ヒストグラム

この例では、2次元正規分布に従うデータをnp.random.multivariate_normalメソッドで生成しています。生成するために、平均(m)と共分散(cov)を定義して引数として渡しています。

2次元ヒストグラムは色の濃いところが数が多いことを表していて、イメージとしては画面の手前側にバーが伸びているようなイメージをしてもらえると分かるかと思います。

Note

hist2dメソッドの公式ドキュメントはこちらを参照してください。

hexbinによる2次元の六角形ヒストグラム描画

hist2dによる2次元ヒストグラムでは、各グリッドを四角形で表現していました。もう一つの表現方法として各グリッドを六角形で表現する方法があります。六角形で2次元ヒストグラムを表示するには、hexbinメソッドを使用します。

hexbinメソッドを用いて2次元ヒストグラムを表示する場合には、以下の例のように使用します。

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('seaborn-whitegrid')

# 2次元正規分布の平均と共分散を定義
# 平均
m = [0, 0]
# 共分散
cov = [[1, 1], [1, 2]]
# データの生成
x, y = np.random.multivariate_normal(m, cov, 1000).T

# 六角形での2次元ヒストグラムの表示
plt.hexbin(x, y, gridsize=30, cmap='Purples')
plt.colorbar()

plt.show()
matplotlib hexbin 二次元ヒストグラム 六角形
Note

hexbinメソッドの公式ドキュメントはこちらを参照してください。

NumPy, pandas, matplotlib, scikit-learnといったデータ分析関連パッケージについて体系的に習得したい場合は「Pythonデータサイエンスハンドブック」が大変おすすめです。
matplotlibに関する使い方も豊富に掲載されていますので手元に置いておくと便利です。是非購入を検討してみてください。