我具有层次结构的数据,想创建带有多组条形图的图。
import pandas as pd
data = [
['alpha', 'x', 1],
['alpha', 'y', 2],
['alpha', 'z', 2],
['beta', 'x', 3],
['beta', 'z', 4]]
df = pd.DataFrame(data, columns=['P','Q','R'])
df.pivot('P','Q','R').plot.bar(rot=0)
此代码产生:
我如何:
答案 0 :(得分:2)
如果您“手动”创建情节怎么办?您可以使用loc
进行过滤。然后在同一张图上绘制。
使用索引值可以实现空间魔术。请注意,在beta
中,我在索引中添加了+1,以创建额外的空间。然后,我将两个索引合并到xticks
中,然后简单地使用df['Q']
作为标签。
plt.bar(data=df.loc[df['P']=='alpha'], x=df.loc[df['P']=='alpha'].index, height='R', label='alpha')
plt.bar(data=df.loc[df['P']=='beta'], x=df.loc[df['P']=='beta'].index+1, height='R', label='beta')
plt.xticks(df.loc[df['P']=='alpha'].index.tolist() + list(df.loc[df['P']=='beta'].index+1),df['Q'].tolist())
plt.legend()
答案 1 :(得分:1)
这是受@MattR答案的启发,该答案告诉我从头开始绘制条形不是火箭科学。熊猫groupby()
似乎是一个很好的工具。
最后,我希望组之间没有多余的空间。
labels = []
for g, grp in df.groupby('P'):
plt.bar(grp.index, grp.R, label=g)
labels.extend(grp.Q)
plt.xticks(df.index, labels)
plt.legend()
答案 2 :(得分:0)
我不确定是否要清除空单元格,但可以使用 stacked 参数获取输出,还可以,您可以将颜色数组传递给bar 方法会相应显示颜色。
import pandas as pd
data = [
['alpha', 'x', 1],
['alpha', 'y', 2],
['alpha', 'z', 2],
['beta', 'x', 3],
['beta', 'z', 4]]
df = pd.DataFrame(data, columns=['P','Q','R'])
df.pivot('P','Q','R').plot.bar(rot=0, stacked=True,color = ['blue', 'green', 'red'])
我希望这会有所帮助。