条形分组时显示条形值
Posted
技术标签:
【中文标题】条形分组时显示条形值【英文标题】:display value of bars when bars are grouped 【发布时间】:2020-11-22 23:31:06 【问题描述】:虽然在 *** 上有很多关于向单个条形添加值的答案,但我找不到合适的方法来向我的分组条形添加精确值。这就是我创建条形图的方式:
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')
并从子类别 func 中传递了bars
,但它给了我一个错误
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 但没有用。
采用上述两种方法中的任何一种的解决方案都可能会有所帮助。注意:我正在寻找编辑现有函数的方法。
【问题讨论】:
这能回答你的问题吗? Plotting a dictionary ***.com/questions/63220988 不,它没有。我正在寻找一种在现有函数中添加标签的方法。第二个链接是关于seaborn。我正在使用matplotlib。 @TrentonMcKinney 【参考方案1】:您可以直接从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()
【讨论】:
以上是关于条形分组时显示条形值的主要内容,如果未能解决你的问题,请参考以下文章
Python使用seaborn可视化分组条形图并且在分组条形图的条形上添加数值标签(seaborn grouped bar plot add labels)