python - 条形分组时显示条形值
问题描述
虽然在 stackoverflow 上有很多答案可以向单个条形添加值,但我找不到合适的方法来向我的分组条形添加精确值。这就是我创建条形图的方式:
labels = ['<20','20-29', '30-39','40-49','50-59','60-69','70-79','80+']
maleAges = (malesUnder20, males20To30, males30To40)
femaleAges = (femalesUnder20, females20To30,males30To40)
# bars = []
def subcategorybar(X, vals, width=0.8):
n = len(vals)
_X = np.arange(len(X))
for i in range(n):
bar = plt.bar(_X - width/2. + i/float(n)*width, vals[i],
width=width/float(n), align="edge")
bars.append(bar)
plt.xticks(_X, X)
subcategorybar(labels, [maleAges, femaleAges])
我尝试使用此功能
def autolabel(rects):
for rect in rects:
height = rect.get_height()
ax.text(rect.get_x() + rect.get_width()/2., 1.05*height,
'%d' % int(height),
ha='center', va='bottom')
并bars
从子类别 func 中传递,但它给了我一个错误
AttributeError: 'BarContainer' object has no attribute 'get_height'
另一种方法是使用 plt.text 和 plt.annotate 但在这种特殊情况下,我无法找出两者的正确参数。
编辑:
我绘制图表的第二种方式是这样的:
N = 3
labels = ['<20','20-29', '30-39','40-49']
maleAges = (malesUnder20, males20To30, males30To40)
femaleAges = (femalesUnder20, females20To30,males30To40)
ind = np.arange(N)
width = 0.35
plt.figure(figsize=(10,5))
plt.bar(ind, maleAges , width, label='Male')
plt.bar(ind + width, femaleAges, width, label='Female')
plt.xticks(ind + width / 2, ('<20','20-29', '30-39'))
plt.legend(loc='best')
plt.show()
我也尝试在这里使用 plt.annotations 但没有奏效。
使用上述两种方法中的任何一种的解决方案都可能会有所帮助。注意:我正在寻找编辑现有函数的方法。
解决方案
您可以直接从axes
补丁中执行此操作:
for p in axes.patches:
axes.annotate(s=np.round(p.get_height(), decimals=2),
xy=(p.get_x()+p.get_width()/2., p.get_height()),
ha='center',
va='center',
xytext=(0, 10),
textcoords='offset points')
对您的示例的影响:
import numpy as np
import matplotlib.pyplot as plt
N = 3
labels = ['<20','20-29', '30-39','40-49']
maleAges = (1, 2, 3)
femaleAges = (1, 3, 4)
ind = np.arange(N)
width = 0.35
figure, axes = plt.subplots()
plt.bar(ind, maleAges , width, label='Male')
plt.bar(ind + width, femaleAges, width, label='Female')
plt.xticks(ind + width / 2, ('<20','20-29', '30-39'))
for p in axes.patches:
axes.annotate(s=np.round(p.get_height(), decimals=2),
xy=(p.get_x()+p.get_width()/2., p.get_height()),
ha='center',
va='center',
xytext=(0, 10),
textcoords='offset points')
plt.legend(loc='best')
plt.show()
推荐阅读
- node.js - heroku 和 node.js 没有找到带有请求模块的 php 文件
- python - 如何在 Python 中仅读取/选择输入的一部分?
- python - 如何使用 Python 在 Windows 中处理带有空格的长路径
- javascript - Browserify npm 库
- python - python .timestamp() 方法计算不同时区的错误(或相同)unix 时间
- android - 是否可以在调试模式下运行 Crashlytics?
- flutter - 哪个是更快和性能更好的 Provider、bloc 模式还是 flutter_redux?
- c# - 如何设置属性消息组 ID
- amazon-web-services - AWS Lambda 和 Dynamo db:如何通过多个参数过滤扫描结果?
- sql-server - '=' 附近的语法不正确