首页 文章

注释堆积的barplot matplotlib和pandas [重复]

提问于
浏览
1

这个问题在这里已有答案:

我有一个简单的数据框,用于存储调查结果 . 列是:

| Age | Income | Satisfaction |

所有这些都包含 15 (分类)之间的值 . 我设法生成一个堆积的条形图,显示不同年龄人群的 Satisfaction 值的分布 . 代码是:

#create a random df
data = []
for i in range(500):
    sample = {"age" : random.randint(0,5), "income" : random.randint(1,5), "satisfaction" : random.randint(1,5)}
data.append(sample)
df = pd.DataFrame(data)
#group by age
counter = df.groupby('age')['satisfaction'].value_counts().unstack()
#calculate the % for each age group 
percentage_dist = 100 * counter.divide(counter.sum(axis = 1), axis = 0)
percentage_dist.plot.bar(stacked=True)

这将生成以下所需的图:
enter image description here

但是,如果 Age-0green 子集(百分比)高于 Age-2 中的 green 子集(百分比),则很难进行比较 . 因此,是否有一种方法可以在条形图的每个子部分的顶部添加百分比 . 像这样的东西,但对于每一个酒吧:
enter image description here

1 回答

  • 3

    一种选择是迭代补丁以获得它们的宽度,高度和左下角坐标,并使用此值将标签放置在所需位置 .

    为此,必须存储pandas bar方法返回的轴 .

    ax = percentage_dist.plot.bar(stacked=True)
    for p in ax.patches:
        width, height = p.get_width(), p.get_height()
        x, y = p.get_xy() 
        ax.annotate('{:.0f} %'.format(height), (p.get_x()+.15*width, p.get_y()+.4*height))
    

    这里,注释值设置为0小数,胸部可以很容易地修改,以及文本的左下角位置,现在设置为贴片的左下角坐标加上宽度和高度的一些分数 .

    使用此代码生成的输出图如下:

    enter image description here

相关问题