前言

在绘制复杂图像时,图像标注能帮助阅读对象更好理解图像含义。图像标注是在画面上添加文字注释、指示箭头、图框等各类标注元素。

一、文字标注(plt.text()

1. 函数
plt.text(x, y, s, fontsize=12, horizontalalignment='left', ...)
  • 作用:在指定坐标位置添加文字注释。

  • 参数

    • x, y:标注的坐标位置(基于数据坐标系)。

    • s:标注的文本内容。

    • fontsize:字体大小。

    • horizontalalignment:水平对齐方式('left''center''right')。

    • 其他参数:colorrotation 等(与文本样式相关)。

2. 示例:柱形图数值标注
fig, axes = plt.subplots()
x_bar = [10, 20, 30, 40, 50]
y_bar = [0.5, 0.6, 0.3, 0.4, 0.8]
bars = axes.bar(x_bar, y_bar, color='blue', width=2)

for i, rect in enumerate(bars):
    x_center = rect.get_x() + rect.get_width() / 2  # 柱子中心横坐标
    y_text = rect.get_height() + 0.01               # 高度 + 偏移量
    plt.text(x_center, y_text, f'{y_bar[i]:.1f}', 
             ha='center', va='bottom')              # 居中对齐

  • 关键点

    • 通过 rect.get_x() + rect.get_width()/2 获取柱子中心,使文本居中。

    • va='bottom' 确保文本底部对齐柱子顶部,避免遮挡。


二、箭头标注(plt.annotate()

1. 函数
plt.annotate(text, xy, xytext, arrowprops=dict(...), ...)
  • 作用:添加带箭头的复杂标注。

  • 参数

    • text:标注文本。

    • xy:箭头指向的目标位置(数据坐标系)。

    • xytext:文本的起始位置(数据坐标系)。

    • arrowprops:箭头属性字典,常用参数:

      • facecolor:箭头颜色。

      • width:箭尾宽度。

      • headwidth:箭头宽度。

      • arrowstyle:箭头样式(如 '->''fancy')。

2. 示例:标注柱形图最小值
plt.annotate('Min', 
             xy=(30, 0.3),          # 箭头指向柱子顶部中心
             xytext=(35, 0.5),      # 文本起始位置
             arrowprops=dict(facecolor='black', arrowstyle='->', linewidth=1),
             ha='center', va='center')

  • 关键点

    • xy 应指向目标点(如柱子顶部中心),需结合数据坐标计算。

    • 使用 arrowstyle 可自定义箭头形状(如 '->' 为简单箭头,'fancy' 为复杂样式)。


三、注意事项

  1. 坐标系统

    • 默认使用数据坐标系,可通过 transform 参数切换为其他坐标系(如 axes像素坐标系)。

  2. 文本位置优化

    • 动态计算标注位置(如基于柱子高度自动调整偏移量)。

  3. 样式统一性

    • 保持标注颜色、字体与图表风格一致。

  4. 箭头指向准确性

    • 确保 xy 坐标精确指向目标位置,避免视觉误导。


四、完整代码示例

import matplotlib.pyplot as plt

# 数据准备
x_bar = [10, 20, 30, 40, 50]
y_bar = [0.5, 0.6, 0.3, 0.4, 0.8]

# 绘制柱形图
fig, ax = plt.subplots()
bars = ax.bar(x_bar, y_bar, color='skyblue', width=2)

# 添加文字标注
for rect in bars:
    height = rect.get_height()
    x_center = rect.get_x() + rect.get_width() / 2
    ax.text(x_center, height + 0.01, f'{height:.1f}', 
            ha='center', va='bottom', fontsize=10)

# 添加箭头标注
ax.annotate('Min Value',
            xy=(30, 0.3), 
            xytext=(40, 0.6),
            arrowprops=dict(facecolor='red', arrowstyle='->', linewidth=1.5),
            fontsize=12, color='darkred')

plt.show()


通过结合 text() 和 annotate(),可清晰标注图表关键信息,提升可读性。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