Python画柱状图并添加数据标签:柱顶数值标注方法
Python matplotlib画柱状图后在每根柱子顶部添加数值标签,解决柱高对比不直观的问题,含横置柱状图标签位置调整,代码完整可运行。
场景痛点
画完柱状图,读者只能靠柱子高度估数值,具体是多少还得对着坐标轴猜。报告里经常要精确标注每个柱子的数值。Excel里加数据标签要右键点"添加数据标签",换数据又得重来。用matplotlib写循环自动标数值,脚本跑一遍所有标签自动生成,横放竖放都能调位置。
用到的库
pip install matplotlib
完整代码
# 导入库
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
# 解决中文乱码
matplotlib.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "Arial Unicode MS"]
matplotlib.rcParams["axes.unicode_minus"] = False
def draw_bar_with_labels():
# 各部门季度业绩完成率
departments = ["销售部", "市场部", "研发部", "人事部", "财务部", "客服部"]
completion = [118, 92, 105, 88, 95, 102]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# ===== 左图:纵向柱状图,标签在柱顶 =====
bars1 = ax1.bar(departments, completion, color="#4C72B0", alpha=0.8)
ax1.set_title("纵向柱状图:柱顶标签", fontsize=14)
ax1.set_ylabel("完成率(%)")
ax1.set_ylim(0, 140)
# 循环给每根柱子加标签
for bar in bars1:
height = bar.get_height()
ax1.text(
bar.get_x() + bar.get_width() / 2, # X坐标:柱子中心
height + 2, # Y坐标:柱顶上方2个单位
f"{height}%", # 标签文字
ha="center", va="bottom", fontsize=10,
color="#333333",
)
# ===== 右图:横向柱状图,标签在柱子右侧 =====
bars2 = ax2.barh(departments, completion, color="#55A868", alpha=0.8)
ax2.set_title("横向柱状图:右侧标签", fontsize=14)
ax2.set_xlabel("完成率(%)")
ax2.set_xlim(0, 140)
# 横向柱状图的标签放在柱子右端
for bar in bars2:
width = bar.get_width()
ax2.text(
width + 2, # X坐标:柱子右端
bar.get_y() + bar.get_height() / 2, # Y坐标:柱子中心
f"{width}%",
va="center", fontsize=10, color="#333333",
)
plt.tight_layout()
plt.savefig("bar_with_labels.png", dpi=150)
plt.close()
print("带数据标签的柱状图已保存为 bar_with_labels.png")
if __name__ == "__main__":
draw_bar_with_labels()
代码讲解
ax.bar()返回的bars是一个容器对象,循环里bar.get_height()拿到每根柱子的高度,bar.get_x()和bar.get_width()算柱子中心横坐标。- 纵向柱状图:标签放在柱顶上方,
ha="center"水平居中,va="bottom"文字底部对齐到坐标点,height + 2是在柱顶留出2个单位空隙。 - 横向柱状图用
barh(),标签放在柱子右端,va="center"垂直居中对齐,width + 2在柱子右边留空隙。 f"{height}%"直接在数值后面拼百分号,完成率指标适合这种格式;金额类指标改成f"{height:,.0f}元"。set_ylim(0, 140)和set_xlim(0, 140)给顶部/右侧标签留出空间,否则最高的标签会被画布边缘裁掉。
运行结果
当前目录生成 bar_with_labels.png,左右并排两张图:左边纵向柱状图,每根柱子顶部标注百分比数值;右边横向柱状图,每根柱子右侧标注百分比数值。中文部门名和数值都正常显示,最高柱子的标签不会被裁切。
注意事项
- 柱子数量超过15根时,柱顶标签会互相重叠,建议旋转X轴标签或者改用横向柱状图。
- 数值标签颜色用深灰
#333333比纯黑柔和,和柱子颜色形成对比但不刺眼。 - 如果是堆叠柱状图,标签要分别放在每段柱子的中心,需要累加各段高度再定位。
- 分组柱状图的标签位置计算要加上组内偏移量,参考"分组柱状图"那篇文章的写法。

更新时间:2026-09-14 20:33:15
上一篇:Python图表叠加柱状图折线图组合图:双轴混合图表