2012-02-29 24 views
11

He producido 3 conjuntos de datos que están organizados en matrices numpy. Me interesa trazar la distribución de probabilidad de estos tres conjuntos de datos como histogramas normados. Las tres distribuciones deberían verse casi idénticas, por lo que parece sensato trazar las tres en el mismo eje para facilitar la comparación.Mostrando 3 histogramas en 1 eje de forma legible - matplotlib

Por defecto, los histogramas de matplotlib se trazan como barras, lo que hace que la imagen que quiero parezca muy desordenada. Por lo tanto, mi pregunta es si es posible obligar a pyplot.hist a dibujar solamente un cuadro/círculo/triángulo donde la parte superior de la barra estaría en la forma predeterminada para que pueda mostrar limpiamente las tres distribuciones en el mismo gráfico o si tiene que calcular los datos del histograma y luego trazarlo por separado como un gráfico de dispersión.

Gracias de antemano.

+1

Dado que los datos pueden cruzarse varias veces, podría tener sentido tener un parámetro 'alpha' (transparencia) para cualquier método que termine usando. – Hooked

Respuesta

19

Hay dos formas de trazar tres histogramas al mismo tiempo, pero ninguno de los dos es lo que ha pedido. Para hacer lo que pide, debe calcular el histograma, p. usando numpy.histogram, luego trace utilizando el método plot. Use scatter solo si desea asociar otra información con sus puntos configurando un tamaño para cada punto.

El primer enfoque alternativo para usar hist implica pasar los tres conjuntos de datos a la vez al método hist. El método hist luego ajusta los anchos y las ubicaciones de cada barra para que los tres conjuntos estén claramente presentados.

La segunda alternativa es usar la opción histtype='step', que hace gráficas claras para cada conjunto.

Aquí es un script demostrar esto:

import numpy as np 
import matplotlib.pyplot as plt 

np.random.seed(101) 
a = np.random.normal(size=1000) 
b = np.random.normal(size=1000) 
c = np.random.normal(size=1000) 

common_params = dict(bins=20, 
        range=(-5, 5), 
        normed=True) 

plt.subplots_adjust(hspace=.4) 
plt.subplot(311) 
plt.title('Default') 
plt.hist(a, **common_params) 
plt.hist(b, **common_params) 
plt.hist(c, **common_params) 
plt.subplot(312) 
plt.title('Skinny shift - 3 at a time') 
plt.hist((a, b, c), **common_params) 
plt.subplot(313) 
common_params['histtype'] = 'step' 
plt.title('With steps') 
plt.hist(a, **common_params) 
plt.hist(b, **common_params) 
plt.hist(c, **common_params) 

plt.savefig('3hist.png') 
plt.show() 

Y aquí está el gráfico resultante:

enter image description here

Tenga en cuenta que usted podría hacer todo esto con la interfaz orientada a objetos, así, p.ej crear subtramas individuales, etc.

+0

Muchas gracias. Terminé descubriendo el numpy.histogram como sugeriste y ¡hizo el trabajo a la perfección! Apreciamos mucho la ayuda. – Zykx

Cuestiones relacionadas