Basemap底图叠加等值线图未全覆盖,求代码错误排查
问题排查与修复方案
核心问题1:Basemap坐标转换顺序错误
Basemap的投影转换函数m()要求参数顺序为**(经度, 纬度)**,但你代码里写成了m(Lat, Lon),把纬度和经度传反了,这会直接导致投影后的坐标混乱,等值线无法正确匹配底图范围。
核心问题2:MeshGrid网格维度与数据不匹配
你用[Lat, Lon] = np.meshgrid(lats, lons)生成的网格,维度是(len(lons), len(lats)),而多数气象数据(比如OLR)的维度是(纬度数, 经度数),两者维度不匹配会引发等值线绘制错位或不完整。需要调整meshgrid的输入顺序,先传入经度数组,再传入纬度数组。
修改后的完整代码
# 导入必要依赖(需确保已安装numpy、matplotlib和Basemap) import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap # 初始化Miller投影底图 m = Basemap(projection='mill', resolution='i', lon_0=0., lat_0=0.) # 绘制海岸线、边界与网格 m.drawcoastlines(linewidth=0.5) m.drawmapboundary(fill_color='white') m.drawparallels(np.arange(-90.,90.,30.), labels=[1,0,0,0]) m.drawmeridians(np.arange(-180.,180.,60.), labels=[0,0,0,1]) # 生成匹配数据维度的经纬度网格 Lon, Lat = np.meshgrid(lons, lats) # 修正投影转换的参数顺序 pLon, pLat = m(Lon, Lat) # 绘制等值线填充图 cfig = m.contourf(pLon, pLat, OLR_2011, levels=clevel, extend='both', cmap="jet") cbar = m.colorbar(cfig, location='right', pad="10%") plt.show()
额外注意事项
- 确认
lats、lons数组的长度与OLR_2011的维度完全对应:lats长度需等于OLR_2011的第一维度,lons长度需等于第二维度。 - 若
OLR_2011数据是按(经度, 纬度)存储的,需先对数据转置(OLR_2011.T)再传入contourf。
内容的提问来源于stack exchange,提问作者TThoye
相关产品推荐
相关产品推荐

