HOWTO · Matplotlib

Cómo ajustar manualmente el ancho de los intervalos de un histograma en Matplotlib

Para controlar el ancho de los intervalos de un histograma unidimensional de Matplotlib, pasa los datos y una secuencia de límites a `plt.hist(..., bins=...)`.

En esta página

Para controlar los anchos de los intervalos en un histograma unidimensional de Matplotlib, pasa los datos y una secuencia de límites a plt.hist(..., bins=...). Cada par de valores de límite consecutivos define un intervalo, por lo que la secuencia puede crear intervalos del mismo ancho o de anchos distintos. hist2d() se usa para histogramas bidimensionales; aquí los ejemplos usan plt.hist().

Límites de los intervalos como parámetro de la función hist()

Usa una secuencia de límites cuando quieras elegir dónde empiezan y terminan los intervalos. Por ejemplo, [0, 10, 20, 30, 40, 50, 60, 80, 100] crea ocho intervalos: los seis primeros tienen un ancho de 10 y los dos últimos, un ancho de 20. El número de intervalos es uno menos que el número de límites. Los valores fuera del primer y del último límite no se cuentan en el histograma, así que elige un rango que abarque las observaciones que quieras incluir.

Si todos los intervalos deben tener el mismo ancho, genera límites espaciados regularmente con np.arange. El ejemplo siguiente compara los límites elegidos con límites equidistantes para los mismos valores. Como np.arange(start, stop, step) incluye start y excluye stop, el valor de parada debe ser mayor que la observación más alta para que esta quede dentro del rango.

import matplotlib.pyplot as plt
import numpy as np

values = np.array([3, 8, 12, 18, 24, 31, 37, 43, 52, 61, 74, 88, 96])
width = 10
explicit_edges = [0, 10, 20, 30, 40, 50, 60, 80, 100]
equal_edges = np.arange(0, 101, width)

fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].hist(values, bins=explicit_edges)
axes[0].set_title("Chosen boundaries")
axes[1].hist(values, bins=equal_edges)
axes[1].set_title("Equal-width bins")
for axis in axes:
    axis.set_xlabel("Value")
    axis.set_ylabel("Count")
fig.tight_layout()
plt.show()

Tamaño de los intervalos de Matplotlib al pasar una lista como parámetro

Para obtener intervalos del mismo ancho a partir de los datos, una opción práctica es usar max(values) + width como valor de parada. Como np.arange excluye el valor de parada, este no se convierte en un límite. Con estos valores, la parada es 106 y el último límite generado es 100, que sigue abarcando la observación máxima de 96. Si cambia el rango o el ancho, calcula los límites a partir de los datos actuales en vez de conservar una lista fija.

Intervalos equidistantes en Matplotlib al pasar una lista como parámetro

Calcular el número de intervalos a partir del ancho deseado

Si el rango de los datos solo se conoce cuando se ejecuta el programa, deriva el primer y el último límite de las observaciones. Este ejemplo redondea el primer límite hacia abajo hasta un múltiplo del ancho solicitado y amplía el límite final hasta un múltiplo igual o superior al valor máximo. Supone que el conjunto de datos contiene valores numéricos y no está vacío, y que el ancho es positivo. Los intervalos de los extremos pueden sobrepasar el rango de los datos; la separación entre cada par de límites consecutivos seguirá siendo el ancho solicitado.

import matplotlib.pyplot as plt
import numpy as np

values = np.array([3, 8, 12, 18, 24, 31, 37, 43, 52, 61, 74, 88, 96])
width = 10.0
first_edge = np.floor(values.min() / width) * width
last_edge = np.ceil(values.max() / width) * width
edges = np.arange(first_edge, last_edge + width, width)

plt.hist(values, bins=edges)
plt.xlabel("Value")
plt.ylabel("Count")
plt.title(f"Histogram with bin width {width:g}")
plt.show()

Calcular el número de intervalos a partir del ancho dado

Aquí, el mínimo es 3 y el máximo es 96, por lo que los límites generados van de 0 a 100 en pasos de 10. Las observaciones se cuentan en esos intervalos y el histograma trazado usa el ancho solicitado. Para usar otro ancho, actualiza width; el mismo cálculo genera la secuencia de límites correspondiente. Si los datos están vacíos o el ancho no es positivo, gestiona ese caso antes de calcular los límites.