Matplotlib / Seaborn ile yan yana iki yığılmış histogram nasıl çizilir

Aug 19 2020

Aşağıdaki kodu kullanarak birkaç yığılmış histogram çiziyorum. Her ikisi için de aynı bölme kenarlarını kullanıyorum, böylece güzelce hizalılar.

Bunların aynı grafikte görüntülenmesini nasıl sağlayabilirim? Yani her bölme için yeşil / kırmızı ve mavi / turuncu bir çubuk - yan yana.

Buna benzer çok sayıda soru ve cevap gördüm, bu bir çubuk grafik kullanmayı ve çubukların genişliğini hesaplamayı öneriyor, ancak bu, en azından matplotlib'de kutudan çıkar çıkmaz desteklenmesi gereken bir şey gibi görünüyor.

Ayrıca, istiflenmiş histogramları doğrudan seaborn ile çizebilir miyim? Bir yolunu bulamadım.

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)

Yanıtlar

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

Sanırım plt.barburadaki en iyi bahsiniz. Yığılmış histogramlar oluşturmak için bottomargümanını kullanabilirsiniz . İki çubuk grafiği yan yana görüntülemek için , bu orijinal matplotlib örneğinde olduğu gibi xdeğerleri bir miktar kaydırabilirsiniz :width

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

Bu şunu döndürür:

BossaNova Aug 19 2020 at 16:05

Aşağıda, her bölme için yan yana ayrı bir yere sahip olan 2 histogram için basit bir örnek (histogramlar yığılmamıştır) verilmiştir:

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