Come disegnare due istogrammi impilati fianco a fianco con Matplotlib/Seaborn
Sto disegnando un paio di istogrammi impilati usando il codice qui sotto. Sto usando gli stessi bordi del cestino per entrambi in modo che siano ben allineati.
Come posso visualizzarli sullo stesso grafico? Vale a dire una barra verde/rossa e una blu/arancione per ogni contenitore, una accanto all'altra.
Ho visto molte domande e risposte simili a questa che suggeriscono di utilizzare un grafico a barre e calcolare la larghezza delle barre, ma questo sembra qualcosa che dovrebbe essere supportato immediatamente, almeno in matplotlib.
Inoltre, posso disegnare istogrammi impilati direttamente con Seaborn? Non sono riuscito a trovare un modo.
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)

Risposte
Beh, penso che plt.barsia la soluzione migliore qui. Per creare istogrammi in pila, puoi usare il suo bottom
argomento. Per visualizzare due grafici a barre affiancati è possibile spostare i x
valori di some width
, proprio come in questo esempio matplotlib originale:
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()
Questo restituisce:
Ecco un semplice esempio (gli istogrammi non sono impilati) per 2 istogrammi visualizzati insieme a ciascun bin con un posto dedicato per ciascuno di essi affiancato:
# 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')