使用Matplotlib绘制纬度-时间温度变化图时遇警告问题求助
解决Matplotlib绘制时间-纬度温度剖面的警告问题
问题根源
警告提示的「x坐标非单调递增」,是因为你的lat数组大概率是从高纬度到低纬度(比如0°→-80°)递减排列,通过meshgrid生成的lat_grid继承了这个递减顺序,作为contourf的x轴输入时不符合要求,触发警告。另外你的代码还有几处语法/逻辑冗余问题,比如重复创建画布、错误的子图声明。
修复步骤
1. 修正基础代码错误
先把代码里的语法错误和冗余部分改掉:
from netCDF4 import Dataset import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap # 读取数据 d = Dataset('sst.mon.ltm.1991-2020.nc') sst = d.variables['sst'][:] # 加上[:]读取实际数据 time = d.variables['time'][:] lon = d.variables['lon'][:] lat = d.variables['lat'][:] # 计算经度平均的海温 mean_sst = np.mean(sst, axis=2, keepdims=False)
2. 解决x坐标单调问题
方案A:直接调整纬度数组为单调递增(推荐)
你的需求是绘制时间-纬度的温度剖面,完全不需要用Basemap,用普通Matplotlib绘图即可,同时把lat数组反转成递增顺序:
fig, ax = plt.subplots(figsize=(8,5)) # 反转lat数组,从-80°到0°递增 lat_sorted = lat[::-1] # 对应反转mean_sst的纬度维度,保证数据和坐标匹配 mean_sst_sorted = mean_sst[:, ::-1] # 生成网格 lat_grid, time_grid = np.meshgrid(lat_sorted, time) # 绘图 cx = ax.contourf(lat_grid, time_grid, mean_sst_sorted, cmap='seismic') plt.colorbar(cx, label='SST (°C)') ax.set_xlabel('Latitude') ax.set_ylabel('Time') plt.show()
方案B:如果一定要用Basemap(不推荐,此图无需地理投影)
确保输入的x坐标(纬度)是单调递增的,同时修正Basemap的使用逻辑:
fig = plt.figure(figsize=(5,5)) ax = fig.add_subplot(211) # 自动判断并调整lat为递增顺序 lat_sorted = lat[::-1] if lat[0] > lat[-1] else lat mean_sst_sorted = mean_sst[:, ::-1] if lat[0] > lat[-1] else mean_sst m = Basemap(projection='merc', llcrnrlon=0, urcrnrlon=180, llcrnrlat=-80, urcrnrlat=0) # 将纬度转换为投影后的x坐标 x, _ = m(lat_sorted, np.zeros_like(lat_sorted)) # 取任意经度的投影x值 lat_grid_proj, time_grid = np.meshgrid(x, time) cx = m.contourf(lat_grid_proj, time_grid, mean_sst_sorted, cmap='seismic') plt.show()
关键说明
- 「随时间变化的纬度方向温度变化」本质是二维剖面(时间×纬度),用普通Matplotlib的
contourf完全足够,Basemap是用于绘制带地理投影的地图,这里使用反而增加复杂度。 - 可以用
print(lat)检查纬度数组顺序,如果输出是[0, -10, -20, ..., -80],就是递减的,反转后即可解决单调问题。
内容的提问来源于stack exchange,提问作者faeze bh
相关产品推荐
相关产品推荐

