を使用して、ベクトルから正規化されたヒストグラムをプロットしたいと思いmatplotlib
ます。私は次のことを試しました:
plt.hist(myarray, normed=True)
としても:
plt.hist(myarray, normed=1)
ただし、どちらのオプションも [0, 1] から y 軸を作成し、ヒストグラムのバーの高さの合計が 1 になるようにします。
を使用して、ベクトルから正規化されたヒストグラムをプロットしたいと思いmatplotlib
ます。私は次のことを試しました:
plt.hist(myarray, normed=True)
としても:
plt.hist(myarray, normed=1)
ただし、どちらのオプションも [0, 1] から y 軸を作成し、ヒストグラムのバーの高さの合計が 1 になるようにします。
より完全に機能する (またはこの場合は機能しない) 例を提示すると、より役立つでしょう。
私は次のことを試しました:
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年であることを考えると、この回答は遅すぎることはわかっていますが、私自身も同様の問題に直面していたため、この質問に出くわしました。回答で既に述べたように、normed=True は、ヒストグラムの下の総面積が 1 に等しいが、高さの合計が 1 に等しくないことを意味します。高さの合計が 1 に等しい。
次の質問でヒントを見つけました - Python: Histogram with area normalized to something other than 1
しかし、バーが histtype="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 の最初または最後に追加すると、必要な結果が得られました。
私の経験を共有したいと思っただけです。ありがとうございました。
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