xarray的FacetGrid指定cartopy投影后丢失经纬度轴标签的原因与解决
问题:xarray分面绘图添加cartopy投影后丢失经纬度坐标轴数值
原因分析
当通过subplot_kws={"projection": ccrs.PlateCarree()}指定cartopy投影时,matplotlib的普通坐标轴会被替换为cartopy的GeoAxes对象。这种地理坐标轴默认不会显示常规的经纬度刻度和标签——因为cartopy更侧重地图投影的可视化逻辑,需要手动配置才会显示经纬度数值。而不指定投影时,用的是普通matplotlib轴,会自动读取数据的经纬度维度值并直接显示在坐标轴上。
解决方法
需要遍历分面图的每个子图,为每个GeoAxes添加带标签的网格线,以此显示经纬度数值。修改后的代码如下:
import xarray as xr import cartopy.crs as ccrs airtemps = xr.tutorial.open_dataset("air_temperature") air = airtemps.air - 273.15 t = air.isel(time=slice(0, 365 * 4, 250)) # 绘制分面图 g_simple = t.plot.contourf( x="lon", y="lat", col="time", col_wrap=3, transform=ccrs.PlateCarree(), subplot_kws={"projection": ccrs.PlateCarree()}, levels=51, ) # 遍历每个子图,添加经纬度标签 for ax in g_simple.axes.flat: # 添加带标签的网格线,指定数据投影为PlateCarree gl = ax.gridlines(draw_labels=True, crs=ccrs.PlateCarree()) # 关闭顶部和右侧的标签,避免与其他子图重叠 gl.xlabels_top = False gl.ylabels_right = False # 可按需调整标签字号 gl.xlabel_style = {'size': 8} gl.ylabel_style = {'size': 8}
这样处理后,每个子图的坐标轴就会显示正确的经纬度数值,同时保留cartopy投影的设置。
内容的提问来源于stack exchange,提问作者dodohjk
相关产品推荐
相关产品推荐

