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

无外推网格数据插值及等高线图绘制问题求助

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:47:34