如何使用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
相关产品推荐
相关产品推荐

