[英]Python matplotlib stacked bar chart -- strange results
我正在嘗試使用 Python 的 matplotlib 庫在同一個圖上繪制四個堆疊條形圖。
對於每個觀察(obs1、obs2、obs3、obs4),我想使用堆積條形圖查看每個分量(c1、c2、c3、c4、c5、c6)的數量。 這是我寫的代碼:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = np.array([[-904., 97., 59., 5., 252., 138.], [-603., 65., 0., 29., 0., 0.], [-571., -27., 0., -28., 0., 0.], [-80., 40., 0., -9., 0., 0.]])
data2 = pd.DataFrame(data=data)
data2.index = ['obs1', 'obs2', 'obs3', 'obs4']
data2.columns = ['c1', 'c2', 'c3', 'c4', 'c5', 'c6']
ind = np.arange(4)
width = 0.4
p1 = plt.bar(ind, data2['c1'], width)
p2 = plt.bar(ind, data2['c2'], width)
p3 = plt.bar(ind, data2['c3'], width)
p4 = plt.bar(ind, data2['c4'], width)
p5 = plt.bar(ind, data2['c5'], width)
p6 = plt.bar(ind, data2['c6'], width)
plt.legend((p1[0], p2[0], p3[0], p4[0], p5[0], p6[0]), tuple(data2.columns), bbox_to_anchor = (1.05, 1), loc = 'upper left', borderaxespad = 0.)
為清楚起見,這是 DataFrame(用於生成繪圖):
print(data2)
c1 c2 c3 c4 c5 c6
obs1 -904.0 97.0 59.0 5.0 252.0 138.0
obs2 -603.0 65.0 0.0 29.0 0.0 0.0
obs3 -571.0 -27.0 0.0 -28.0 0.0 0.0
obs4 -80.0 40.0 0.0 -9.0 0.0 0.0
這是情節:
請注意該圖,obs1 的條在 x=0 處,obs2 的條在 x=1 處,依此類推。
但是,有兩個問題:
obs1 的組件 5 的值為 252,但組件 5(紫色)的高度大大低於 252。我該如何解決這個問題?
obs3 對於分量 2 的值為 -27,但這根本沒有顯示在圖中。 我該如何解決這個問題?
謝謝。
這是因為在繪圖時,y 值參考取自y=0
,因此 obs1 組件 5 的紫色條實際上從y=0
跨越到y=252
,並且它被組件 6 的條擋住了(稍后繪制) ) 由於順序性質,matplotlib 繪制了條形塊。
類似地,出於同樣的原因,obs3 組件 2 未顯示。
要獲得您想要的堆疊條形圖,您可以使用 Pandas 繪圖界面簡單地繪圖:
fig, ax = plt.subplots(1,1,figsize=(6,4))
data2.plot(kind='bar', stacked=True, ax=ax)
ax.set_xticklabels(ax.get_xticklabels(), rotation=0)
plt.show()
這給了你你想要的東西:
附帶說明一下,我建議為每個組件繪制一個單獨的條形圖,因為它們的比例非常不同,這將使跨觀察的組件級別比較更加清晰:
fig, ax = plt.subplots(1, 6, figsize=(20,4))
for index, col in enumerate(data2.columns):
data2[col].plot(kind='bar', ax=ax[index], color=f'C{index}', title=f'{col}')
ax[index].grid(True)
ax[index].set_xticklabels(ax[index].get_xticklabels(), rotation=0)
plt.show()
這給了你:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.