无外推网格数据插值及等高线图绘制问题求助
解决Meshgrid插值仅在数据范围内进行的问题
问题核心
需要在l和h构成的横截面内对速度u进行插值,仅保留数据点之间的有效插值区域,避免外推导致的空白,最终生成完整的等高线图。
现有代码问题
当前用np.mgrid生成了覆盖l和h全范围的矩形网格,griddata会在数据点的凸包外填充NaN,导致等高线图出现大量空白(对应图1),而预期图2是仅在横截面的有效区域内显示插值结果。
解决方案
1. 筛选网格中位于数据凸包内的点
通过计算数据点的凸包,只对凸包内的网格点进行插值,确保仅在数据覆盖的区域内生成有效值:
import numpy as np from scipy.interpolate import griddata from scipy.spatial import Delaunay # 计算数据点的三角剖分,用于判断点是否在凸包内 tri1 = Delaunay(matrix1) # 把网格点转为一维数组 grid_points1 = np.vstack([grid_x1.ravel(), grid_y1.ravel()]).T # 判断每个网格点是否在凸包内 inside_mask1 = tri1.find_simplex(grid_points1) >= 0 # 转为网格形状的掩码 inside_mask1 = inside_mask1.reshape(grid_x1.shape) # 执行插值(推荐用linear/cubic,nearest会导致边缘伪影) vel1 = griddata(matrix1, u1, (grid_x1, grid_y1), method="linear", fill_value=np.nan) # 强制凸包外的点为NaN(确保无外推值) vel1[~inside_mask1] = np.nan
2. 优化等高线绘制
保持原有绘图代码即可,contourf会自动忽略NaN区域,只显示有效插值部分:
fig, axs = plt.subplots(nrows=3, ncols=1, layout="constrained") fig.suptitle("Profil XS 2 - Vergleich Netz 2-0 und 2-1") ax = axs[0] # 绘制等高线,自动跳过NaN区域 contour = ax.contourf(grid_x1, grid_y1, vel1, levels=np.linspace(0, 2, 101), cmap=cm) cbar = plt.colorbar(contour) cbar.set_label("U Magnitude [m/s]") cbar.set_ticks([0, 0.5, 1, 1.5, 2]) ax.xaxis.set_inverted(True) ax.set_title("Netz 2-0") ax.set_aspect(10/1) plt.show()
3. 替代方案:使用LinearNDInterpolator
LinearNDInterpolator默认仅在数据凸包内插值,凸包外返回NaN,用法更直接:
from scipy.interpolate import LinearNDInterpolator interp_func = LinearNDInterpolator(matrix1, u1) vel1 = interp_func(grid_x1, grid_y1)
效果说明
- 图1(当前):矩形网格中凸包外的
NaN区域导致等高线图存在大量空白 - 图2(预期):仅在数据点构成的凸包内插值,等高线完整覆盖横截面有效区域
内容的提问来源于stack exchange,提问作者Selina
相关产品推荐
相关产品推荐

