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

如何使用pvpython提取3D VTK文件切片并保存为对称配色图像

修正后可运行脚本

import matplotlib.pyplot as plt
import numpy as np
import vtk
from vtk.util.numpy_support import vtk_to_numpy
from scipy.interpolate import griddata

# 1. 读取VTK体数据
reader = vtk.vtkDataSetReader()
reader.SetFileName("../deltau-deltau.vtk")
reader.ReadAllScalarsOn()
reader.Update()

# 2. 生成X=16平面的切片
plane = vtk.vtkPlane()
plane.SetOrigin(16, 0, 0)
plane.SetNormal(1, 0, 0)

cutter = vtk.vtkCutter()
cutter.SetCutFunction(plane)
cutter.SetInputConnection(reader.GetOutputPort())
cutter.Update()
slice_data = cutter.GetOutput()

# 3. 提取切片上的点坐标和对应标量值
slice_points = vtk_to_numpy(slice_data.GetPoints().GetData())
y = slice_points[:, 1]
z = slice_points[:, 2]
var = vtk_to_numpy(slice_data.GetPointData().GetScalars())

# 4. 生成规则插值网格
npts = 200 # 可调整数值提高输出清晰度
ymin, ymax = y.min(), y.max()
zmin, zmax = z.min(), z.max()
yi = np.linspace(ymin, ymax, npts)
zi = np.linspace(zmin, zmax, npts)
yi_grid, zi_grid = np.meshgrid(yi, zi)

# 5. 散点插值到规则网格
var_grid = griddata((y, z), var, (yi_grid, zi_grid), method='cubic')

# 6. 绘图,使用以白为中心的对称调色板
plt.figure(figsize=(8, 6))
# 对称色标范围,保证0对应调色板中心白色
val_extreme = np.max(np.abs(var))
pcm = plt.pcolormesh(zi_grid, yi_grid, var_grid, cmap='RdBu_r', vmin=-val_extreme, vmax=val_extreme)
# 添加色标
plt.colorbar(pcm)
# 坐标轴和标题可按需修改
plt.xlabel('Z')
plt.ylabel('Y')
plt.title('X=16 切片云图')

plt.savefig("figure.png", dpi=300, bbox_inches='tight')
plt.close()

核心修改说明

  • 修正了切片数据的提取逻辑:直接从vtkCutter的输出结果中取切片对应的点和标量,避免和原全量体数据混淆
  • 替换了错误的绘图函数:原脚本使用线图函数plt.plot无法绘制云图,改为plt.pcolormesh绘制伪彩色图
  • 实现了对称调色板:将色标上下限设置为标量绝对值的最大值和负最大值,保证调色板中心的白色对应数值0,RdBu_r为红蓝对称调色板,你也可以替换为seismic、bwr等其他对称调色板适配你的需求
  • 修复了插值网格的构造逻辑,匹配X=16平面上只有y、z两个维度变化的特性

内容的提问来源于stack exchange,提问作者Avles Edivad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:15:01