Yamamoto's Laboratory
基本事項
ヒストグラム

基本事項

概要

ヒストグラム (histgram) は,ある範囲内に含まれる個数(度数)を表すプロットで,度数分布とも呼ばれます.統計量を表すプロットでおなじみにものです.matplotlib.pyplot.hist を使うと,簡単にヒストグラムが作成できます.

とりあえずプロット

ヒストグラムプロットの例(normal_dist.py)

001   # -*- coding:utf-8 -*-
002   import numpy as np
003   import matplotlib.pyplot as plt
004   
005   # ----- 条件設定 -----
006   mu, sigma = 2.0, 2.0
007   N = 10000                # サンプル数
008   Nb = 100                 # ヒストグラムプロットのビン数
009   min_x, max_x = mu-5*sigma, mu+5*sigma
010   dx = (max_x-min_x)/Nb    # ビン幅
011   
012   # ----- データ(正規分布乱数)の生成 -----
013   s = np.random.normal(mu, sigma, N)
014   
015   # ----- プロット作成 -----
016   plt.rcParams["font.size"] = 18
017   fig    = plt.figure()
018   fig.subplots_adjust(bottom=0.12)
019   histplt = fig.add_subplot(1,1,1)
020   histplt.tick_params(axis='both', length=10,  which='major')
021   histplt.tick_params(axis='both', length=5,  which='minor')
022   histplt.set_xlim([min_x, max_x])
023   histplt.minorticks_on()
024   histplt.hist(s, Nb, range=(min_x, max_x))
025   
026   plt.show()
027   fig.savefig('hist_plot.pdf', orientation='portrait', \
028               transparent=False, bbox_inches=None, frameon=None)
029   fig.clf()

図1: ヒスとグラムは生成データ,赤線は理論値.

ヒストグラムプロットの例

統計の結果も合わせて表示

ヒストグラムプロットの例(normal_dist.py)

001   # -*- coding:utf-8 -*-
002   import numpy as np
003   import matplotlib.pyplot as plt
004   
005   # ----- 条件設定 -----
006   mu, sigma = 2.0, 2.0
007   N = 10000                # サンプル数
008   Nb = 100                 # ヒストグラムプロットのビン数
009   min_x, max_x = mu-5*sigma, mu+5*sigma
010   dx = (max_x-min_x)/Nb    # ビン幅
011   
012   # ----- データ(正規分布乱数)の生成 -----
013   s = np.random.normal(mu, sigma, N)
014   
015   # ----- プロット作成 -----
016   plt.rcParams["font.size"] = 18
017   fig    = plt.figure()
018   fig.subplots_adjust(bottom=0.12)
019   histplt = fig.add_subplot(1,1,1)
020   histplt.tick_params(axis='both', length=10,  which='major')
021   histplt.tick_params(axis='both', length=5,  which='minor')
022   histplt.set_xlim([min_x, max_x])
023   histplt.minorticks_on()
024   histplt.hist(s, Nb, range=(min_x, max_x))
025   
026   plt.show()
027   fig.savefig('hist_plot.pdf', orientation='portrait', \
028               transparent=False, bbox_inches=None, frameon=None)
029   fig.clf()

図2: ヒスとグラムは生成データ,赤線は理論値.

複数のヒストグラム

複数の分布のヒストグラムプロット(normal_dist.py)

001   # -*- coding:utf-8 -*-
002   import numpy as np
003   import matplotlib.pyplot as plt
004   
005   
006   # ----- データ(正規分布乱数)の生成 -----
007   s = [np.random.normal(-2, 2, 10000), \
008        np.random.normal(2, 2, 3000),\
009        np.random.normal(5, 0.5, 2000)]
010   
011   # ----- プロット作成 -----
012   min_x, max_x = -10, 10
013   
014   plt.rcParams["font.size"] = 18
015   fig    = plt.figure()
016   fig.subplots_adjust(bottom=0.12)
017   histplt = fig.add_subplot(1,1,1)
018   histplt.tick_params(axis='both', length=10,  which='major')
019   histplt.tick_params(axis='both', length=5,  which='minor')
020   histplt.set_xlim([min_x, max_x])
021   histplt.minorticks_on()
022   kwargs = {'edgecolor':(1,1,1,0)} 
023   histplt.hist(s, bins=50, color=['r', 'g', 'b'], range=(min_x, max_x), **kwargs)
024   
025   plt.show()
026   fig.savefig('multi_dist.pdf', orientation='portrait', \
027               transparent=False, bbox_inches=None, frameon=None)
028   fig.clf()

