我的知识记录

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 比纯黑柔和,和柱子颜色形成对比但不刺眼。
  • 如果是堆叠柱状图,标签要分别放在每段柱子的中心,需要累加各段高度再定位。
  • 分组柱状图的标签位置计算要加上组内偏移量,参考"分组柱状图"那篇文章的写法。

Python画柱状图并添加数据标签:柱顶数值标注方法

标签:

更新时间:2026-09-14 20:33:15

上一篇:Python图表叠加柱状图折线图组合图:双轴混合图表

下一篇:Python 企业微信机器人 Webhook 发消息:群通知推送教程