如何获取Matplotlib中带背景填充的注释的完整带内边距盒子的角落坐标?
如何获取Matplotlib中带背景填充的注释的完整带内边距盒子的角落坐标?
我完全懂你的困扰——你给注释加了背景色,想拿到整个填充区域的四个角落,结果用get_window_extent()或者get_tightbbox()只拿到了文本本身的边界,连背景的内边距都没算进去,对吧?
其实问题出在你获取的是文本内容的边界,而不是背景填充补丁的边界。当你用backgroundcolor参数给注释加背景时,Matplotlib会自动为这个注释创建一个BboxPatch对象来绘制背景,我们要拿的就是这个补丁的范围。
给你调整后的代码,直接就能拿到整个带内边距的背景盒子坐标:
a = ax.annotate( label, xy=(x, y), backgroundcolor=(0.69, 0.6, 0.65, 0.65), color="#444444", fontsize=14, xytext=(0, 0), textcoords="offset pixels", ) # 必须先绘制画布,才能计算实际显示的坐标 ax.get_figure().canvas.draw() # 获取注释的背景补丁对象 bbox_patch = a.get_bbox_patch() # 拿到背景补丁的窗口范围 full_bbox = bbox_patch.get_window_extent() # 提取四个角落的坐标 corner_bl = full_bbox.p0 # 左下角 corner_tr = full_bbox.p1 # 右上角 corner_br = (full_bbox.p1[0], full_bbox.p0[1]) # 右下角 corner_tl = (full_bbox.p0[0], full_bbox.p1[1]) # 左上角
这样拿到的坐标就是整个背景填充区域的角落了,不会像之前那样只落在文本边缘。你提到的图里,绿色的点原本落在文本的角落位置,用这个方法就能让点精准对齐背景区域的四个角啦。
另外补充一句:如果你之后是显式用bbox参数设置背景(比如bbox=dict(facecolor="gray", pad=6)),这个方法依然适用,因为get_bbox_patch()还是能准确获取到对应的背景补丁。
备注:内容来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

