web-dev-qa-db-ja.com

matplotlibヒストグラムでの相対頻度の設定

Floatのリストとしてデータがあり、それをヒストグラムとしてプロットしたいと思います。 Hist()関数は、絶対ヒストグラムをプロットするために完全に機能します。しかし、それを相対周波数形式で表す方法を理解できません-それを分数として、または理想的にはy軸のパーセンテージとして表示したいと考えています。

これがコードです:

fig = plt.figure()
ax = fig.add_subplot(111)
n, bins, patches = ax.hist(mydata, bins=100, normed=1, cumulative=0)
ax.set_xlabel('Bins', size=20)
ax.set_ylabel('Frequency', size=20)
ax.legend

plt.show()

Normed = 1引数で十分だと思いましたが、高すぎて1を超えることもあるので、ビンサイズなどで正規化されていないかのように、ビンサイズに依存しているようです。それにもかかわらず、私が累積1を設定した場合、それは1に上手く合計されます。それで、キャッチはどこにありますか?ちなみに、Originに同じデータを入力してプロットすると、完全に正しい分数が得られます。ありがとうございました!

25
user1278140

Histのノルムオプションは点の密度を返すため、たとえばdN/dx

あなたが必要とするものはそのようなものです:

 # assuming that mydata is an numpy array
 ax.hist(mydata, weights=np.zeros_like(mydata) + 1. / mydata.size)
 # this will give you fractions
37
sega_sai

または、次のように_set_major_formatter_を使用してy軸のスケールを調整できます。

_from matplotlib import ticker as tick

def adjust_y_axis(x, pos):
    return x / (len(mydata) * 1.0)

ax.yaxis.set_major_formatter(tick.FuncFormatter(adjust_y_axis))
_

上記のようにplt.show()の前に_adjust_y_axis_を呼び出すだけです。

5
fraxel