组不相等的熊猫条形图

时间:2020-01-22 15:10:40

标签: python pandas matplotlib

我具有层次结构的数据,想创建带有多组条形图的图。

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)

此代码产生:

code output

我如何:

  1. 消除缺失栏的空间,即容纳具有不同数量栏的组吗?
  2. 将所有的alpha设置为蓝色,将beta设置为橙色,即按组而不是按组循环显示颜色?

3 个答案:

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

enter image description here

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

enter image description here

答案 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'])

enter image description here

我希望这会有所帮助。