Tamaño del contenedor en matplotlib (histogtwig)

Estoy usando matplotlib para hacer un histogtwig.

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 dar una lista con los límites de los contenedores. 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)) 

Añadido a la respuesta original

La línea de arriba funciona solo para data rellenados con enteros. Como señala el macrocosme , para flotadores puedes usar:

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

Para los contenedores N, los bordes del contenedor se especifican mediante una lista de valores N + 1 donde la primera N da los bordes del contenedor inferior y el +1 proporciona el borde superior 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 una matriz desde min_edge a max_edge dividida en N + 1 valores o N bandejas

Supongo que la forma más fácil sería calcular el mínimo y el máximo de los datos que tiene, luego calcular L = max - min . Luego divide la L por el ancho de la bandeja deseada (supongo que esto es lo que quiere decir con el tamaño de la bandeja) y utiliza el límite máximo de este valor como el número de ubicaciones.

Tuve el mismo problema que OP (¡creo!), Pero no pude hacerlo funcionar de la manera que especificó Lastalda. No sé si he interpretado la pregunta correctamente, pero he encontrado otra solución (aunque probablemente sea una forma muy 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:

Imagen que muestra el gráfico del histograma creado en matplotlib.

Entonces, el primer parámetro básicamente ‘inicializa’ el contenedor – estoy creando específicamente un número que se encuentra entre el rango que establezco en el parámetro de contenedores.

Para demostrar esto, mire la matriz en el primer parámetro ([1,11,21,31,41]) y la matriz de ‘bandejas’ en el segundo parámetro ([0,10,20,30,40,50]) :

  • El número 1 (de la primera matriz) se encuentra entre 0 y 10 (en la matriz ‘bins’)
  • El número 11 (de la primera matriz) se ubica entre 11 y 20 (en la matriz ‘bandejas’)
  • El número 21 (de la primera matriz) se sitúa entre 21 y 30 (en la matriz de ‘bandejas’), etc.

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

Por lo tanto, a la celda de 0 a 10 se le asigna el valor 10, a la boleta de 11 a 20 se le asigna el valor de 1, a la papelera de 21 a 30 se le asigna el valor de 40, etc.

Me gusta que las cosas sucedan automáticamente y que los contenedores caigan en valores “buenos”. Lo siguiente parece funcionar bastante bien.

 import numpy as np import numpy.random as random import matplotlib.pyplot as plt def compute_histogram_bins(data, desired_bin_size): min_val = np.min(data) max_val = np.max(data) min_boundary = -1.0 * (min_val % desired_bin_size - min_val) max_boundary = max_val - max_val % desired_bin_size + desired_bin_size n_bins = int((max_boundary - min_boundary) / desired_bin_size) + 1 bins = np.linspace(min_boundary, max_boundary, n_bins) return bins if __name__ == '__main__': data = np.random.random_sample(100) * 123.34 - 67.23 bins = compute_histogram_bins(data, 10.0) print(bins) plt.hist(data, bins=bins) plt.xlabel('Value') plt.ylabel('Counts') plt.title('Compute Bins Example') plt.grid(True) plt.show() 

El resultado tiene intervalos en intervalos agradables de tamaño de contenedor.

 [-70. -60. -50. -40. -30. -20. -10. 0. 10. 20. 30. 40. 50. 60.] 

histograma de cubos computados

Para un histogtwig 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 los intervalos en los valores del eje x. La llamada plt.xticks agrega una marca para cada entero.