簡體   English   中英

Python matplotlib堆積條形圖——奇怪的結果

[英]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 處,依此類推。

但是,有兩個問題:

  1. obs1 的組件 5 的值為 252,但組件 5(紫色)的高度大大低於 252。我該如何解決這個問題?

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM