关于 pyvista
PyVista 是面向科学工作者的 Python 3D 可视化与网格处理工具,适用于地质模型、网格和点云。它以 Python API 封装 VTK,并支持导出图像和 HTML。
主要功能
- 01读写常见 VTK 格式
- 02渲染网格、网格数据和点云
- 03体渲染与切片
- 04以颜色和不透明度组合曲面
- 05导出截图和交互式 HTML
适用场景
- 01查看地质层面和断层曲面
- 02可视化地震体数据及切片
- 03在曲面旁展示井眼路径
- 04通过批处理脚本生成出版图像
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ steadfastasart/ geoscience-skills --skill pyvista安装后在 Claude Code 中输入/pyvista确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/mesh_types.mdplotting_options.mdscripts/visualize_surface.py详细介绍
PyVista - 3D 可视化
快速参考
import pyvista as pv
mesh = pv.read('model.vtk')
plotter = pv.Plotter()
plotter.add_mesh(mesh, scalars='property', cmap='viridis')
plotter.show()
关键类
| 类 | 用途 |
|---|---|
pv.Plotter | 主可视化窗口 |
pv.PolyData | 表面网格、点云 |
pv.StructuredGrid | 规则 3D 网格 |
pv.UnstructuredGrid | 非规则网格 |
pv.ImageData | 3D 体素数据(地震数据) |
基本操作
加载并显示网格
mesh = pv.read('model.vtk')
plotter = pv.Plotter()
plotter.add_mesh(mesh, scalars='lithology', cmap='Set1')
plotter.show()
创建结构化网格(表面)
x, y = np.meshgrid(np.arange(-10, 10, 0.5), np.arange(-10, 10, 0.5))
z = np.sin(np.sqrt(x**2 + y**2))
grid = pv.StructuredGrid(x, y, z)
pv.Plotter().add_mesh(grid, scalars=z.ravel(), cmap='terrain').show()
可视化点云
cloud = pv.PolyData(np.random.rand(1000, 3) * 100)
cloud['depth'] = cloud.points[:, 2]
pv.Plotter().add_mesh(cloud, scalars='depth', point_size=5,
render_points_as_spheres=True).show()
体渲染(地震数据)
grid = pv.ImageData(dimensions=(nx+1, ny+1, nz+1), spacing=(25, 25, 10))
grid.cell_data['amplitude'] = data.ravel(order='F')
pv.Plotter().add_volume(grid, cmap='seismic', opacity='sigmoid').show()
对体数据进行切片
volume = pv.read('seismic.vti')
slice_x = volume.slice(normal='x', origin=volume.center)
pv.Plotter().add_mesh(slice_x, cmap='seismic').show()
可视化井轨迹
points = np.column_stack([x, y, z]) # Well trajectory
tube = pv.Spline(points, 500).tube(radius=5)
pv.Plotter().add_mesh(tube, color='brown', label='Well').add_legend().show()
合并多个表面
plotter = pv.Plotter()
plotter.add_mesh(horizon1, color='gold', opacity=0.7, label='Top')
plotter.add_mesh(horizon2, color='blue', opacity=0.7, label='Base')
plotter.add_mesh(fault, color='red', opacity=0.5, label='Fault')
plotter.add_legend().show()
导出用于出版
plotter = pv.Plotter(off_screen=True)
plotter.add_mesh(mesh, cmap='terrain')
plotter.screenshot('figure.png', scale=3) # High-res image
plotter.export_html('model.html') # Interactive HTML
颜色映射
| 映射 | 用例 |
|---|---|
terrain | 地形、海拔 |
seismic | 地震振幅(发散) |
viridis | 通用科学用途 |
Set1, Set2 | 分类数据(岩性) |
支持的格式
.vtk、.vtu、.vti、.vtp、.stl、.obj、.ply(读写)
适用场景与替代方案
| 工具 | 最适用于 | 局限性 |
|---|---|---|
| pyvista | Python 风格的 3D 可视化、VTK 封装、网格操作、脚本编写 | 需要显示器或离屏后端 |
| Mayavi | 科学 3D 可视化、体渲染 | 依赖较重,开发活跃度较低 |
| ParaView | 通过交互式 GUI 探索大型 3D 数据集 | 侧重 GUI,脚本功能次要 |
| matplotlib 3D | 简单的 3D 散点图/曲面图 | 交互性有限,并非真正的 3D 引擎 |
在以下情况下使用 pyvista:需要以编程方式可视化地质模型、网格或点云,并利用 VTK 的强大功能和 Python 风格的 API。
在以下情况下考虑替代方案:需要通过完整 GUI 探索大型模型(使用 ParaView)、进行传统科学可视化(使用 Mayavi),或只需要简单的 3D 散点图(使用 matplotlib 3D)。
常见工作流
可视化包含多个表面的 3D 地质模型
- 使用
pv.read()加载每个表面/层位的网格文件 - 使用
pv.Plotter()创建绘图器(脚本中使用off_screen=True) - 使用
plotter.add_mesh()添加各个表面,并设置不同的颜色/不透明度 - 使用
pv.Spline().tube()将井轨迹添加为管状体 - 使用
plotter.add_axes()和plotter.add_legend()添加坐标轴和图例 - 设置相机位置以获得所需的视角
- 使用
plotter.screenshot()导出截图,或使用plotter.export_html()导出 HTML
提示
- 批处理时使用
off_screen=True - 使用
plotter.add_axes()添加坐标轴,以用于出版 - 导出为 HTML,以便交互式分享
- 使用不透明度显示内部结构
参考资料
脚本
- scripts/visualize_surface.py - 从文件可视化地质表面
评论
支持 Markdown