93

を使用して、ベクトルから正規化されたヒストグラムをプロットしたいと思いmatplotlibます。私は次のことを試しました:

plt.hist(myarray, normed=True)

としても:

plt.hist(myarray, normed=1)

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

4

6 に答える 6

49

より完全に機能する (またはこの場合は機能しない) 例を提示すると、より役立つでしょう。

私は次のことを試しました:

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。これは、各バーの値の合計が 1 になるという意味でnormed=Trueはなく、バー全体の積分が 1 になるという意味ではないことに注意してください。私の場合、np.sum(n)約が返され7.2767ました。

于 2010-10-05T18:45:29.997 に答える
23

質問の日付が2010年であることを考えると、この回答は遅すぎることはわかっていますが、私自身も同様の問題に直面していたため、この質問に出くわしました。回答で既に述べたように、normed=True は、ヒストグラムの下の総面積が 1 に等しいが、高さの合計が 1 に等しくないことを意味します。高さの合計が 1 に等しい。

次の質問でヒントを見つけました - Python: Histogram with area normalized to something other than 1

しかし、バーが histt​​ype="step" 機能 hist() を模倣する方法を見つけることができませんでした。これは私を次のように転向させました:Matplotlib - すでにビニングされたデータを含む階段状ヒストグラム

コミュニティがそれを受け入れられると判断した場合、上記の両方の投稿からのアイデアを統合したソリューションを提示したいと思います.

import matplotlib.pyplot as plt

# Let X be the array whose histogram needs to be plotted.
nx, xbins, ptchs = plt.hist(X, bins=20)
plt.clf() # Get rid of this histogram since not the one we want.

nx_frac = nx/float(len(nx)) # Each bin divided by total number of objects.
width = xbins[1] - xbins[0] # Width of each bin.
x = np.ravel(zip(xbins[:-1], xbins[:-1]+width))
y = np.ravel(zip(nx_frac,nx_frac))

plt.plot(x,y,linestyle="dashed",label="MyLabel")
#... Further formatting.

これは私にとっては素晴らしく機能しましたが、場合によっては、ヒストグラムの最も左の「バー」または最も右の「バー」が Y 軸の最低点に触れても閉じないことに気付きました。このような場合、要素 0 を y の最初または最後に追加すると、必要な結果が得られました。

私の経験を共有したいと思っただけです。ありがとうございました。

于 2013-02-27T19:57:27.400 に答える
14

np.histogram()メソッドを使用した別の簡単なソリューションを次に示します。

myarray = np.random.random(100)
results, edges = np.histogram(myarray, normed=True)
binWidth = edges[1] - edges[0]
plt.bar(edges[:-1], results*binWidth, binWidth)

実際に、合計が 1 になることを次のように確認できます。

> print sum(results*binWidth)
1.0
于 2015-07-18T01:12:23.030 に答える