如何在Cartopy绘制的OpenStreetMap背景上叠加热力图?
解决Cartopy中叠加hist2d热力图的问题
你猜的完全正确!问题核心就在于坐标系不匹配,必须通过transform参数来指定你的经纬度数据对应的地理坐标系。
具体操作说明
Cartopy的地图axes使用的是OSM对应的Web Mercator投影坐标系,而你的经纬度点属于WGS84地理坐标系(也就是ccrs.PlateCarree())。直接调用hist2d时,函数会默认数据和axes的投影一致,这就导致了绘图失败或者位置偏移。
你只需要在ax.hist2d()中添加transform=ccrs.PlateCarree()参数,就能让Cartopy自动完成地理坐标到投影坐标的转换。另外还可以给热力图加个透明度参数alpha,让底层的OSM地图能清晰显示。
完整可运行代码
from __future__ import division import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.io.img_tiles as cimgt # 初始化OSM地图请求 request = cimgt.OSM() extent = [-89, -88, 41, 42] # 创建带投影的绘图轴 ax = plt.axes(projection=request.crs) ax.set_extent(extent) ax.add_image(request, 8) # 生成随机经纬度点(简化写法,避免负数运算歧义) lons = np.random.uniform(-89, -88, 100) lats = np.random.uniform(41, 42, 100) # 叠加hist2d热力图,指定数据的坐标系 ax.hist2d(lons, lats, transform=ccrs.PlateCarree(), alpha=0.5, bins=10) plt.show()
补充说明
所有基于经纬度的地理数据,在Cartopy的投影轴上绘图时,都需要通过transform参数声明数据的原始坐标系,这是Cartopy处理地图投影的核心逻辑,避免了手动坐标转换的繁琐。
内容的提问来源于stack exchange,提问作者hm8




