You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:41:33