如何判断matplotlib的text artist是否与坐标轴边界重叠?
Cartopy边界重叠文本自动隐藏解决方案
问题根源
你之前获取的所有文本范围一致,是因为matplotlib在完成画布渲染前不会计算元素的实际显示尺寸,绘制完成后直接调用边界查询接口拿到的都是初始默认值,判断自然无效。
核心解决思路
先触发画布预渲染拿到所有文本的真实像素范围,再和坐标轴的显示像素范围比对,只要文本任意部分超出范围就隐藏整个文本对象,不需要做坐标投影转换,直接用像素比对更稳定。
基础示例修复代码
对应你给出的测试场景,可直接运行验证效果:
import matplotlib.pyplot as plt import cartopy.crs as ccrs, cartopy.feature as cfeature fig = plt.figure() ax = fig.add_subplot(111, projection=ccrs.PlateCarree()) ax.add_feature(cfeature.COASTLINE) # 示例文本:重叠边界的txt1会被隐藏,正常的txt2保留 txt1 = ax.text(0.95, 0.5, 'a test string', transform=ax.transAxes) txt2 = ax.text(0.5, 0.5, 'a second test string', transform=ax.transAxes) # 关键:触发画布预渲染,拿到所有元素实际像素坐标 fig.canvas.draw() # 获取坐标轴显示区域的像素范围:格式为(左下角x, 左下角y, 右上角x, 右上角y) ax_pix_range = ax.bbox.extents renderer = fig.canvas.get_renderer() for txt in [txt1, txt2]: # 获取当前文本实际渲染的像素范围 txt_pix_range = txt.get_window_extent(renderer=renderer).extents # 判断是否超出边界,任意边超出就隐藏 if (txt_pix_range[0] < ax_pix_range[0] or txt_pix_range[2] > ax_pix_range[2] or txt_pix_range[1] < ax_pix_range[1] or txt_pix_range[3] > ax_pix_range[3]): txt.set_visible(False) plt.show()
城市标签绘制代码修复版本
对应你给出的批量绘制城市标签的场景,调整后逻辑如下:
import matplotlib.patheffects as path_effects import cartopy.crs as ccrs # 第一步:先完成所有城市标签的绘制,暂不做判断 text_cache = [] for station in stations: text = self.ax.text(station[2], station[1], station[0], fontweight='bold', horizontalalignment='center', verticalalignment='center', fontsize=12, zorder=10, transform=ccrs.PlateCarree()) text.set_path_effects([path_effects.Stroke(linewidth=2, foreground='white'), path_effects.Normal()]) text_cache.append(text) # 第二步:统一触发渲染,拿到真实尺寸 self.fig.canvas.draw() ax_pix_range = self.ax.bbox.extents renderer = self.fig.canvas.get_renderer() # 第三步:遍历判断是否隐藏 for txt in text_cache: txt_pix_range = txt.get_window_extent(renderer=renderer).extents if (txt_pix_range[0] < ax_pix_range[0] or txt_pix_range[2] > ax_pix_range[2] or txt_pix_range[1] < ax_pix_range[1] or txt_pix_range[3] > ax_pix_range[3]): txt.set_visible(False)
注意事项
如果你的画布支持缩放、平移等交互操作,每次轴范围变动后需要重新执行上述渲染+判断逻辑,更新文本显示状态。
内容的提问来源于stack exchange,提问作者Karl Schneider
相关产品推荐
相关产品推荐

