Basemap中Robinson投影(lon_0=-180)昼夜阴影异常问题求助
解决Basemap Robinson投影(中心经度-180°)昼夜阴影异常问题
可以通过shiftgrid函数修复这个问题,核心原因是投影的经度范围与nightshade生成的数据经度范围不匹配:当你把投影中心设为-180°时,Basemap的经度处理逻辑是[-180°, 180°],但nightshade默认生成的昼夜边界数据是[0°, 360°]的经度范围,导致x坐标非单调,引发等值线绘制异常。
具体解决步骤
- 手动获取nightshade生成的昼夜边界经纬度数据
- 使用
shiftgrid将经度从[0°, 360°]转换为[-180°, 180°],匹配投影的经度范围 - 重新投影调整后的经纬度,并填充阴影区域
修改后的完整代码
from mpl_toolkits.basemap import Basemap, shiftgrid import numpy as np import matplotlib.pyplot as plt from datetime import datetime # 初始化Robinson投影,中心经度-180° m = Basemap(projection='robin', lon_0=-180, resolution='c') m.drawcoastlines() m.fillcontinents(color='coral', lake_color='aqua') m.drawparallels(np.arange(-90., 120., 30.)) m.drawmeridians(np.arange(0., 360., 60.)) m.drawmapboundary(fill_color='aqua') date = datetime(2024, 10, 10, 6) # 手动获取昼夜边界的经纬度数据 lons, lats = m.nightshade(date, return_data=True) # 使用shiftgrid将经度从[0,360]转换为[-180,180] lons_shifted, _ = shiftgrid(180., lons, lats, start=False) # 投影调整后的经纬度 x, y = m(lons_shifted, lats) # 填充阴影区域 m.fill(x, y, 'k', alpha=0.2) plt.title("Robinson Projection") plt.savefig('test.png')
关键代码解释
shiftgrid(180., lons, lats, start=False):将经度数据从[0°, 360°]偏移为[-180°, 180°],start=False表示调整后起始经度为-180°return_data=True:让nightshade返回原始的经纬度数据,而不是直接绘制- 手动调用
m.fill绘制调整后的阴影,替代原来自动绘制的逻辑
额外建议
Basemap已经停止维护,后续建议迁移到Cartopy库,它对现代投影和数据处理的支持更完善,也不会出现这类经度范围不匹配的问题。
内容的提问来源于stack exchange,提问作者GPSmaster
相关产品推荐
相关产品推荐

