Cartopy绘制区域地图时经度标签错误及显示范围异常问题求解
修复后的完整代码
import numpy as np import cartopy.crs as ccrs from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER from matplotlib import pyplot as plt lats = -31 latn = 31 lon1 = 119 lon2 = 301 plt.figure(figsize=(10,6)) proj = ccrs.PlateCarree(central_longitude=210) ax = plt.axes(projection=proj) # 修复点1:set_extent的坐标参考系用默认的地理坐标系(中心0°的PlateCarree) ax.set_extent([lon1, lon2, lats, latn], crs=ccrs.PlateCarree()) ax.coastlines() # 修复点2:通过gridliner对象设置刻度和格式化,不要直接操作ax的x/yaxis gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linestyle='--', alpha=0.5) gl.xlocator = plt.FixedLocator(np.arange(120, 330, 30)) gl.ylocator = plt.FixedLocator(np.arange(-30, 40, 10)) gl.xformatter = LONGITUDE_FORMATTER gl.yformatter = LATITUDE_FORMATTER # 关闭顶部和右侧的冗余标签 gl.top_labels = False gl.right_labels = False plt.show()
问题修复说明
- 范围显示全球的问题原因:
set_extent方法传入的crs参数与经纬度数值的参考系不匹配。你给出的lon1、lon2是0-360°标准地理经度,对应的参考系是中心0°的PlateCarree(),而你之前传入的是中心210°的自定义投影坐标系,导致范围计算错误,最终显示全球区域。 - 经度标签显示错误的问题原因:cartopy的投影坐标系下,直接对
ax.xaxis、ax.yaxis设置刻度和格式化器不生效,所有的网格线、刻度标签配置都需要通过gridliner对象完成,才能自动适配投影转换后的坐标,正确显示120E、150E、180、150W等格式的标签。
内容的提问来源于stack exchange,提问作者Wayne Tsai
相关产品推荐
相关产品推荐

