如何获取matplotlib Rectangle在axes坐标系下的顶点坐标?
获取Matplotlib矩形在Axes坐标系下的顶点坐标
问题原因分析
你遇到的核心问题是未触发Matplotlib完成绘图布局计算,导致轴的范围(xlim/ylim)未更新,transLimits变换无法正确映射数据坐标到Axes坐标系:
get_extents()返回的是**显示坐标系(像素)**的边界,而非Axes或数据坐标系,因此数值远超预期范围。get_path().vertices是矩形的本地坐标系顶点(以自身左下角为原点,宽高为1的单位矩形),所以始终是0和1的组合,需要通过get_patch_transform()转换到数据坐标系。- 调用
transLimits时,轴的xlim/ylim还未完成自动缩放计算,导致变换结果与原数据坐标一致,未实现从数据到Axes坐标系的映射。
解决方案
要正确获取Axes坐标系((0,0)为Axes左下角,(1,1)为右上角)的顶点坐标,需按以下步骤操作:
- 触发布局计算:在获取变换结果前,调用
fig.canvas.draw()让Matplotlib完成轴范围计算、布局渲染。 - 正确使用坐标变换:将数据坐标系的顶点通过
ax.transLimits转换到Axes坐标系;或直接使用复合变换ax.transLimits + rect2.get_patch_transform(),一步完成从本地坐标到Axes坐标系的转换。
修改后的示例代码
import matplotlib.pyplot as plt import matplotlib.patches as mpatches fig = plt.figure() ax = fig.add_subplot(111) # 先添加所有图形元素 x = 0 ; y = 0 ; width = 100; height = 50; rect = mpatches.Rectangle((x, y), width, height, linewidth=1, edgecolor='black', facecolor='#AAAAAA88') ax.add_patch(rect) x = 10 ; y = 10 ; width = 40; height = 20; rect2 = mpatches.Rectangle((x, y), width, height, linewidth=1, edgecolor='black', facecolor='red') ax.add_patch(rect2) # 开启自动缩放并触发布局计算 plt.autoscale(enable=True, axis='both', tight=None) fig.canvas.draw() # 关键步骤:让Matplotlib计算轴范围与布局 # 获取数据坐标系下的顶点 rdatapoints = rect2.get_patch_transform().transform(rect2.get_path().vertices) print(f"数据坐标系顶点:{rdatapoints}") # 转换到Axes坐标系 axes_points = ax.transLimits.transform(rdatapoints) print(f"Axes坐标系顶点:{axes_points}") # 也可以直接用复合变换一步到位 direct_axes_points = (ax.transLimits + rect2.get_patch_transform()).transform(rect2.get_path().vertices) print(f"直接转换的Axes坐标系顶点:{direct_axes_points}") plt.show()
预期输出
数据坐标系顶点:[[10. 10.] [50. 10.] [50. 30.] [10. 30.] [10. 10.]] Axes坐标系顶点:[[0.1 0.2] [0.5 0.2] [0.5 0.6] [0.1 0.6] [0.1 0.2]] 直接转换的Axes坐标系顶点:[[0.1 0.2] [0.5 0.2] [0.5 0.6] [0.1 0.6] [0.1 0.2]]
关键原理补充
ax.transLimits:将数据坐标系映射到Axes的单位空间(0-1),其内部基于当前轴的xlim和ylim计算映射关系,必须在轴范围确定后(即draw()之后)才能生效。- 变换组合:Matplotlib的坐标变换可以通过
+组合,ax.transLimits + rect2.get_patch_transform()表示先将patch本地坐标转换到数据坐标,再转换到Axes坐标系,与分步操作结果一致。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

