1

我有这个直方图,它在等对数间隔的 bin 中计算数组“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()

问题是我希望它被规范化,以便区域为一。使用选项 Normed=True 我没有得到结果,这可能是因为我使用的是对数箱。因此,我尝试以这种方式对直方图进行归一化:

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

但后来我不知道如何绘制 H_norm 与垃圾箱

4

2 回答 2

2

我试过normed=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\site-packages\matplotlib\axes.py:7680:UserWarning:此版本修复了 1.5 版之前 NumPy 直方图函数中的标准化错误,该错误发生在不均匀的 bin 宽度上。返回并绘制的值现在是一个密度:n / (N * bin width),其中 n 是 bin 计数,N 是总点数。

自己绘制图表:

step(r[1][1:], r[0]/my_norm_constant)
于 2011-08-08T13:00:44.690 回答
1

这使用了通用归一化,该归一化将 bin 高度归一化,使其加起来为 1,而与 bin 宽度无关。

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()

结果直方图:

于 2016-07-20T16:37:07.057 回答