如何规范化一个直方图



我有这个直方图,它将数组"d"计数为等对数间隔的箱子。

 max_val=np.log10(max(d))
 min_val=np.log10(min(d))
 logspace = np.logspace(min_val, max_val, 50) 

 hist(d,bins=logspace,label='z='+str(redshift),histtype='step')
 show()

问题是我想让它归一化,使面积为1。使用选项norm =True我没有得到结果,这可能是由于我使用对数箱的事实。因此,我尝试用这种方式对直方图进行规范化:

 H=hist(d,bins=logspace,label='z='+str(redshift),histtype='step')
 H_norm=H[0]/my_norm_constant

但是我不知道如何绘制H_norm和箱子

我试了norm =True,面积为1:

from pylab import *
d = np.random.normal(loc=20, size=10000)
max_val=np.log10(max(d))
min_val=np.log10(min(d))
logspace = np.logspace(min_val, max_val, 50) 

r = hist(d,bins=logspace,histtype='step', normed=True)
print "area":, sum(np.diff(r[1])*r[0])

可以运行代码,并检查输出。如果不是1,请检查numpy版本。当运行代码时,我得到了这个警告消息:

C: Python26 lib 网站 matplotlib axes.py: 7680: UserWarning:此版本修复了NumPy直方图中的规范化错误1.5版本之前的函数,以非统一的方式出现本宽度。返回并绘制的值现在是一个密度:n/(n * bin宽度),其中n为箱数,n为总点数。

自己绘制图表:

step(r[1][1:], r[0]/my_norm_constant)

这使用了通用的归一化方法,该归一化方法将箱子的高度加起来等于1,而不管箱子的宽度。

import matplotlib
import numpy as np
x = [0.1,0.2,0.04,0.05,0.05,0.06,0.07,0.11,0.12,0.12,0.1414,
     0.1415,0.15,0.12,0.123,0,0.14,0.145,0.15,0.156,0.12,0.15,
     0.156,0.166,0.151,0.124, 0.12,0.124,0.12,0.045,0.124]
weights = np.ones_like(x)/float(len(x))
p=plt.hist(x,
    bins=4,
    normed=False, 
    weights=weights,
    #histtype='stepfilled',
    color=[0.1,0.4,0.3]
)
plt.ylim(0,1)
plt.show()

结果直方图:

最新更新