如何在matplotlib/cartopy生成的地图后添加元素?
问题描述
我使用以下代码生成空白地图:
import matplotlib.pyplot as plt import cartopy.feature as cfeature import cartopy.crs as ccrs cstm=[31.69347, -116.88353, 31.96507, -116.57810] def map_canvas(cstm, land = True, land_color='darkgreen'): fig, mppng = plt.subplots(subplot_kw=dict(projection=ccrs.PlateCarre())) mppng.set_extent([min(cstm[1], cstm[3]), max(cstm[1], cstm[3]), min(cstm[0], cstm[2]), max(cstm[0], cstm[2])], crs = ccrs.PlateCarre()) if land: mppng.add_feature(cfeature.GSHHSFeature(scale='i'), facecolor = land_color, edgecolor = 'black', linewidth = .5, zorder = 10) return fig, mppng
请问是否可以在生成地图后(即函数外部)添加元素,例如执行以下代码:
fig, mppng = map_canvas(cstm) mppng.scatter(31.79872, -116.70722) fig.savefig('Custom1.png')
以此在已生成的空白地图上添加一个位于31.79872N-116.70722E的点?目前我能正常生成空白地图,但无法在生成后添加任何元素,盼解答。
解决方案
无法添加元素的核心原因是Cartopy绘图时需要明确指定数据的坐标系。你的散点坐标是地理经纬度(WGS84),虽然地图轴使用的是ccrs.PlateCarre()投影,但必须显式声明数据的坐标系,否则Cartopy会默认用轴的投影坐标系解析坐标,导致点被绘制到错误位置(甚至超出地图范围)。
修改后的添加散点代码如下:
fig, mppng = map_canvas(cstm) # 添加transform参数指定数据的地理坐标系,同时修正坐标顺序 mppng.scatter(-116.70722, 31.79872, transform=ccrs.PlateCarre(), color='red', s=50) fig.savefig('Custom1.png')
需要注意两个关键细节:
scatter的参数顺序是经度在前,纬度在后,你之前的坐标顺序写反了- 必须添加
transform=ccrs.PlateCarre(),明确告知Cartopy输入坐标为地理经纬度
修改后即可在空白地图上正确显示指定位置的点。
内容的提问来源于stack exchange,提问作者AlxndrLhr
相关产品推荐
相关产品推荐

