2011-08-08 49 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:

相關問題