2012-01-27 11 views

Odpowiedz

10

Po prostu obliczyć i normalizować do dowolnej wartości, a następnie użyć bar do wykreślenia histogramu.

Na marginesie, to unormować takie rzeczy, że obszar wszystkich barów jest normed_value. Surowa suma będzie nie być normed_value (choć łatwo jest tak być, jeśli chcesz).

E.g.

import numpy as np 
import matplotlib.pyplot as plt 

x = np.random.random(100) 
normed_value = 2 

hist, bins = np.histogram(x, bins=20, density=True) 
widths = np.diff(bins) 
hist *= normed_value 

plt.bar(bins[:-1], hist, widths) 
plt.show() 

enter image description here

Tak więc, w tym przypadku, gdybyśmy zintegrować (suma wysokości pomnożonej przez szerokość) kosze, chcielibyśmy dostać 2,0 zamiast 1,0. (Tj (hist * widths).sum() przyniesie 2.0)

8

można przekazać weights argumentu hist zamiast stosowania normed. Na przykład, jeśli pojemniki obejmują przedział [minval, maxval] masz n kosze i chcesz, aby znormalizować obszar A, to myślę

weights = np.empty_like(x) 
weights.fill(A * n/(maxval-minval)/x.size) 
plt.hist(x, bins=n, range=(minval, maxval), weights=weights) 

powinno załatwić sprawę.

EDIT: weights argument musi być taki sam rozmiar jak x, a jej efektem jest, aby każdą wartość w x wnieść odpowiednią wartość w weights kierunku zliczania bin zamiast 1.

myślę, że hist prawdopodobnie mogłaby to zrobić przy większej zdolności kontrolowania normalizacji. Na przykład, myślę, że tak jak jest, wartości poza zakresem binowanym są ignorowane podczas normalizowania, co nie jest generalnie tym, czego potrzebujesz.

Powiązane problemy