使用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
相关产品推荐
相关产品推荐

