注释堆积的barplot matplotlib和熊猫

时间:2018-05-03 17:27:28

标签: python pandas matplotlib bar-chart

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

| 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

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

1 个答案:

答案 0 :(得分:8)

一种选择是迭代补丁以获得它们的宽度,高度和左下角坐标,并使用此值将标签放置在相应柱的中心。

为此,必须存储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.text(x+width/2, 
            y+height/2, 
            '{:.0f} %'.format(height), 
            horizontalalignment='center', 
            verticalalignment='center')

这里,注释值设置为0小数,但这很容易修改。

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

enter image description here