【Matplotlib】ヒストグラムを表示する方法 (hist, hist2d, PercentFormatter)

ヒストグラムの作成に戸惑っていませんか?データの分布やパターンを理解するために,正確なヒストグラムを作成することが重要です

縦軸に度数,横軸に階級をとる統計グラフの1種で,柱状図,度数分布図とも呼ばれます

この記事では,Matplotlibのhist,hist2d,PercentFormatterなどの機能を使って,正確なヒストグラムを簡単に作成する方法を解説します。

読み終えた後は,自身のデータに合わせてヒストグラムを作成できるようになります。データの頻度や密度の傾向を把握し,重要な特性を発見することができます。

目次

一般的なヒストグラム (Axes.hist)

ヒストグラムの描画にはAxes.hist関数の第1引数に1次元配列を指定します

Axes.hist
引数
  • x (配列) : 入力値.データの座標を配列で指定します
  • bins (int or 配列) : intであれば範囲内の同じ幅のビンの数を定義.配列であれば左端と右端を含むようにビンの数を定義
  • range (配列) : ビンの下限と上限の範囲
  • density (bool) : True の場合,確率密度を描画
  • bottom (数値 or 配列) : 各ビンの底の位置
  • histtype (文字列) : bar‘, ‘barstacked‘, ‘step’, ‘stepfilled’のいずれかでグラフの種類が変化.詳しくは下記を参照してください
  • align (文字列) : ‘left’, ‘mid’, ‘right’のいずれかでヒストグラムの水平方向の並びを指定します
  • orientation (文字列) : ‘vertical’, ‘horizontal’のいずれかでヒストグラムの方向を垂直か水平に変更します
  • stacked (bool) : True の場合,複数のデータを重ねて表示します
返値
  • n (配列) : ヒストグラムのビンの値
  • bins (配列) : ビンのエッジ.長さは nbins + 1.常に1つの配列です
  • patches (BarContainer or Polygonのリスト) : ヒストグラムを作成するために使用されるオブジェクト
公式ドキュメント

下記のタブにコードとフローチャートの解説をしています

# step1 再現性のある乱数発生器を作成
rng = np.random.default_rng(19680801)

# step2 データの生成
N_points = 100000
n_bins = 20
dist1 = rng.standard_normal(N_points)

# step3 グラフフレームを作成
fig, ax = plt.subplots()

# step4 ヒストグラムを描画
ax.hist(dist1, bins=n_bins)
ax.set_xlabel('X label')
ax.set_ylabel('Y label')
ax.set_title(r'A Simple Histogram')

plt.show()

度数ごとに色分けされたヒストグラム

ヒストグラムを度数に応じて色分けを行い,わかりやすくします

下記のタブにコードとフローチャートの解説をしています

# step4 ヒストグラムを描画
# Nは各ビン数,binsはビンの下限値
N, bins, patches = ax.hist(dist1, bins=n_bins)

# step5 色設定のための準備
# 高さで色分け
fracs = N / N.max()
# カラーマップの全範囲でデータを0〜1に正規化
norm = colors.Normalize(fracs.min(), fracs.max())

# step6 色の設定
# オブジェクトをループして,それぞれの色を設定
for thisfrac, thispatch in zip(fracs, patches):
    color = plt.cm.viridis(norm(thisfrac))
    thispatch.set_facecolor(color)

plt.show()
出典元:Matplotlib

2次元のヒストグラム (Axes.hist2d)

Axes.hist2d関数を用いると,2つのデータセットを使った,2次元のヒストグラムを表示できます

Axes.hist2dには配列を2つ指定します

Axes.hist2d
引数
  • x (配列) : 入力値.データの座標を配列で指定します
  • bins (int or 配列) : intであれば範囲内の同じ幅のビンの数を定義.配列であれば左端と右端を含むようにビンの数を定義
  • range (配列) : ビンの下限と上限の範囲
  • density (bool) : True の場合,確率密度を描画
返値
  • h (2次元配列) : xとyの2次元ヒストグラムオブジェクト.xの値は1次元に,yの値は2次元にヒストグラム化される
  • xedges (1次元配列) : X軸に沿ったビンの端
  • yedges (1次元配列) : Y軸に沿ったビンの端
  • image (QuadMesh) : 四辺形メッシュを効率的に描画するためのクラス
公式ドキュメント
# 2つ目の正規分布データを生成する
dist2 = 0.4 * rng.standard_normal(N_points) + 5

# step4 2次元のヒストグラムを描画
ax.hist2d(dist1, dist2)

plt.show()

縦軸をパーセントにしたヒストグラム (density)

縦軸を度数からパーセント表示にしたヒストグラムの表示方法です

Axes.hist関数でdensityをTrueにすると,確率密度となり,最大値が1になります

matplotlib.ticker.PercentFormatterでy軸をパーセント表示に置き換えています

matplotlib.ticker.PercentFormatter
引数
  • xmax (float) : パーセンテージは,x / xmax * 100として計算されます
  • decimals (int) : 小数点以下の桁数を指定
  • symbol (文字列) : ラベルに付加される文字列
  • is_latex (bool) : Falseの場合,symbolに含まれるLaTeX文字が使われます
公式ドキュメント
# step4 ヒストグラムを描画
# density=Trueにすると確率密度になります
ax.hist(dist1, bins=n_bins, density=True)

# Y軸をパーセンテージ表示にフォーマット
ax.yaxis.set_major_formatter(PercentFormatter(xmax=1))

plt.show()

階段状のヒストグラム (histtype=step)

Axes.histの引数であるhisttypeに’step’を使うと階段状のヒストグラムを作成できます

データが1次元配列の場合は,histtypeにbar, barstacked, stepfilledのいずれも同じになります

# step4 ヒストグラムを描画
ax.hist(dist1, bins=n_bins, histtype='step')

plt.show()

複数のデータセットを持つヒストグラム

複数のデータセット(2次元配列)を指定した際のヒストグラムを描画することも可能です

グラフを積み上げるか,横に並べるかの2つの方法で表現できます

2次元配列のデータには下記を使用しました

# 100000行3列の2次元配列
dist1 = rng.standard_normal(size=(N_points, 3))

データセットを横に並べる (histtype=bar)

histtypeにbarを指定(デフォルト)すると,横にデータセットが並びます

# step4 ヒストグラムを描画
ax.hist(dist1, bins=n_bins)

plt.show()

塗りつぶしてデータを積み重ねる (histtype=barstacked)

histtypeにbarstackedを指定すると,データセットが積み重なります

# step4 ヒストグラムを描画
ax.hist(dist1, bins=n_bins, histtype='barstacked')

plt.show()

塗りつぶさずにデータセットを積み重ねる (stacked)

histtypeにstepを指定してstacked=Trueとすると,塗りつぶさずにデータセットが積み重なります

# step4 ヒストグラムを描画
ax.hist(dist1, bins=n_bins, histtype='step', stacked=True)

plt.show()

参考文献

ヒストグラムの基本

ヒストグラムの種類の設定(histtype)

複数のデータを持ったヒストグラム

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次