Estoy usando matplotlib para hacer un histograma.
¿Hay alguna forma de establecer manualmente el tamaño de los contenedores en lugar del número de contenedores?
python
matplotlib
histogram
Sam Creamer
fuente
fuente
(data.max() - data.min()) / number_of_bins_you_want
. Se+ binwidth
podría cambiar a solo1
para hacer de este un ejemplo más fácil de entender.lw = 5, color = "white"
o similar inserta espacios en blanco entre las barrasPara N bins, los bordes del bin se especifican mediante una lista de valores de N + 1 donde el primer N da los bordes inferiores del bin y el +1 da el borde superior del último bin.
Código:
Tenga en cuenta que linspace produce una matriz de min_edge a max_edge dividida en valores N + 1 o N bins
fuente
Supongo que la manera fácil sería calcular el mínimo y el máximo de los datos que tiene, luego calcular
L = max - min
. Luego se divideL
por el ancho del contenedor deseado (supongo que esto es lo que quiere decir con el tamaño del contenedor) y usa el límite máximo de este valor como el número de contenedores.fuente
Me gusta que las cosas sucedan automáticamente y que los contenedores caigan en valores "agradables". Lo siguiente parece funcionar bastante bien.
El resultado tiene contenedores en intervalos agradables de tamaño de contenedor.
fuente
desired_bin_size=0.05
,min_boundary=0.850
,max_boundary=2.05
el cálculo de losn_bins
convierte enint(23.999999999999993)
los cuales los resultados en 23 en lugar de 24 y, por tanto, una bandeja muy pocos. Un redondeo antes de la conversión de enteros funcionó para mí:n_bins = int(round((max_boundary - min_boundary) / desired_bin_size, 0)) + 1
Utilizo cuantiles para hacer contenedores uniformes y ajustados a la muestra:
fuente
np.arange(0, 1.01, 0.5)
onp.linspace(0, 1, 21)
. No hay bordes, pero entiendo que las cajas tienen el mismo área, pero diferente ancho en el eje X?Tuve el mismo problema que OP (¡creo!), Pero no pude hacer que funcionara de la manera que Lastalda especificó. No sé si he interpretado la pregunta correctamente, pero he encontrado otra solución (aunque probablemente sea una forma realmente mala de hacerlo).
Así fue como 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' el bin: específicamente estoy creando un número que está entre el rango que configuré 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]) :
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 pesos: [10,1,40,33,6].
Entonces, el bin de 0 a 10 recibe el valor 10, el bin de 11 a 20 recibe el valor de 1, el bin de 21 a 30 recibe el valor de 40, etc.
fuente
Para un histograma con valores x enteros, terminé usando
El desplazamiento de 0.5 centra los bins en los valores del eje x. La
plt.xticks
llamada agrega una marca para cada número entero.fuente