matplotlibでヒストグラムの作成
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()
確率密度関数に従う乱数発生法についてはそのうち書きます。
これで終わりなんですがオプションについてちょっと解説。
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()
みごと規格化されました。確率密度関数とぴったりです。
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]