2012-09-05 15 views
6

Estoy tratando de dibujar parte de un histograma usando matplotlib.matplotlib histogramas normalizados

En lugar de dibujar todo el histograma que tiene una gran cantidad de valores atípicos y grandes valores, quiero centrarme en una pequeña parte. El histograma original están presentes:

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

enter image description here

Y después del enfoque que tiene este aspecto:

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

enter image description here

en cuenta que el último contenedor se estira y lo peor de todo los tics Y se escalan para que la suma sea exactamente 1 (por lo que los puntos fuera del rango actual no se tienen en cuenta en absoluto)

Sé que puedo lograr lo que quiero dibujando el histograma en todo el rango posible y luego restringiendo el eje a la parte que me interesa, pero se pierde mucho tiempo calculando contenedores que no voy a usar usar/ver de todos modos.

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

enter image description here

¿Hay una manera rápida y fácil de dibujar sólo la región enfocada, pero aún así obtener la escala Y correcta?

+0

la forma de calcular los valores normados sin tener todo el conjunto de datos en cuenta? En general, los valores del histograma deberían calcularse de modo que la integral de la curva sea 1, no simplemente dividiendo por el número de puntos. – chthonicdaemon

+0

En ausencia de una función que describa la distribución, lo mejor que puede hacer es contar el número de puntos y dividirlos en consecuencia. – cdecker

Respuesta

5

Para trazar un subconjunto del histograma, no creo que se pueda calcular todo el histograma.

¿Has intentado calcular el histograma con numpy.histogram y luego trazar una región usando pylab.plot o algo así? Es decir.

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) 

histograma Original: Original histogram

Histograma calcula manualmente: Histogram calculated manually

Histograma calcula manualmente, recortada: Histogram calculated manually, cropped (Nota: los valores son más pequeños porque los contenedores son más estrecho)

4

Creo que puede normalizar sus datos con un peso determinado. (repeat es una función numpy).

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