如何将直方图进行归一化,使得其高度之和等于1?

3
我使用matplotlib.pyplot.hist调用,并传递kwarg normed=True生成了下面的图:

enter image description here

经进一步研究,我发现这种归一化方式使直方图的积分等于1。 如何绘制相同的数据,使得每个柱子的高度之和为1?
换句话说,我想让每个柱子表示其数值所包含的整体比例。
1个回答

3

我不确定是否有一种直接的方法,但是您可以手动将所有条形图高度除以输入长度(以下代码在ipython --pylab中制作以跳过导入):

inp = normal(size=1000)
h = hist(inp)

这将为您提供:

输入图像描述

现在,您可以执行以下操作:

bar(h[1][:-1], h[0]/float(len(inp)), diff(h[1]))

并获取

在此输入图片描述


谢谢!您能否解释一下从hist返回的元组中每个元素的含义?您的bar(h[1][:-1], h[0]/float(len(inp)), diff(h[1]))让我有点困惑! - Louis Thibault
@blz hist 返回元组的前两个元素是 heightsx pointsbar 的前两个参数分别为 lefttop - Lev Levitsky
谢谢!我在我的数据上运行了你的代码,但是似乎没有得到归一化的直方图 =/ 这里是数据(PANDAS DataFrame对象)的链接:https://dl.dropbox.com/u/6160029/normR.pickle,这里是我使用的代码的链接:http://www.hastebin.com/ponagaciji.py。此外,这里是我得到的图形的链接:https://dl.dropbox.com/u/6160029/normHist_fail.png。你有什么想法我做错了什么吗? - Louis Thibault
很遗憾,我没有安装 pandas 并且不知道如何使用它。你能先在一个普通的列表上尝试一下你的代码吗? - Lev Levitsky
我已经尝试在列表形式的数据上运行它,但是结果还是一样的。如果您能理解的话,这里有一个序列化版本的列表。=/ - Louis Thibault
我的代码在我的系统上对这个列表运行良好。这里是我得到的结果(使用hist中的bins=20)。但是当我将您的函数粘贴到ipython会话中并调用它时,我也只看到非标准化直方图。我认为它是在调用hist之后显示的,然后bar不显示任何内容,因为已经有一个打开的窗口。尝试将其作为脚本运行,并添加适当的figure()show()调用。 - Lev Levitsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接