2012-09-06 21 views
24

Tengo datos de conteo (un 100 de ellos), cada uno corresponde a un contenedor (0 a 99). Necesito trazar estos datos como un histograma. Sin embargo, el histograma cuenta esos datos y no traza correctamente porque mis datos ya están agrupados.diagrama de python histograma simple dado datos agrupados

import random 
import matplotlib.pyplot as plt 
x = random.sample(range(1000), 100) 
xbins = [0, len(x)] 
#plt.hist(x, bins=xbins, color = 'blue') 
#Does not make the histogram correct. It counts the occurances of the individual counts. 

plt.plot(x) 
#plot works but I need this in histogram format 
plt.show() 
+0

Se puede usar el código en esta [respuesta] (http://stackoverflow.com/a/37559471/2087463) o esta [respuesta] (http://stackoverflow.com/a/37548733/2087463) como un ejemplo para trazar datos ya agrupados como histogramas. – tmthydvnprt

Respuesta

33

Si estoy entendiendo lo que quiere lograr correctamente, entonces el siguiente debe darle lo que quiere:

import matplotlib.pyplot as plt 
plt.bar(range(0,100), x) 
plt.show() 

No utiliza hist(), pero parece que ya ha puesto sus datos en contenedores por lo que no es necesario.

+0

Gracias redrah. Ayudó a – Curious

+0

Si desea que la 'barra' se parezca más a la salida' hist', use el código en esta [respuesta] (http://stackoverflow.com/a/37559471/2087463) o esta [respuesta] (http: //stackoverflow.com/a/37548733/2087463) como un ejemplo para trazar histogramas a través de la gráfica 'bar'. – tmthydvnprt

0

Tenga una mirada en el histograma examples en la documentación matplotlib. Debe usar la función hist. Si no da el resultado esperado de manera predeterminada, entonces juegue con los argumentos al hist y prepare/transforme/modifique sus datos antes de proporcionarlo al hist. No tengo muy claro qué es lo que quieres lograr, así que no puedo ayudarte en este punto.

+0

después de intentar por un tiempo hice esta pregunta. Mi única preocupación es si puedo lograr lo que el código anterior hace con la función hist. – Curious

12

El problema es con sus xbins. Actualmente tiene

xbins = [0, len(x)] 

que le proporcionará la lista [0, 100]. Esto significa que solo verá 1 bin (no 2) delimitado por debajo por 0 y más por 100. No estoy totalmente seguro de lo que quiere de su histograma. Si usted quiere tener 2 bandejas de forma desigual espaciados, puede utilizar

xbins = [0, 100, 1000] 

para mostrar todo por debajo de 100 en una bandeja, y todo lo demás en el otro compartimiento. Otra opción sería usar un valor entero para obtener una cierta cantidad de contenedores espaciados uniformemente. En otras palabras, haga

plt.hist(x, bins=50, color='blue') 

donde bins es el número de contenedores deseados.

En una nota lateral, siempre que no puedo recordar cómo hacer algo con matplotlib, usualmente solo voy al thumbnail gallery y encuentro un ejemplo que parece más o menos lo que estoy tratando de lograr. Todos estos ejemplos tienen un código fuente que los acompaña, por lo que son bastante útiles. El documentation para matplotlib también puede ser muy útil.

2

Estoy bastante seguro de que su problema son los contenedores. No es una lista de límites sino una lista de bordes de contenedores.

xbins = [0,len(x)] 

vuelve en su caso, una lista que contiene [0, 100] Indicando que desea un borde bin a 0 y uno en 100. Así se obtiene una bandeja de 0 a 100. Lo que se quiere es:

xbins = [x for x in range(len(x))] 

que devuelve:

[0,1,2,3, ... 99] 

que indica la papelera de bordes que desee.

7

Cool, gracias! Esto es lo que creo que la OP quería hacer:

import random 
import matplotlib.pyplot as plt 
x=[x/1000 for x in random.sample(range(100000),100)] 
xbins=range(0,len(x)) 
plt.hist(x, bins=xbins, color='blue') 
plt.show() 
0

se puede lograr esto usando hist de matplotlib así, no hay necesidad de numpy.En esencia, ya ha creado los contenedores como xbins. En este caso, x serán sus pesos.

plt.hist(xbins,weights=x) 
Cuestiones relacionadas