real - librerias para graficar en python
TamaƱo del contenedor en Matplotlib(Histograma) (5)
Estoy usando matplotlib para hacer un histograma.
Básicamente, me pregunto si hay alguna manera de establecer manualmente el tamaño de los contenedores en lugar de la cantidad de contenedores.
Cualquier persona con alguna idea es muy apreciada.
Gracias
En realidad, es bastante fácil: en lugar de la cantidad de contenedores, puede proporcionar una lista con los límites del contenedor. También se pueden distribuir de manera desigual:
plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])
Si solo quieres que se distribuyan equitativamente, puedes usar el rango:
plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))
Agregado a la respuesta original
La línea anterior funciona solo para data
llenos de números enteros. Como señala macrocosme , para flotadores puedes usar:
import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))
Para las N bandejas, los bordes de la bandeja se especifican mediante una lista de valores N + 1 donde la primera N da los bordes inferiores de la bandeja y la +1 da el borde superior de la última bandeja.
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 una matriz de min_edge a max_edge dividida en N + 1 valores o N bandejas
Para un histograma con valores x enteros, 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 entero.
Supongo que la manera más fácil sería calcular el mínimo y máximo de los datos que tienes, luego calcula 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 se usa el techo de este valor como el número de contenedores.
Tuve el mismo problema que OP (¡creo!), Pero no pude lograr 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 fue 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]);
Lo que crea esto:
Entonces, el primer parámetro básicamente ''inicializa'' la papelera: estoy creando específicamente un número que se encuentra entre el rango que establecí en el parámetro de contenedores.
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 (del primer conjunto) se encuentra entre 0 y 10 (en el conjunto ''bins'')
- El número 11 (del primer conjunto) cae entre 11 y 20 (en el conjunto ''bins'')
- El número 21 (de la primera matriz) se encuentra entre 21 y 30 (en la matriz ''bins''), 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].
Por lo tanto, al contenedor de 0 a 10 se le asigna el valor 10, el contenedor de 11 a 20 recibe el valor de 1, el contenedor de 21 a 30 recibe el valor de 40, etc.