我正在尝试使用matplotlib
创建水平堆积条形图,但我看不到如何使条形实际堆叠而不是从y轴开始。
这是我的测试代码。
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()
在看到tcaswell的评论后编辑使用left
kwarg。
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 :(得分:8)
既然您正在使用熊猫,那么值得一提的是您可以在本地进行堆积条形图:
df2.plot(kind='bar', stacked=True)
答案 1 :(得分: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()
答案 2 :(得分:4)
作为旁注,您可以通过以下方式将重复代码包装在循环中:
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
模数据卫生
答案 3 :(得分:3)
还有另一个很好的答案,在Stack Overflow中。 它会在附加到列表中时绘制Hbars! Go to answer.
答案 4 :(得分:0)
这是一个简单的堆叠水平条形图,显示等待时间和运行时间。
from datetime import datetime
import matplotlib.pyplot as plt
jobs = ['JOB1','JOB2','JOB3','JOB4']
# input wait times
waittimesin = ['03:20:50','04:45:10','06:10:40','05:30:30']
# converting wait times to float
waittimes = []
for wt in waittimesin:
waittime = datetime.strptime(wt,'%H:%M:%S')
waittime = waittime.hour + waittime.minute/60 + waittime.second/3600
waittimes.append(waittime)
# input run times
runtimesin = ['00:20:50','01:00:10','00:30:40','00:10:30']
# converting run times to float
runtimes = []
for rt in runtimesin:
runtime = datetime.strptime(rt,'%H:%M:%S')
runtime = runtime.hour + runtime.minute/60 + runtime.second/3600
runtimes.append(runtime)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.barh(jobs, waittimes, align='center', height=.25, color='#00ff00',label='wait time')
ax.barh(jobs, runtimes, align='center', height=.25, left=waittimes, color='g',label='run time')
ax.set_yticks(jobs)
ax.set_xlabel('Hour')
ax.set_title('Run Time by Job')
ax.grid(True)
ax.legend()
plt.tight_layout()
#plt.savefig('C:\\Data\\stackedbar.png')
plt.show()
答案 5 :(得分:-1)
使用Map
和add operator
添加所有元素也是可能的(并且非常容易)。正如问题Element-wise Addition of 2 Lists in Python?中已经回答的那样。或者只使用numpy数组。