注释堆叠的barplot matplotlib和熊猫

Tit*_*llo 2 python matplotlib bar-chart pandas

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

| Age | Income | Satisfaction |
Run Code Online (Sandbox Code Playgroud)

它们都包含1和之间的值5(分类)。我设法生成了一个堆积的条形图,该图显示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)
Run Code Online (Sandbox Code Playgroud)

这将生成以下所需的图: 在此处输入图片说明

但是,很难比较的green子集(百分比)Age-0是否高于中的子集(百分比)Age-2。因此,有一种方法可以将百分比添加到条形图的每个子部分的顶部。像这样,但对于每个单独的小节: 在此处输入图片说明

Ori*_*ril 12

一种选择是遍历小块,以获得小块的宽度,高度和左下角坐标,然后使用此值将标签放置在相应条的中心。

为此,必须存储熊猫杆方法返回的轴。

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')
Run Code Online (Sandbox Code Playgroud)

此处,带注释的值设置为0小数,但可以轻松修改。

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

在此处输入图片说明

  • 使用此方法,当每列具有不同高度时,如何计算百分比(列补丁不会添加到 100 - 不代表百分比) (2认同)