1. ホーム
  2. python

[解決済み] 棒の高さの和が1になるようにヒストグラムを描け(確率)

2023-02-14 13:47:17

質問

を使ってベクトルから正規化ヒストグラムをプロットしたいと思います。 matplotlib . 私は以下を試しました。

plt.hist(myarray, normed=True)

と同様に

plt.hist(myarray, normed=1)

というオプションがありますが、どちらのオプションもヒストグラムのバーの高さの合計が1になるような [0, 1] からの y 軸を生成しません。

どのように解決するのですか?

より完全な動作例(この場合は非動作例)を提示していただければ、より参考になると思います。

私は以下を試しました。

import numpy as np
import matplotlib.pyplot as plt

x = np.random.randn(1000)

fig = plt.figure()
ax = fig.add_subplot(111)
n, bins, rectangles = ax.hist(x, 50, density=True)
fig.canvas.draw()
plt.show()

これは確かにバーチャートヒストグラムを生成し、Y軸は [0,1] .

さらに hist のドキュメントにあるように (つまり ax.hist? から ipython のように)、合計も問題ないと思います。

*normed*:
If *True*, the first element of the return tuple will
be the counts normalized to form a probability density, i.e.,
``n/(len(x)*dbin)``.  In a probability density, the integral of
the histogram should be 1; you can verify that with a
trapezoidal integration of the probability density function::

    pdf, bins, patches = ax.hist(...)
    print np.sum(pdf * np.diff(bins))

上記のコマンドの後、これを試してみる。

np.sum(n * np.diff(bins))

の返り値を得る。 1.0 という期待通りの結果が得られます。 覚えておいてほしいのは normed=True は各バーでの値の合計が単一になることを意味するのではなく、むしろバー上の積分が単一になることを意味します。 私の場合 np.sum(n) はおよそ 7.2767 .