2011-08-08 50 views
1

我有这个直方图,它在相等的对数间隔元素中对数组“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兑仓

+0

你不知道吗? – joaquin

回答

2

我试着范=真和面积是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的直方图 功能之前,标准化的bug版本1.5,出现不均匀的 垃圾箱宽度。返回并绘制的值现在是一个密度: n /(N * bin宽度), 其中n是箱数,N是点的总数。

自己绘制图表:

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

好的,但我的问题是如何将你的r [0]除以某个常数,然后将其作为仓的函数绘制。 – Brian

+1

我修改了答案,使用step()来绘制。 – HYRY

+0

谢谢,它的工作! :) – Brian

1

这使用了共同正常化其归仓高度加起来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() 

resulting histogram plot:

相关问题