Python离散点插值到x/y坐标网格绘制夏威夷碱度等值线问题
问题原因
你的代码存在三个核心问题导致无法得到平滑的等值线效果:
- 你导入的
UnivariateSpline是一维插值工具,无法处理经纬度+碱度的二维插值需求 - 你写的多组
meshgrid操作没有实际作用,直接用tricontourf绘制离散点时平滑度较低,没有做预插值处理 - 额外小问题:
ax.set_extent的经度范围顺序写反了,Cartopy要求传入[最小经度, 最大经度, 最小纬度, 最大纬度],你的写法会导致区域显示异常
解决方法
使用scipy.interpolate.griddata做二维插值,先把离散的碱度值插值到均匀的经纬度网格上,再绘制等值线即可,修改后的完整代码如下:
import cartopy.feature as cfeature import matplotlib.pyplot as plt import matplotlib.ticker as mticker import cartopy.crs as ccrs import cartopy.mpl.ticker as cticker import numpy as np from scipy.interpolate import griddata import matplotlib.cm as cm from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER import warnings warnings.filterwarnings("ignore") %matplotlib inline fig = plt.figure(figsize=(15,15)) ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=-170)) # 加载基础地理要素 ax.set_extent([-162, -151.5, 18, 24], ccrs.PlateCarree()) # 修正经度范围顺序 ax.add_feature(cfeature.LAND, facecolor='green') ax.add_feature(cfeature.OCEAN, color='k') # 配置网格和刻度 gl = ax.gridlines(draw_labels=True, linewidth=2, color='black', alpha=0.5, linestyle='--') gl.xformatter = LONGITUDE_FORMATTER gl.yformatter = LATITUDE_FORMATTER # 取出离散数据 lons = all_data.LONGITUDE.values lats = all_data.LATITUDE.values alk = all_data.MODIFIED_TA.values # 生成目标均匀网格,可自行调整分辨率(这里用0.1度,数值越小分辨率越高) lon_grid = np.linspace(-162, -151.5, 100) lat_grid = np.linspace(18, 24, 100) lon_mesh, lat_mesh = np.meshgrid(lon_grid, lat_grid) # 二维插值,method可选'linear'(线性)、'cubic'(三次,更平滑)、'nearest'(最近邻) alk_interp = griddata((lons, lats), alk, (lon_mesh, lat_mesh), method='cubic') # 绘制插值后的等值线,levels参数可以调整等值线数量,数值越大梯度越平滑 contour = ax.contourf(lon_mesh, lat_mesh, alk_interp, levels=50, transform=ccrs.PlateCarree(), cmap=cm.gist_rainbow) # 需要叠加等值线的话可以放开下面的注释 # ax.contour(lon_mesh, lat_mesh, alk_interp, levels=10, colors='white', linewidths=0.5, transform=ccrs.PlateCarree()) # 配置色条和标题 plt.colorbar(contour, shrink=0.5) plt.title('$A_{T}$ VALUES', color = 'k', fontname='Times New Roman',size = 23) plt.show()
可调参数说明
- 插值方法:如果
cubic插值出现异常值,可以换成linear,平滑度稍低但稳定性更高 - 网格分辨率:
linspace里的第三个参数(示例里是100)越大,网格越密,等值线越平滑 - 等值线数量:
contourf的levels参数越大,颜色梯度过渡越自然
内容的提问来源于stack exchange,提问作者Caroline J.
相关产品推荐
相关产品推荐

