Cómo dibujar dos histogramas apilados uno al lado del otro con Matplotlib/Seaborn
Estoy dibujando un par de histogramas apilados usando el siguiente código. Estoy usando los mismos bordes del contenedor para ambos, por lo que están bien alineados.
¿Cómo puedo hacer que se muestren en el mismo gráfico? Es decir, una barra verde/roja y una azul/naranja por cada contenedor, una al lado de la otra.
Vi muchas preguntas y respuestas similares a esta que sugerían usar un gráfico de barras y calcular el ancho de las barras, pero esto parece algo que debería admitirse de forma inmediata, al menos en matplotlib.
Además, ¿puedo dibujar histogramas apilados directamente con seaborn? No pude encontrar una manera.
plt.hist( [correct_a, incorrect_a], bins=edges, stacked=True, color=['green', 'red'], rwidth=0.95, alpha=0.5)

plt.hist( [correct_b, incorrect_b], bins=edges, stacked=True, color=['green', 'red'], rwidth=0.95, alpha=0.5)

Respuestas
Bueno, creo que plt.bares tu mejor apuesta aquí. Para crear histogramas apilados, puede usar su bottom
argumento. Para mostrar dos gráficos de barras uno al lado del otro, puede cambiar los x
valores un poco width
, como en este ejemplo original de matplotlib:
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(16, 8))
correct_a = np.random.randint(0, 20, 20)
incorrect_a = np.random.randint(0, 20, 20)
correct_b = np.random.randint(0, 20, 20)
incorrect_b = np.random.randint(0, 20, 20)
edges = len(correct_a)
width=0.35
rects1 = ax.bar(np.arange(edges), incorrect_a, width, color="red", label="incorrect_a")
rects2 = ax.bar(np.arange(edges), correct_a, width, bottom=incorrect_a, color='seagreen', label="correct_a")
rects3 = ax.bar(np.arange(edges) + width, incorrect_b, width, color="blue", label="incorrect_b")
rects4 = ax.bar(np.arange(edges) + width, correct_b, width, bottom=incorrect_b, color='orange', label="correct_b")
# placing the ticks to the middle
ticks_aligned = np.arange(edges) + width // 2
ax.set_xticks(np.arange(edges) + width / 2)
ax.set_xticklabels((str(tick) for tick in ticks_aligned))
ax.legend()
Esto devuelve:
Aquí hay un ejemplo simple (los histogramas no están apilados) para 2 histogramas que se muestran juntos y cada contenedor tiene un lugar dedicado para cada uno de ellos uno al lado del otro:
# generating some data for this example:
a = [1,2,3,4,3,4,2,3,4,5,4,3,4,5,4,1,2,3,2,1,3,4,5,6,7,6,5,4,3,4,6,5,4,3,4]
b = [1,2,3,4,5,6,7,6,5,6,7,6,5,4,3,4,5,6,7,6,7,6,7,5,4,3,2,1,3,4,5,6,5,6,5,6,7,6,7]
# plotting 2 histograms with bars centered differently within each bin:
plt.hist(a, bins=5, align='left', rwidth=0.5)
plt.hist(b, bins=5, align='mid', rwidth=0.5, color='r')