2011-08-08 13 views
92

Estoy usando matplotlib para hacer un histograma.Tamaño del contenedor en Matplotlib (Histograma)

Básicamente, me pregunto si hay alguna manera de establecer manualmente el tamaño de los contenedores en lugar del número de contenedores.

Cualquier persona con alguna idea es muy apreciada.

Gracias

Respuesta

167

En realidad, es bastante fácil: en lugar del número de contenedores, puede dar una lista con los límites del contenedor. Pueden ser distribuidos en forma desigual, también:

plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100]) 

Si sólo quiere que ellos distribuyen por igual, puede simplemente usar rango:

plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth)) 

Añadido a respuesta original

El la línea anterior funciona para data llena solo con números enteros. Como macrocosme puntos a cabo, por flotadores que puede utilizar:

import numpy as np 
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth)) 
+8

Tenga en cuenta que la última línea solo funciona para enteros, no para flotantes. – Gabriel

+12

reemplaza el rango (...) con np.arange (...) para que funcione con flotadores. – macrocosme

+0

Pregunta adicional, ¿cómo puedo calcular el eje para ver el valor de cada contenedor? Ahora solo puedo ver '10..20..30..' – cqcn1991

4

supongo que el camino más fácil sería calcular los valores mínimo y máximo de los datos que tiene, a continuación, calcular L = max - min. Luego se divide L por el ancho del contenedor deseado (supongo que esto es lo que quiere decir con el tamaño del contenedor) y utiliza el techo de este valor como el número de contenedores.

+0

eso es exactamente lo que tenía en mente, gracias. Solo me preguntaba si había una manera más simple pero esto parece encontrar ¡gracias! –

+0

Usando números redondos no obtengo un tamaño de bandeja redonda con este enfoque. Alguien experimentado eso? –

13

para N bins, los bordes bin se especifican por lista de n valores de + 1, donde la primera N dan los bordes bandeja inferior y el 1 da superior borde del último contenedor.

Código:

from numpy import np; from pylab import * 

bin_size = 0.1; min_edge = 0; max_edge = 2.5 
N = (max_edge-min_edge)/bin_size; Nplus1 = N + 1 
bin_list = np.linspace(min_edge, max_edge, Nplus1) 

Tenga en cuenta que linspace produce matriz a partir de min_edge a max_edge roto en N + 1 valores o N contenedores

+0

Tenga en cuenta que los contenedores incluyen su límite inferior y excluyen su límite superior, con la excepción del contenedor N + 1 (último) que incluye ambos límites. – lukewitmer

4

que tenía el mismo problema que la OP (creo!), Pero no pudo hacer que funcionara de la manera especificada por Lastalda. No sé si he interpretado la pregunta correctamente, pero he encontrado otra solución (aunque probablemente sea una manera realmente mala de hacerlo).

Esta era la forma en que lo hice:

plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);

que crea esto:

image showing histogram graph created in matplotlib

Así que el primer parámetro básicamente 'inicializa' la papelera - Soy específicamente creando un número que se encuentra entre el rango que establecí en el parámetro bins.

Para demostrar esto, observe la matriz en el primer parámetro ([1,11,21,31,41]) y la matriz 'bins' en el segundo parámetro ([0,10,20,30,40] , 50]):

  • el número 1 (de la primera matriz) se sitúa entre 0 y 10 (en el array 'bins')
  • el número 11 (de la primera matriz) se sitúa entre 11 y 20 (en el array 'bins')
  • el número 21 (de la primera matriz) se encuentra entre 21 y 30 (en los contenedores 'array), etc.

Luego estoy usando el parámetro 'pesos' para definir el tamaño de cada contenedor. Esta es la matriz utilizada para el parámetro de ponderaciones: [10,1,40,33,6].

Así que el bin 0 a 10 se le da el valor 10, el 11 al 20 bin se le da el valor de 1, la bandeja 21 a 30 se da el valor de 40, etc.

+0

Creo que tiene un malentendido básico sobre cómo funciona la función de histograma. Espera datos brutos. Por lo tanto, en su ejemplo, su matriz de datos debe contener 10 valores entre 0 y 10, 1 valor entre 10 y 20, y así sucesivamente. Entonces la función realiza el resumen Y el dibujo. Lo que está haciendo arriba es una solución temporal porque ya tiene las sumas (que luego inserta en el gráfico haciendo un mal uso de la opción "pesos"). Espero que esto aclare algo de confusión. – Lastalda

0

Para un histograma con enteros x-values ​​Terminé usando

plt.hist(data, np.arange(min(data)-0.5, max(data)+0.5)) 
plt.xticks(range(min(data), max(data))) 

El desplazamiento de 0.5 centra las ubicaciones en los valores del eje x. La llamada plt.xticks agrega una marca para cada número entero.

Cuestiones relacionadas