図3: ヒスとグラムは生成データ,赤線は理論値.

分布図とヒストグラム

散布図とヒストグラム(scatter_hist.py)

001   # -*- coding:utf-8 -*-
002   import numpy as np
003   import matplotlib.pyplot as plt
004   from scipy.stats import gaussian_kde
005   
006   # ----- プロットデータの作成 -----
007   Nd = 5000        # データ数
008   Nb = 100          # ビンの数
009   min_x, max_x = min_y, max_y = -10, 10
010   x0 = np.random.normal(0, 2, Nd)
011   y0 = np.random.normal(0, 2, Nd)-x0**2+7
012   x =  x0*np.cos(np.pi/4) + y0*np.sin(np.pi/4)
013   y = -x0*np.sin(np.pi/4) + y0*np.cos(np.pi/4)
014   
015   # ----- プロットの設定 -----
016   sc_bottom  = sc_left   = 0.1
017   sc_width   = sc_height = 0.65
018   space      = 0.01
019   hst_height = 0.2
020   max_hist   = 200
021   
022   # ----- プロットの作成準備 -----
023   fig = plt.figure(1, figsize=(8, 8))
024   plt.rcParams["font.size"] = 18
025   
026   # ----- 色付き散布図 -----
027   PltScatter = plt.axes([0.1, 0.1, 0.65, 0.65])
028   xy = np.vstack([x,y])
029   z = gaussian_kde(xy)(xy)
030   idx = z.argsort()
031   x, y, z = x[idx], y[idx], z[idx]
032   PltScatter.set_xlim(-10, 10)
033   PltScatter.set_ylim(-10, 10)
034   PltScatter.tick_params(axis='both', length=10, which='major')
035   PltScatter.tick_params(axis='both', length=5,  which='minor')
036   PltScatter.minorticks_on()
037   PltScatter.scatter(x, y, c=z, marker='o', s=10, edgecolor='')
038   
039   # ----- 度数分布(上)のプロット -----
040   PltHistx   = plt.axes([sc_left, sc_bottom + sc_height + space,\
041                          sc_width, hst_height])
042   PltHistx.set_ylim(0, max_hist)
043   PltHistx.set_xticklabels([])
044   PltHistx.set_yticklabels([])
045   PltHistx.hist(x, bins=Nb, histtype='stepfilled', range=(min_x, max_x))
046   
047   # ----- 度数分布(左)のプロット -----
048   PltHisty   = plt.axes([sc_left + sc_width + space, sc_bottom,\
049                          hst_height,  sc_width])
050   PltHisty.set_xlim(0, max_hist)
051   PltHisty.set_xticklabels([])
052   PltHisty.set_yticklabels([])
053   PltHisty.hist(y, bins=Nb, histtype='stepfilled', range=(min_x, max_x), \
054                 orientation='horizontal')
055   
056   # ----- プロットの表示とファイルの保存 -----
057   plt.show()
058   fig.savefig('scatter_hist.pdf', orientation='portrait', \
059               transparent=False, bbox_inches=None, frameon=None)
060   fig.clf()

図4: 散布図とヒストグラム.

matplotlib の hist のより深い情報

ここでは,hist() の引数の説明を行います.詳細は「matplotlib.pyplot.hist — Matplotlib 2.0.2.post4657+g225a4a0 documentation」にかかれており,これを適当に訳し,筆者なりの解説を追加しています.

matplotlib.pyplot.hist(
      x, bins=None, range=None, normed=False, weights=None, cumulative=False, 
      bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None,
      log=False, color=None, label=None, stacked=False, hold=None,
      data=None, **kwargs)
