2013-05-20 134 views
6

我正在嘗試使用matplotlib創建水平堆疊條形圖,但我看不到如何使條形實際堆疊而不是全部在y軸上開始。Matplotlib中的水平堆積條形圖

這是我的測試代碼。

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
plot_chart(df, fig, ax) 
ind = arange(df.shape[0])  
ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00') 
ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00') 
ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0') 
ax.barh(ind, df['EndUse_80_nan'], color='#0070C0') 
plt.show() 

編輯使用left kwarg看到tcaswell的評論後。

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
plot_chart(df, fig, ax) 
ind = arange(df.shape[0])  
ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00') 
lefts = df['EndUse_91_1.0'] 
ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00', left=lefts) 
lefts = lefts + df['EndUse_91_1.0'] 
ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0', left=lefts) 
lefts = lefts + df['EndUse_91_1.0'] 
ax.barh(ind, df['EndUse_80_nan'], color='#0070C0', left=lefts) 
plt.show() 

這似乎是正確的做法,但如果是因爲它試圖添加nan的值,然後返回nan特定欄中沒有數據失敗。

+0

你需要使用'bottom' kwarg – tacaswell

+0

這就給我'TypeError:barh()爲關鍵字參數'bottom''獲得了多個值。好像我需要使用'left'。感謝您讓我走上正軌。 –

+0

啊,對不起。 – tacaswell

回答

4

由於您使用的熊貓,這是值得一提的是,你可以做本地疊置條曲線:

df2.plot(kind='bar', stacked=True) 

visualisation section of the docs

6

下面是一個解決方案,雖然我確定必須有更好的方法來做到這一點。該series.fillna(0)部分替換任何nan以0

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
plot_chart(df, fig, ax) 
ind = arange(df.shape[0])  
ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00') 
lefts = df['EndUse_91_1.0'].fillna(0) 
ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00', left=lefts) 
lefts = lefts + df['EndUse_91_1.0'].fillna(0) 
ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0', left=lefts) 
lefts = lefts + df['EndUse_91_1.0'].fillna(0) 
ax.barh(ind, df['EndUse_80_nan'], color='#0070C0', left=lefts) 
plt.show() 
+0

看起來正確。如果要定期使用它,可能需要將重複的代碼編寫爲循環/函數(請參閱我的答案) – tacaswell

3

作爲一個側面說明,你可以用在一個循環中通過重複代碼了:

data_lst = [df['EndUse_91_1.0'], ..] 
color_lst = ["FFFF00", ..] 
left = 0 
for data, color in zip(data_lst, color_lst): 
    ax.barh(ind, data, color=color, left=left) 
    left += data 

模數據衛生

1

還有一個很好的答案,在這裏堆棧溢出。 它附加在列表中繪製Hbars! Go to answer.

Other post's solution.