Cartopy中使用adjust_text时FancyArrowPatch无法渲染的问题
Cartopy中adjust_text箭头不显示的排查方案
1. 修正箭头补丁的变换属性
adjust_text默认给箭头设置IdentityTransform,这和Cartopy轴的地理坐标系不兼容。解决方法是遍历生成的箭头,手动设置适配的变换:
# 调用adjust_text并保存返回的箭头列表 arrows = adjust_text(texts, points, arrowprops={'arrowstyle': '->', 'color': 'red'}) # 遍历箭头,设置与文本一致的地理投影变换 for arrow in arrows: # 替换为你实际使用的投影(如ccrs.PlateCarree/ccrs.Mercator等) arrow.set_transform(ccrs.PlateCarree()) arrow.set_zorder(10) # 确保箭头在顶层渲染
注意:箭头的起止坐标如果是地理经纬度,就用对应ccrs投影作为transform;如果是轴的归一化坐标,改用ax.transAxes。
2. 检查箭头坐标的可视范围
箭头可能因起止坐标超出当前地图显示范围而不可见,可打印坐标验证:
for arrow in arrows: print(f"箭头起点: {arrow.get_xy()},终点: {arrow.get_xy2()}")
若坐标超出地图extent,可调整地图范围(ax.set_extent([lon_min, lon_max, lat_min, lat_max])),或在adjust_text中添加only_move参数限制文本移动边界。
3. 自定义箭头生成逻辑适配Cartopy
如果默认箭头生成逻辑不兼容,可自定义箭头生成函数,先将地理坐标转换为轴数据坐标再创建箭头:
def cartopy_compatible_arrow(x0, y0, x1, y1, ax, **kwargs): # 将地理坐标转换为轴数据坐标 proj = ax.projection x0_data, y0_data = proj.transform_point(x0, y0, ccrs.Geodetic()) x1_data, y1_data = proj.transform_point(x1, y1, ccrs.Geodetic()) # 创建适配Cartopy的箭头补丁 arrow = plt.FancyArrowPatch((x0_data, y0_data), (x1_data, y1_data), transform=proj, **kwargs) ax.add_patch(arrow) return arrow # 调用adjust_text时指定自定义生成器 adjust_text(texts, points, arrow_generator=cartopy_compatible_arrow, arrowprops={'arrowstyle': '->', 'color': 'blue'})
4. 验证Cartopy轴的补丁渲染能力
手动创建测试箭头,确认你的Cartopy轴能正常渲染补丁:
# 创建一个测试箭头(替换为你地图内的有效坐标) test_arrow = plt.FancyArrowPatch((10, 10), (20, 20), arrowstyle='->', color='green', transform=ccrs.PlateCarree()) ax.add_patch(test_arrow)
若测试箭头也不显示,说明可能是Cartopy/matplotlib版本兼容问题,需升级依赖。
5. 升级依赖版本
旧版本的Cartopy、matplotlib或adjustText可能存在兼容性bug,执行升级命令:
pip install --upgrade cartopy matplotlib adjustText
内容的提问来源于stack exchange,提问作者CitizenFish
相关产品推荐
相关产品推荐

