绘制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一种方法来使模拟histt​​ype =“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