循环绘制多组柱状图时,如何在柱子上方标注数值?
解决循环绘制柱状图时柱子上方标注数值的问题
问题分析
你的代码存在两个核心问题:
- 未在每次循环中创建新画布并清理旧绘图状态,导致元素叠加干扰标注渲染
- 使用
year is twenty这类对象身份判断不可靠,若数据对象有复制/重建会失效
修改后的代码
# 将年份与对应数据配对,避免不可靠的对象判断 year_data = [ ("2020", twenty), ("2021", twentyone), ("2022", twentytwo), ("2023", twentythree) ] for title, data in year_data: # 每次循环创建新画布,避免状态污染 plt.figure(figsize=(8, 6)) ax = sns.barplot(data=data, errorbar=None) # 设置图表基础属性 ax.set_ylim(0, 60) ax.set_xticklabels(ax.get_xticklabels(), rotation=45, horizontalalignment='right') ax.set_xlabel('Type of error') ax.set_title(title) # 遍历所有柱子容器,添加数值标注(支持格式控制) for container in ax.containers: ax.bar_label(container, fmt="%.1f", padding=3) # padding调整标注与柱子的间距 # 保存并清理画布 plt.tight_layout() plt.savefig(f'barplot_{title}.png', bbox_inches="tight") plt.close()
关键调整点
- 用元组列表绑定年份标题与对应数据,替代不可靠的
is判断 - 每次循环创建新
plt.figure()并在结束时plt.close(),彻底隔离不同年份的绘图状态 - 将
ax.bar_label放在统一位置处理,无需在分支中重复编写,同时通过fmt控制数值格式,padding优化标注位置
内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra
相关产品推荐
相关产品推荐

