Come disegnare due istogrammi impilati fianco a fianco con Matplotlib/Seaborn

Aug 19 2020

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

1 PéterLeéh Aug 19 2020 at 16:25

Beh, penso che plt.barsia la soluzione migliore qui. Per creare istogrammi in pila, puoi usare il suo bottomargomento. Per visualizzare due grafici a barre affiancati è possibile spostare i xvalori 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:

BossaNova Aug 19 2020 at 16:05

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')