引数
x : (n,) array or sequence of (n,) arrays
入力データです.単一の配列,あるいは配列のシーケンスです.配列のシーケンスの場合,そのサイズは同一である必要はありません.
bins: integer or array_like or 'auto', optional
プロットするビンの数で,エッジ数は numpy.histogram() と矛盾しない bins+1 です.ビンがシーケンスの場合,それはエッジの座標になります..
range: tuple or None, optional
ヒストグラムプロットのビンの下側と上側の範囲を示します.データの下限値と上限値は無視されます.指定しない場合,範囲は (x.min(), x.max()) です.ビンがシーケンスの場合,ここでの指定の範囲は無視されます.デフォルトは None です.
normed: boolean, optional
Trueの場合,戻りタプルの最初の要素(各ビンの度数)は、確率密度を形成するために正規化されたカウントになります.つまり,ヒストグラムの下の面積(または積分)は 1 になります.cumulative が True の場合、ヒストグラムの合計は 1 に正規化されます.デフォルトは False です.
weights: (n,) array_like or None, optional
入力データ x と同じ形の重みの配列.normed が True の場合,密度の積分が1になるように,重みが正規化されます.デフォルトは None (重み無し) です.
cumulative: boolean, optional
True の場合,積算になります.最後のビンは総和を表します.
bottom: array_like, scalar, or None
各ビンの底部ベースラインの位置.スカラーの場合,各ビンのベースラインは同じ量だけシフトします.配列の場合,各ビンは独立してシフトし,bottom サイズはビンの数と一致する必要があります.デフォルトは None で,0 を表します.
histtype: {'bar', 'barstacked', 'step', 'stepfilled'}, optional
ヒストグラムのタイプの設定です.
'bar' バー(棒)を使った通常のヒストグラムです.複数のデータの場合,バーは並びます.
'barstacked' バーのタイプのヒストグラムです.複数のデータのバーは積み重ねられます.
'step' 塗りつぶしをしないラインプロットでヒストグラムを表します.unfilled の場合のデフォルトです.
'stepfilled' 塗りつぶしするラインプロットでヒストグラムを表します.
デフォルトは 'bar' です.
align: {'left', 'mid', 'right'}, optional
ヒストグラムの描画の制御を行います.
'left' バーの中心は,ビンの左のエッジになります.
'mid' バーの中心は,ビンのエッジの間になります.
'right' バーの中心は,ビンの右のエッジになります.
デフォルトは 'mid' です.
orientation: {‘horizontal’, ‘vertical’}, optional
If ‘horizontal’, barh will be used for bar-type histograms and the bottom kwarg will be the left edges.
rwidth: scalar or None, optional
ビン幅の割合としてのバーの相対的な幅 (relative width) を指定します.None の場合は自動的にビン幅を計算します.histtype が 'step' または 'stepfilled' の場合は無視されます.デフォルトは None です.
log: boolean, optional
True の場合,ヒストグラム軸 (縦軸) は対数スケールになります.空のビンは,対数スケールで表示不可能なので,除外されます.戻り値は空でない (n, ビン, パッチ) だけになります.デフォルトは False です.
color: color or array_like of colors or None, optional
データセット毎に,カラー仕様またはカラー仕様のシーケンスを指定します.デフォルトは None で,標準のラインカラーシーケンスが使用されます.
label: string or None, optional
文字列、または複数のデータセットに一致する文字列。 棒グラフはデータセットごとに複数のパッチを生成しますが、最初のラベルのみがラベルを取得するため、凡例コマンドは期待通りに機能します。 デフォルトはNone.
stacked: boolean, optional
Trueの場合、複数のデータが重なり合っています。Falseの場合、histtypeが 'bar'の場合は複数のデータが並んで配置され、histtypeが 'step'の場合は互いの上に並べられます。デフォルトはFalseです。
**kwargs
キーワード引数です,辞書型のオブジェクト kwargs をアンパックし,プロットの特性を指定します.
戻り値
n: array or list of arrays
ヒストグラムのビンの値 (各ビン幅に含まれるデータの数),データの型は「<class 'numpy.ndarray'>」です.normed が True の場合は規格化された値になります.また,cumulative = True の場合は,積み重ねの値になります.
bins: array
ビンのエッジの座標の配列,データの型は「<class 'numpy.ndarray'>」です.データの数はビンの数 +1 になります.
patches: list or list of lists
複数の入力データセットの場合,そのリストのヒストグラムまたはリストを作成するために使用される個々のパッチのサイレントリスト (直訳: 意味不明).データの型は,「<class 'matplotlib.cbook.silent_list'>」です.

ページ作成情報

参考資料

  1. メソッドの引数の説明は,>matplotlib.pyplot.hist — Matplotlib 2.0.2.post4657+g225a4a0 documentationにかかれています.
  2. 参考2の説明

更新履歴

2017年08月18日 新規作成


no counter