気ままに宙をみる

宇宙, 統計, 時々私事

matplotlibでヒストグラムの作成

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

matplotlibでヒストグラムを作ってみたのでメモ。
matplotlibを使えばヒストグラムが非常に簡単に作れます。gnuplotよりもおすすめです。

plt.histに配列を与えればそれだけでヒストグラムにしてくれます。

まず乱数で平均1、分散1のガウシアンの分布を発生させてみます。最近知ったんですがpythonのrandomはメルセンヌツイスタで発生させてくれているそうです。さすが気が利いてますね(Cのrandとは・・・)。

最も簡単にやろうと思えばplt.hist(配列,binの数)を指定するだけで書けますが一応オプションの説明をします。
bins : ビンの数
range : ビンの範囲(デフォルトは配列の最小値と最大値)
alpha : 透過率
weight : 重み(第一引数と同じサイズの配列を与えて、重みを付けます。ヒストグラムなので通常1の重みを持つわけですが、配列に1以外を入れることで重み付けすることが可能です。詳しくは下。)
normed : Trueにすると合計1に規格化してくれる

import numpy as np
import matplotlib.pyplot as plt
from pylab import *
from math import *
from scipy.stats import norm

nor = np.random.normal(0,1,500) #ガウシアンに従う乱数500個発生
x = np.arange(-5,5,0.01)

plt.xlabel("x")
plt.ylabel("N")
plt.title("平均0,分散1の正規分布に従って生成した乱数のヒストグラム")
plt.hist(nor,bins=20,range=(-4,4))
plt.plot(x,norm.pdf(x)*200,lw=3,color="r")
plt.show()

f:id:cranethree:20150729185417p:plain

確率密度関数に従う乱数発生法についてはそのうち書きます。
これで終わりなんですがオプションについてちょっと解説。

normedについて

これは便利です。自動で規格化してくれます。自分で底面積がいくつで・・・とか考えなくてよいです。

import numpy as np
import matplotlib.pyplot as plt
from pylab import *
from math import *
from scipy.stats import norm

nor = np.random.normal(0,1,500) #ガウシアンに従う乱数500個発生
x = np.arange(-5,5,0.01)

plt.xlabel("x")
plt.ylabel("N")
plt.title("平均0,分散1の正規分布に従って生成した乱数のヒストグラム")
plt.hist(nor,bins=20,range=(-4,4),normed=True)
plt.plot(x,norm.pdf(x),lw=3,color="r")
plt.show()

みごと規格化されました。確率密度関数とぴったりです。
f:id:cranethree:20150729191238p:plain

weightについて

[0.5,1.5,2.5]の配列を1刻みでヒストグラムにすると、普通はすべてのbinで高さ1になりますが、weightの配列を[1,2,3]とか与えてやると、高さが1,2,3になります。

import numpy as np
import matplotlib.pyplot as plt
from pylab import *
from math import *
from scipy.stats import norm

nor = np.arange(1.0,10,0.1) #ヒストグラムにする配列
wht = np.arange(1.0,10,0.1) #weightの配列

plt.xlabel("x")
plt.ylabel("N")
plt.hist(nor,bins=9,weights=wht,label="weight") #weightあり
plt.hist(nor,bins=9,weights=None,label="weight None") #weightなし

plt.legend(shadow=True,numpoints=1,prop={"size":15},loc=2)
plt.show()

[f:id:cranethree:20150729192449p:plain]