python - 注释堆叠的 barplot matplotlib 和 pandas
问题描述
我有一个简单的数据框来存储调查结果。这些列是:
| Age | Income | Satisfaction |
它们都包含介于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)
但是,如果 的green
子集(百分比)Age-0
高于Age-2
. 因此,有没有办法在条形图的每个子部分的顶部添加百分比。像这样的东西,但对于每一个酒吧:
解决方案
一种选择是迭代补丁以获得它们的宽度、高度和左下角坐标,并使用这些值将标签放置在相应条的中心。
为此,必须存储 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,但这可以很容易地修改。
使用此代码生成的输出图如下:
推荐阅读
- node.js - Node JS - 从 NODEJS 中的锚标记获取数据
- docker - 如何在 Jenkins 内的 docker 内运行节点测试
- shell - 禁用音频插孔 Raspberry Pi
- java - 地图定位。全球定位系统
- python - SVM - 检测恶意软件流量
- reactjs - 在异步 api 之后使用反应钩子中的 setter 函数调用设置带有对象数组的空数组时出现问题
- python - 为什么我的 Flash 消息没有显示正确的颜色和按钮?
- c# - 在 C# 中请求 API 信息
- extract - 如何从相交的 VCF 文件中找到编码区域?
- javascript - 在 iOS/Android 上工作的打印按钮(仅在移动设备上)