You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib Annotation:如何仅获取注释中文本对象的bbox

获取Matplotlib Annotation内部文本的包围盒用于重叠检测

你完全不需要把注释和Text对象分开创建,Matplotlib的Annotation对象本身就暴露了内部的Text元素,直接访问它就能拿到纯文本的包围盒,步骤如下:

  • 首先获取渲染器(get_window_extent方法依赖它):
    renderer = ax.figure.canvas.get_renderer()
    
  • 从Annotation对象中提取内部Text实例:
    text_element = ann._text
    
  • 获取文本的窗口坐标系包围盒,如需转换为数据坐标系用于后续检测:
    # 窗口坐标系下的文本bbox
    text_bbox_window = text_element.get_window_extent(renderer)
    # 转换为数据坐标系
    text_bbox_data = text_bbox_window.transformed(ax.transData.inverted())
    

这个text_bbox_data仅包含文本内容的包围盒,不会包含Annotation的bbox内边距、箭头等额外元素,完全满足重叠检测的精度需求。

完整示例代码

结合你提供的Annotation创建逻辑,完整的检测流程示例:

import matplotlib.pyplot as plt

# 初始化画布和轴
fig, ax = plt.subplots()
ax.set_xlim(0, 2)
ax.set_ylim(0, 2)

# 你的Annotation参数
point = (1, 1)
xycoords = 'data'
textcoords = 'offset points'
bbox_props = dict(boxstyle="round,pad=0.15", fc="blue", alpha=0.4)
arrowprops = dict(arrowstyle="->", lw=0.8)
ha = 'center'
va = 'center'

# 创建Annotation
ann = ax.annotate(str(point), (0, 0),
                  (point[0], point[1]),
                  xycoords=xycoords, textcoords=textcoords,
                  bbox=bbox_props, size=96, ha=ha, va=va,
                  arrowprops=arrowprops)

# 获取文本bbox
renderer = fig.canvas.get_renderer()
text_element = ann._text
text_bbox_window = text_element.get_window_extent(renderer)
text_bbox_data = text_bbox_window.transformed(ax.transData.inverted())

# 对比:整个Annotation的bbox(包含pad和箭头)
ann_bbox_data = ann.get_window_extent(renderer).transformed(ax.transData.inverted())

print("文本bbox(数据坐标系):", text_bbox_data)
print("整个Annotation的bbox(数据坐标系):", ann_bbox_data)

plt.show()

运行后可以看到,文本bbox的范围远小于整个Annotation的包围盒,完全符合重叠检测的精度要求。

内容的提问来源于stack exchange,提问作者khaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:52:37