Contents
ヒストグラムとは?
ヒストグラムとは、ある特定のデータを区間ごとに区切り、 横軸にデータの区間 (階級) 、縦軸に区間に含まれるデータの個数 (度数) を設定することで、ある集団の各区間の個数や数値のばらつきといったデータの分布を棒グラフに似た形の図で表現するグラフです。
縦軸を度数とよび、棒グラフの各棒が示す値の範囲にどのくらいの数のデータがあるかを棒の高さで表示します。
ヒストグラムを作成することで、数値で集めた度数分布表を視覚的に分かりやすく表現できます。
ヒストグラムを作成するデータが数値の場合、棒グラフの各棒のことをビン(bin)と呼び、各棒が示す値の範囲をbin幅と呼んだりします。
pythonでヒストグラムを作成する方法
Python でヒストグラムを作成するには、 matplotlibライブラリのpyplot.histメソッドを使用します。seabornライブラリにもヒストグラムを作成できるメソッドは存在しますが、ここではpyplot.histメソッドを用いた作成方法をご紹介することにします。
plt.hist() を使いこなせるようになれば、綺麗なヒストグラムが簡単に作れるようになります。
主要な引数一覧を次の表にまとめました。一番右の列の既定値は、引数に何も設定しなかった場合のデフォルト値を表しています。
引数 | 説明 | 既定値 |
x | ヒストグラムを作成するための参照先の1次元配列データ。 | |
bins | ビン (階級を示す棒) の数、階級数を指定。 | 10 |
range | ビン (棒) の最小値と最大値を指定。 | x.min(), x.max() |
cumulative | Trueに設定した場合、累積値のヒストグラムを出力。 | False |
bottom | 各棒の下側の余白を数値または配列で指定。 | |
histtype | ‘bar’ (通常のヒストグラム), ‘barstacked’ (積み上げヒストグラム), ‘step’ (外枠だけのヒストグラム・塗りつぶし無し), ‘stepfilled ‘ (外枠だけのヒストグラム・塗りつぶしあり) から選択。 | bar |
align | 各ビン (棒) の中心の位置。 ‘left’, ‘mid’, ‘right’ から選択。 | mid |
orientation | ヒストグラムの方向。’horizontal’ (水平方向), ‘vertical’ (垂直方向) から選択。 | vertical |
rwidth | 各ビン (棒) の幅を数値または、配列で指定。 | |
log | Trueに設定した場合、縦軸の目盛を常用対数で表示。 | |
color | ヒストグラムの色を指定。’b’ (青) や’k’ (黒) 、’r’ (赤) 、’g’ (緑) 、’y’ (黄) 、’w’ (白) 、’c’ (シアン) 、m (マゼンタ) などから選択。色はcolor = (0.0, 0.0, 1.0)のように、RGBの各色の要素を 0.0 ~ 1.0 のタプルで指定することも可能。 | blue |
label | 凡例を表示。 | |
stacked | True に設定した場合、積み上げヒストグラムを出力。 | False |
density (normed) | Trueに設定した場合、確率密度 (相対度数) で表示。 | False |
alpha | 各ビン (棒) の透明度を0 (透明) ~1 (不透明) で指定。 | 1 |
edgecolor | 枠線の色を指定。’blue’や’red’、’green’、’yellow’などから選択。 | |
linewidth | 線の太さをptで指定。 | |
linestyle | 線のスタイルを指定。’-‘や’–‘、’-.’、’:’などから選択。 | |
rwidth | 各ビン (棒) の太さをデータ区間に対する比で指定。0~1の範囲で指定可能。 |
以下の章では、これらの引数を設定するとどのような結果が得られるのかを、入力したコードと出力されたヒストグラムを掲載しながら解説していきます。
ヒストグラムの書き方
まず、引数も何も設定せずとも得られる基本的なヒストグラムの書き方を説明していきます。
各コード一つ一つの挙動の解説については基本的には、「#」によるコメントアウトで行っていきます。
基本的なヒストグラムは以下のコードを入力することで、出力することができます。
import numpy as np
import matplotlib.pyplot as plt
x = np.random.normal(50, 10, 10000) #平均60,標準偏差10の正規分布に従う仮データを10000個作成
plt.hist(x)
plt.title(“Standard Histogram”) #タイトル変更
以下では、ヒストグラムの様々な改良方法、そのための引数の使い方について解説していきます。
ビンの数を変更
ヒストグラムのビン (階級を表す棒) の数を任意に指定したいときは、plt.hist () 関数の引数binsに指定したい階級数を入力します。
plt.hist(x, bins=50)
plt.title(“Histogram, Bins=50”)
累積ヒストグラムを出力
累積ヒストグラムを作成するには、plt.hist () 関数の引数cumulativeの論理値をTrueに変更します (デフォルトはcumulative = False) 。
plt.hist(x, cumulative=True)
plt.title(“Histogram, Cumulative=True”)
縦軸の目盛を割合に変更 ([0,1]に正規化)
縦軸の目盛を割合に変更したい場合、plt.hist () 関数の引数densityの論理値をTrueに変更します (デフォルトはdensity = False) 。
plt.hist(x, density=True)
plt.title(“Histogram, Density=True”)
縦軸の目盛を常用対数に変更
縦軸の目盛を常用対数で表示するには、plt.hist () 関数の引数logの論理値をTrueに変更します (デフォルトはlog = False) 。
plt.hist(x, log=True)
plt.title(“Histogram, log=True”)
ビン (棒) の色を変更
ビン (棒) の色を任意の色に変更したい場合は、plt.hist () 関数の引数colorに指定したい色を代入します。
plt.hist(x,color=”green”)
plt.title(“Histogram, Color=green”)
引数colorは、color=”g”でも同じです。
つまり、
plt.hist(x,color=”g”)
でも同じ結果を得ることができます。
ビン (棒) の透明度の変更
ビン (棒) の透明度を変更するには、plt.hist () 関数の引数alphaに0 (透明) ~1 (不透明) の値を指定します。
plt.hist(x,alpha=0.3)
plt.title(“Histogram, Alpha=0.3”)
凡例の表示
ヒストグラム内に凡例のラベルを表示させたい場合、plt.hist () 関数の引数labelに表示させたいラベル名を指定します。
また、凡例の表示のためには、引数にlabelを使用するだけではなく、plt.legend()関数を用いてラベルを表示するように明確に指示しなければなりません。
したがって、凡例表示のサンプルコードは次のようになります。
plt.hist(x,label=”sample1″)
plt.legend() #ラベル表示
plt.title(“Histogram, Label=sample1”)
この凡例の位置は現在右上になっていますが、任意で変更可能です。
plt.legend()関数の引数locに、凡例を表示したい位置を指定してあげればいいです。
引数として指定可能な位置一覧を下の表にまとめました。
表示位置 | 引数locの指定内容 |
最適地 | best |
左上 | upper left |
中央上 | upper center |
右上 | upper right |
左中央 | center left |
中央 | center |
右中央 | center right |
左下 | lower left |
中央下 | lower center |
右下 | lower right |
これらの各位置でラベルを表示させるためのコードとその結果が以下の通りとなっています。
location=[
”best”,
”upper left”,
”upper center”,
”upper right”,
”center left”,
”center”,
”center right”,
”lower left”,
”lower center”,
”lower right”,
]
plot_row=5
plot_col=2
for i in range(0,len(location)):
plt.subplot(plot_row,plot_col,i+1) #5×2のプロット箇所を設置
plt.hist(x,label=location[i])
plt.legend(loc=location[i])
plt.show()
単純に一つのヒストグラムの凡例の位置を指定したいだけであれば、次のように作成できます。
plt.hist(x,label=”sample1″)
plt.legend(loc=”lower center”)#ラベル位置指定
plt.title(“Histogram, Label=sample1, Loc=lower center”)
軸の表示範囲の変更
まず、x軸 (横軸) の表示範囲を変更したい場合は、plt.hist () 関数の引数rangeに表示させたい範囲の上限と下限を指定します。
plt.hist(x,range=(0,120)) #lower=0,upper=120
plt.title(“Histogram, Range=(0,120)”)
表示範囲の下限が0、上限が120となりました。
次に、 y軸 () の表示範囲を変更したい場合のやり方について説明します。
plt.hist(x)
hist,bins=np.histogram(x) #個数と階級に分割
plt.ylim(0,hist.max()*1.5) #上限値を最も高いヒストグラムの高さ×1.5倍に設定
plt.title(“Histogram, Ylim=(0,hist.max()*1.5)”)
今回は、y軸 (横軸) の最大値の1.5倍に上限を設定してみました。
念のため、2行目のhist,bins=np.histogram(x) を補足しておきます。
はじめに、np.histogram(x) を実行すると、次のような結果が得られます。
(array([12, 98, 617, 1780, 3048, 2752, 1296, 343, 49, 5], dtype=int64),
array([21.44368652, 29.42881512, 37.41394371, 45.39907231, 53.3842009, 61.3693295, 69.3544581, 77.33958669, 85.32471529, 93.30984388, 101.29497248]))
一番目 (上) の配列が度数を、二番目 (下) の配列が階級を表しています。
ここで、 hist,bins=np.histogram(x) と入力することで、初めのhistに一番目 (上) の度数の配列 ([12,98,…,5]) を格納し、次のbinsに二番目 (下) の階級の配列 ([21.44368652,29.42881512,…,101.29497248]) を格納しています。
その後、 hist.max()で度数の配列hist内の最大値 (3048) を参照しています。
下のように、plt.ylim()の下限と上限に普通に数値を代入してももちろん大丈夫です。
plt.hist(x)
plt.ylim(0,4000)
plt.title(“Histogram, Ylim=(0,4000)”)
軸ラベルの追加
x軸とy軸に軸ラベルを追加するには、それぞれplt.xlabel()関数とplt.ylabel()関数を用います。
plt.hist(x)
plt.xlabel(“Score”)
plt.ylabel(“Frequency”)
plt.title(“Histogram, Xlabel=Score,Ylabel=Frequency”)
コメントする