Как нормализовать гистограмму - PullRequest
1 голос
/ 08 августа 2011

У меня есть эта гистограмма, которая считает массив «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 против бинов

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Я попробовал 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, проверьте свою версию. Я получил это предупреждение при запуске кода:

C: \ Python26 \ lib \ site-packages \ matplotlib \ axes.py: 7680: Предупреждение пользователя: В этом выпуске исправлена ​​ошибка нормализации в гистограмме NumPy функция до версии 1.5, встречающаяся с неоднородностью ширина бункера. Возвращенное и нанесенное на график значение теперь является плотностью: н / (N * ширина бункера), где n - количество бинов, а N - общее количество баллов.

чтобы построить график самостоятельно:

step(r[1][1:], r[0]/my_norm_constant)
1 голос
/ 20 июля 2016

При этом используется общая нормализация, которая нормализует высоту бина для сложения до 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()

результирующий график гистограммы:

...