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

使用cartopy绘制df地图散点出现双独立图表的问题求解

问题现象

运行代码后没有得到叠加散点的地图,反而输出两个独立图表:
空的地图底图
无地图底图的散点图

错误原因

代码存在3个核心问题导致图层无法叠加:

  • 创建cartopy地理坐标轴的两行代码都被注释,后续代码混用ax、ax1两个未正确定义的变量,逻辑本身不连贯
  • 调用pandas的df.plot()方法时没有指定目标坐标轴,pandas默认会新建一个独立的普通坐标轴绘制散点,和之前创建的地图轴完全分离
  • 地理空间绘图缺少坐标参考系转换配置,cartopy无法将经纬度坐标正确匹配到Mercator投影的底图上
修正后代码
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import cartopy
import cartopy.crs as ccrs
import cartopy.feature as cf

# 统一创建画布和带Mercator投影的地理坐标轴
fig, ax = plt.subplots(figsize=(8,6), subplot_kw={'projection': ccrs.Mercator()})

# 所有地图配置统一使用ax变量
ax.add_feature(cf.BORDERS, linewidth=0.8)
ax.add_feature(cf.RIVERS, linewidth=0.5)
# set_extent传入的经纬度是WGS84坐标系,需要指定crs参数
ax.set_extent([7.4, 8.8, 47.5, 49.1], crs=ccrs.PlateCarree())
ax.set_title('Niederschlag', fontsize=13)
# 地理坐标轴使用适配的gridlines方法绘制网格
ax.gridlines(alpha=0.5, draw_labels=True)

# 绘制散点时绑定到地图坐标轴,同时指定坐标转换规则
df.plot(
    x="longitude", 
    y="latitude", 
    kind="scatter", 
    c='RR',
    colormap="YlOrRd",
    ax=ax, # 强制将散点绘制到已有的地图轴上,不新建画布
    transform=ccrs.PlateCarree(), # 声明经纬度为WGS84坐标系,自动转换匹配地图投影
    edgecolor='white',
    s=30
)

plt.tight_layout()
plt.show()
关键说明
  • 所有绘图操作必须指向同一个坐标轴对象,才能实现图层叠加,跨坐标轴的内容无法自动合并
  • 使用cartopy绘制地理数据时,只要传入的是经纬度坐标,都需要搭配transform=ccrs.PlateCarree()声明坐标参考系,否则会出现点位偏移、不显示的问题
  • cartopy的投影坐标轴不要使用普通matplotlib的grid()方法,改用自带的gridlines()可以避免网格显示错乱、标签不匹配投影的问题

内容的提问来源于stack exchange,提问作者Maximilian Bähr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:39:35