PyVista 是一个功能强大的 Python 库,专为科学计算中的 3D 可视化设计

PyVista 是一个功能强大的 Python 库,专为科学计算中的 3D 可视化设计
PyVista 是一个功能强大的 Python 库专为科学计算中的 3D 可视化设计基于 VTKVisualization Toolkit构建但提供了更简洁、Pythonic 的 API。它广泛应用于地球科学、流体力学、结构力学、医学成像、计算几何等领域支持网格PolyData,UnstructuredGrid,StructuredGrid、标量/矢量场、等值面、切片、流线、光照渲染、交互式窗口如 Qt、Jupyter 支持以及高质量静态导出PNG、PDF、HTML、GLB 等。核心特性包括✅ 快速加载/生成各类网格支持.vtk,.vtu,.stl,.obj,.ply,.xdmf等格式✅ 标量/矢量场映射与着色add_mesh(..., scalars..., cmapviridis, clim[min,max])✅ 内置滤波器slice(),contour(),glyph(),warp_by_scalar(),extract_surface()等✅ 支持多视图、子图Plotter.subplot()、动画Plotter.add_callback()或Plotter.write_animation()✅ Jupyter 中原生支持交互式 3D 渲染需pyvista.set_jupyter_backend(panel/trame/ipygany✅ GPU 加速渲染通过pyvista.OFF_SCREEN Trueexport_vtkjs实现 Web 可视化示例绘制一个带标量场的球面并添加切片importpyvistaaspv spherepv.Sphere(theta_resolution60,phi_resolution60)sphere[scalars]sphere.points[:,2]# z 坐标作为标量plotterpv.Plotter()plotter.add_mesh(sphere,scalarsscalars,cmapcoolwarm,show_edgesFalse)plotter.add_mesh(sphere.slice(z),colorred,opacity0.7)plotter.show()在 PyVista 中加载和可视化 OpenFOAM 或 ANSYS Fluent 的 CFD 结果如.vtu、.foam、.cas.h5.dat.h5等格式非常直接因为 PyVista 原生支持 VTK 格式包括并行 VTU、PVTU、XDMF而 OpenFOAM 和 Fluent新版 Fluent 2021R2均可导出标准 VTK 兼容格式。✅推荐工作流如下1️⃣ OpenFOAM 数据.foam或.vtu/.pvtu方法 A直接加载.foam目录需 OpenFOAM 安装或foamToVTK预处理PyVista 本身不原生解析.foam原始目录但可借助pyvista.read()读取其导出的 VTK 文件# 终端中先用 OpenFOAM 工具导出推荐foamToVTK-case/path/to/case-timelatestTime-ascii# 或省略 -ascii 得二进制更高效然后 Python 中加载importpyvistaaspv# 加载单时间步的 .vtu 文件如 postProcessing/foamToVTK/0/U.vtumeshpv.get_reader(U.vtu).read()# 自动识别标量/矢量字段# 或直接读取若为单文件# mesh pv.read(U.vtu)print(mesh.point_data.keys())# 查看可用字段如 U速度矢量、p压力方法 B使用pyvista.read()直接读.pvtu并行 OpenFOAM 输出meshpv.read(case.0001.pvtu)# 自动合并所有 rank 的分片2️⃣ ANSYS Fluent 数据Fluent 支持导出为VTK.vtm/.vtu或HDF5.h5格式需启用File → Export → Solution Data✅导出为 VTK推荐在 Fluent GUI 中File → Export → Solution Data → Format: VTK→ 选择变量Velocity, Pressure, Turbulence…→ 导出为fluent_result.vtm多块结构或fluent_result_*.vtu分块。PyVista 加载# 加载 VTMVTK MultiBlock文件multi_blockpv.read(fluent_result.vtm)# 合并为单一网格若需统一处理combinedmulti_block.combine()# 或遍历各块分别可视化fori,blockinenumerate(multi_block):ifhasattr(block,point_data)andvelocityinblock.point_data:plotter.add_mesh(block,scalarsvelocity,vector_plotTrue)⚠️HDF5.h5注意Fluent 默认 HDF5 不符合 VTK 标准不能直接pv.read()。需先用 Fluent 内置导出为 VTK或借助ansys-fluent-reader第三方库解析后转 PyVista 网格。3️⃣ 可视化典型 CFD 场示例importpyvistaaspv# 加载 Fluent 导出的 vtm 或 OpenFOAM 的 vtumeshpv.read(result.vtm).combine()# 合并多块# 显示压力场标量plotterpv.Plotter()plotter.add_mesh(mesh,scalarspressure,cmapplasma,show_edgesFalse)# 添加速度矢量glyphifvelocityinmesh.point_data:arrowsmesh.glyph(orientvelocity,scalevelocity,factor0.01)plotter.add_mesh(arrows,colorwhite,opacity0.8)# 添加切片观察内部流动slice_zmesh.slice(normalz,origin(0,0,0.5))plotter.add_mesh(slice_z,scalarsvelocity,cmapturbo,opacity0.7)plotter.show()提示大型网格建议启用pv.set_jupyter_backend(trame)或OFF_SCREENTrue避免 GUI 卡顿使用mesh.decimate(0.9)或mesh.extract_surface()降低面数提升性能时间序列数据可用pv.read(case_*.vtu)glob批量读取配合Plotter.open_movie()制作动画。