首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >绘制直方图,使条形高度之和为1(概率)

绘制直方图,使条形高度之和为1(概率)
EN

Stack Overflow用户
提问于 2010-10-06 02:21:10
回答 5查看 162K关注 0票数 90

我想用matplotlib绘制一个矢量的归一化直方图。我尝试了以下几种方法:

代码语言:javascript
复制
plt.hist(myarray, normed=True)

以及:

代码语言:javascript
复制
plt.hist(myarray, normed=1)

但这两种选择都不会产生从0,1开始的y轴,使得直方图的条形高度之和为1。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-06 02:45:30

如果您提出一个更完整的工作(或在本例中为非工作)的示例,将会更有帮助。

我尝试了以下几种方法:

代码语言:javascript
复制
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文档(即来自ipythonax.hist? ),我认为总和也很好:

代码语言:javascript
复制
*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))

在上面的命令之后尝试一下:

代码语言:javascript
复制
np.sum(n * np.diff(bins))

不出所料,我得到了1.0的返回值。请记住,normed=True并不意味着每个条形图上的值的和将是单位,而不是条形图上的积分是单位。在我的例子中,np.sum(n)返回了大约7.2767

票数 49
EN

Stack Overflow用户

发布于 2013-05-06 20:53:32

如果希望所有条形图的总和等于1,请按值的总数对每个条形图进行加权:

代码语言:javascript
复制
weights = np.ones_like(myarray) / len(myarray)
plt.hist(myarray, weights=weights)

希望这能有所帮助,尽管这个线程已经很老了。

Python2.x注意事项:为除法运算符之一向float()添加强制转换,否则由于整数除法,您将以零结束

票数 214
EN

Stack Overflow用户

发布于 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

如果社区认为这是可以接受的,我想提出一个综合了上述两个帖子的想法的解决方案。

代码语言:javascript
复制
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可以得到必要的结果。

只是想和你分享一下我的经历。谢谢。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3866520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档