2012-09-05 12 views
6

Próbuję narysować część histogramu przy użyciu matplotlib.Matplotlib normowane histogramy

Zamiast rysować cały histogram, który ma wiele wartości odstających i dużych, chcę skupić się na niewielkiej części. Oryginalny histogram wygląda następująco:

hist(data, bins=arange(data.min(), data.max(), 1000), normed=1, cumulative=False) 
plt.ylabel("PDF") 

enter image description here

I po ustawieniu ostrości wygląda to tak:

hist(data, bins=arange(0, 121, 1), normed=1, cumulative=False) 
plt.ylabel("PDF") 

enter image description here

Zauważ, że ostatni bin jest rozciągnięta i najgorsze takty Y są skalowane tak, że suma wynosi dokładnie 1 (więc punkty poza bieżącym zakresem nie są brane pod uwagę)

Wiem, że mogę osiągnąć to, co chcę, rysując histogram w całym możliwym zakresie, a następnie ograniczając oś do części, która mnie interesuje, ale marnuje ona dużo czasu na obliczanie pojemników, których nie chcę użyj/zobacz mimo to.

hist(btsd-40, bins=arange(btsd.min(), btsd.max(), 1), normed=1, cumulative=False) 
axis([0,120,0,0.0025]) 

enter image description here

Czy istnieje szybki i łatwy sposób narysować tylko region skupiony ale wciąż skala Y są prawidłowe?

+0

Jak wartości Normed być obliczane bez brania cały zestaw danych pod uwagę? Ogólnie, wartości histogramu należy obliczyć tak, aby całka krzywej wynosiła 1, a nie po prostu przez podzielenie przez liczbę punktów. – chthonicdaemon

+0

W przypadku braku funkcji opisującej rozkład najlepiej jest zliczyć liczbę punktów i odpowiednio podzielić. – cdecker

Odpowiedz

5

W celu wykreślenia podzbioru histogramu, nie sądzę, że można obliczyć cały histogram.

Czy próbowałeś obliczać histogram za pomocą numpy.histogram, a następnie wykreślić region za pomocą pylab.plot czy coś w tym stylu? To znaczy.

import numpy as np 
import pylab as plt 

data = np.random.normal(size=10000)*10000 

plt.figure(0) 
plt.hist(data, bins=np.arange(data.min(), data.max(), 1000)) 

plt.figure(1) 
hist1 = np.histogram(data, bins=np.arange(data.min(), data.max(), 1000)) 
plt.bar(hist1[1][:-1], hist1[0], width=1000) 

plt.figure(2) 
hist2 = np.histogram(data, bins=np.arange(data.min(), data.max(), 200)) 
mask = (hist2[1][:-1] < 20000) * (hist2[1][:-1] > 0) 
plt.bar(hist2[1][mask], hist2[0][mask], width=200) 

oryginalny histogramu: Original histogram

histogramu oblicza się ręcznie: Histogram calculated manually

histogramu oblicza się ręcznie przycięty: Histogram calculated manually, cropped (Uwaga: Wartości są mniejsze, ponieważ pojemniki są węższy)

4

Myślę, że możesz normalizować swoje dane za pomocą określonej wagi. (repeat jest funkcją numpy).

hist(data, bins=arange(0, 121, 1), weights=repeat(1.0/len(data), len(data)))