我想用matplotlib
绘制一个矢量的归一化直方图。我尝试了以下几种方法:
plt.hist(myarray, normed=True)
以及:
plt.hist(myarray, normed=1)
但这两种选择都不会产生从0,1开始的y轴,使得直方图的条形高度之和为1。
发布于 2010-10-06 02:45:30
如果您提出一个更完整的工作(或在本例中为非工作)的示例,将会更有帮助。
我尝试了以下几种方法:
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
文档(即来自ipython
的ax.hist?
),我认为总和也很好:
*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
。
发布于 2013-05-06 20:53:32
如果希望所有条形图的总和等于1,请按值的总数对每个条形图进行加权:
weights = np.ones_like(myarray) / len(myarray)
plt.hist(myarray, weights=weights)
希望这能有所帮助,尽管这个线程已经很老了。
Python2.x注意事项:为除法运算符之一向float()
添加强制转换,否则由于整数除法,您将以零结束
发布于 2013-02-28 03:57:27
考虑到这个问题的日期是2010年,我知道这个答案来得太晚了,但我遇到这个问题是因为我自己也面临着类似的问题。正如答案中所述,normed=True意味着直方图下的总面积等于1,但高度总和不等于1。然而,为了便于对直方图进行物理解释,我想制作一个高度总和等于1的直方图。
我在下面的问题中发现了一个提示- Python: Histogram with area normalized to something other than 1
但是我找不到一种方法来使条模仿histtype=的“步骤”特性hist()。这让我转向:Matplotlib - Stepped histogram with already binned data
如果社区认为这是可以接受的,我想提出一个综合了上述两个帖子的想法的解决方案。
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轴的最低点而关闭。在这种情况下,在请求或y的末尾添加一个元素0可以得到必要的结果。
只是想和你分享一下我的经历。谢谢。
https://stackoverflow.com/questions/3866520
复制相似问题