2013-05-20 43 views
6

Tôi đang cố gắng tạo biểu đồ thanh xếp chồng ngang bằng cách sử dụng matplotlib nhưng tôi không thể thấy cách làm cho các thanh thực sự ngăn xếp thay vì tất cả bắt đầu trên trục y.Biểu đồ thanh xếp chồng đứng ngang trong Matplotlib

Đây là mã thử nghiệm của tôi.

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

Đã chỉnh sửa để sử dụng left kwarg sau khi xem nhận xét của 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() 

Điều này dường như là cách tiếp cận đúng, nhưng nó không thành công nếu không có dữ liệu cho một thanh đặc biệt như nó đang cố gắng để thêm nan đến một giá trị mà sau đó trả về nan.

+0

bạn cần sử dụng 'bottom' kwarg – tacaswell

+0

Điều đó cho tôi' TypeError: barh() có nhiều giá trị cho đối số từ khóa 'bottom''. Có vẻ như tôi cần sử dụng 'left'. Cảm ơn đã cho tôi đi đúng hướng. –

+0

ah, xin lỗi về điều đó. – tacaswell

Trả lời

4

Vì bạn đang sử dụng gấu trúc, nó là đáng nói rằng bạn có thể làm lô thanh xếp chồng lên nhau natively:

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

Xem visualisation section of the docs.

6

Đây là giải pháp, mặc dù tôi chắc chắn phải có cách tốt hơn để thực hiện. Phần series.fillna(0) thay thế bất kỳ nan với 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

trông giống như bên phải. Nếu bạn định sử dụng nó thường xuyên, có lẽ bạn nên viết mã lặp lại như một vòng lặp/hàm (xem câu trả lời của tôi) – tacaswell

3

Như một mặt lưu ý, bạn có thể quấn mã lặp đi lặp lại trong một vòng lặp thông qua:

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 

modulo dữ liệu vệ sinh

1

Có một câu trả lời tốt, ở đây trong Stack Overflow. Nó rút ra Hbars trong khi phụ thêm vào danh sách! Go to answer.

Other post's solution.

-1

của nó cũng có thể (và rất dễ dàng) để chỉ yếu tố khôn ngoan thêm tất cả các yếu tố bằng cách sử dụng Mapadd operator. Như đã được trả lời trong câu hỏi Element-wise Addition of 2 Lists in Python?. Hoặc chỉ sử dụng mảng numpy.

Các vấn đề liên quan