绘制matplotlib中bar高度总和为1的直方图
我想从一个使用matplotlib的vector绘制一个归一化的直方图。 我尝试了以下内容:
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, normed=True) fig.canvas.draw() plt.show()
这确实会产生一个从[0,1]
的y轴的柱状图直方图。
此外,根据hist
文档(即从ipython
ax.hist?
),我认为总和也很好:
*normed*: If *True*, the first element of the return tuple will be the counts normalized to form a probability density, ie, ``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
。
如果你想所有的酒吧的总和是相等的统一,加权每个箱的总数值:
weights = np.ones_like(myarray)/float(len(myarray)) plt.hist(myarray, weights=weights)
希望有帮助,虽然线程是相当古老的…
我知道这个答案为时太晚,考虑到2010年的问题,但我遇到了这个问题,因为我自己也面临着类似的问题。 正如在答案中已经指出的那样,normed = True表示直方图下的总面积等于1,但高度之和不等于1.但是,为了便于直方图的物理解释,我想要使高度总和等于1。
我在下面的问题中发现了一个提示 – Python:区域归一化为1以外的区域的直方图
但是我无法find一种方法来使模拟histtype =“step”特征hist()。 这使我转向: Matplotlib – 已分段数据的分段直方图
如果社群认为可以接受的话,我想提出一个解决scheme,综合上述两个岗位的想法。
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.
虽然在某些情况下,我注意到直方图的最左边的“bar”或最右边的“bar”并没有通过触摸Y轴的最低点而closures。 在这种情况下,在乞讨或结束时添加一个元素0取得了必要的结果。
只是想我会分享我的经验。 谢谢。
这是使用np.histogram()
方法的另一个简单解决scheme。
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