Matplotlib绘制海表温度地图仅显示一半数据的问题求助
解决海表温度地图仅显示一半数据的问题
问题根源在于你的NetCDF数据经度范围是0-360°,但Basemap的cyl(圆柱)投影默认使用**-180-180°**的经度范围,导致180-360°的那部分数据被绘制到了地图可视范围之外,所以只显示了一半内容。
修复步骤
- 转换经度范围:把0-360°的经度转换为-180-180°格式
- 重新排序数据:转换后经度顺序会混乱,需要按经度从小到大排序,确保SST数据和经纬度对应
修改后的完整代码
from matplotlib import pyplot as plt from netCDF4 import Dataset import numpy as np from mpl_toolkits.basemap import Basemap # 读取数据 data = Dataset('sst.day.mean.1981.nc') lats = data.variables['lat'][:] lons = data.variables['lon'][:] sst = data.variables['sst'][:] # 1. 将经度从0-360转换为-180-180 lons = np.where(lons > 180, lons - 360, lons) # 2. 对经度排序,并同步调整SST数据的顺序 sorted_lon_indices = np.argsort(lons) lons_sorted = lons[sorted_lon_indices] sst_sorted = sst[:, :, sorted_lon_indices] # 创建地图 mp = Basemap(projection='cyl') lon_grid, lat_grid = np.meshgrid(lons_sorted, lats) x, y = mp(lon_grid, lat_grid) # 绘制SST c_scheme = mp.pcolor(x, y, np.squeeze(sst_sorted[0,:,:]), cmap='jet') mp.drawcoastlines() mp.drawstates() mp.drawcountries() plt.colorbar(c_scheme, label='Sea Surface Temperature (°C)') # 可选:添加颜色条 plt.title('Sea surface temperature') plt.show()
关键细节解释
- 转换经度时,用
np.where把大于180°的经度减去360,得到对应的负经度值 - 必须排序经度:转换后的经度会变成
[0,1,...,179,-180,-179,...,-1]的混乱顺序,直接画图会导致数据错位,所以用np.argsort获取排序索引,同步调整经度和SST数据的列顺序
内容的提问来源于stack exchange,提问作者Guilherme Diniz Queiroz De Car
相关产品推荐
相关产品推荐

