You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:54:08