Nota
Haga clic aquí para descargar el código de ejemplo completo
Producción de múltiples histogramas uno al lado del otro #
Este ejemplo traza histogramas horizontales de diferentes muestras a lo largo de un eje x categórico. Además, los histogramas se trazan para que sean simétricos con respecto a su posición x, lo que los hace muy similares a los trazados de violín.
Para hacer este diagrama altamente especializado, no podemos usar el hist
método estándar. En su lugar, usamos barh
para dibujar las barras horizontales directamente. Las posiciones verticales y las longitudes de las barras se calculan a través de la
np.histogram
función. Los histogramas para todas las muestras se calculan utilizando el mismo rango (valores mínimo y máximo) y el número de contenedores, de modo que los contenedores para cada muestra estén en las mismas posiciones verticales.
La selección de diferentes recuentos y tamaños de contenedores puede afectar significativamente la forma de un histograma. Los documentos de Astropy tienen una gran sección sobre cómo seleccionar estos parámetros: http://docs.astropy.org/en/stable/visualization/histogram.html
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(19680801)
number_of_bins = 20
# An example of three data sets to compare
number_of_data_points = 387
labels = ["A", "B", "C"]
data_sets = [np.random.normal(0, 1, number_of_data_points),
np.random.normal(6, 1, number_of_data_points),
np.random.normal(-3, 1, number_of_data_points)]
# Computed quantities to aid plotting
hist_range = (np.min(data_sets), np.max(data_sets))
binned_data_sets = [
np.histogram(d, range=hist_range, bins=number_of_bins)[0]
for d in data_sets
]
binned_maximums = np.max(binned_data_sets, axis=1)
x_locations = np.arange(0, sum(binned_maximums), np.max(binned_maximums))
# The bin_edges are the same for all of the histograms
bin_edges = np.linspace(hist_range[0], hist_range[1], number_of_bins + 1)
heights = np.diff(bin_edges)
centers = bin_edges[:-1] + heights / 2
# Cycle through and plot each histogram
fig, ax = plt.subplots()
for x_loc, binned_data in zip(x_locations, binned_data_sets):
lefts = x_loc - 0.5 * binned_data
ax.barh(centers, binned_data, height=heights, left=lefts)
ax.set_xticks(x_locations, labels)
ax.set_ylabel("Data values")
ax.set_xlabel("Data sets")
plt.show()
Referencias
En este ejemplo se muestra el uso de las siguientes funciones, métodos, clases y módulos: