我在数据框下方,并且我想为“关闭” /“打开”状态绘制堆叠的条形图。
state requests
created
2016-09-28 OPEN 1
2017-02-03 OPEN 1
2017-06-15 CLOSED 1
2017-06-15 OPEN 1
2017-06-16 CLOSED 2
2017-08-23 OPEN 1
2017-10-25 OPEN 1
2018-01-19 OPEN 1
2018-03-01 OPEN 1
2018-03-05 OPEN 1
2018-06-12 OPEN 1
2018-06-15 OPEN 1
我尝试了以下操作(df_temp是上述数据的数据帧)
fig,ax = plt.subplots()
ax.set_ylabel('Requests')
df_closed = df_temp[df_temp['state'] == 'CLOSED']
df_open = df_temp[df_temp['state'] == 'OPEN']
b = ax.bar(x = df_open.index.get_level_values(0), height = df_open['requests'])
a = ax.bar(x = df_closed.index.get_level_values(0), height = df_closed['requests'],bottom = df_open['requests'])
但这给我错误
ValueError: shape mismatch: objects cannot be broadcast to a single shape
编辑:
解决方案Marco建议使用作品,但是如果有很多“状态”,该怎么办。例如,如果有10个不同的状态,那么我们可以通过循环或其他方式绘制它。我还在寻找其他问题,这些地方使用了ivot_table和unstack(),我不确定如何在这里使用它。
答案 0 :(得分:2)
由于您在堆叠条形图之前一行提到了熊猫枢轴功能-you can transform your dataset with it:
df_temp.pivot(columns = "state", values = "requests").plot(kind = "bar", stacked = True)
现在,我们还可以美化图表-标记y轴,旋转x刻度标签:
plt.ylabel("Requests")
plt.xticks(rotation = 45, ha = "right")
plt.tight_layout()
plt.show()
答案 1 :(得分:1)
我在这里发布了正确的答案,因为它可能比继续发表评论容易。这还包括进一步的情况(在注释中提出),其中state
中可能存在一组任意的,未知的值。
fig, ax = plt.subplots()
index = df_temp.index.unique()
cumsum = pd.Series(0, index=index)
for s in df.state.unique():
new_vals = df_temp.loc[df.state == s, 'requests'].reindex(index).fillna(0)
ax.bar(index, new_vals, bottom = cumsum)
cumsum += new_vals
ax.set_ylabel('Requests')
这应该照顾好一切。在每个斧头中,我可能还会在末尾放置一个label=s
并添加一个ax.legend()
以将每种结果颜色映射为一种状态。