mcpField
P
pyvista

pyvista

github.com/steadfastasart数据与数据库7382 次安装6 周前更新
代码仓库

关于 pyvista

PyVista 是面向科学工作者的 Python 3D 可视化与网格处理工具,适用于地质模型、网格和点云。它以 Python API 封装 VTK,并支持导出图像和 HTML。

主要功能

  1. 01读写常见 VTK 格式
  2. 02渲染网格、网格数据和点云
  3. 03体渲染与切片
  4. 04以颜色和不透明度组合曲面
  5. 05导出截图和交互式 HTML

适用场景

  1. 01查看地质层面和断层曲面
  2. 02可视化地震体数据及切片
  3. 03在曲面旁展示井眼路径
  4. 04通过批处理脚本生成出版图像

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/steadfastasart/geoscience-skills --skill pyvista

安装后在 Claude Code 中输入/pyvista确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
mesh_types.md
plotting_options.md
scripts/
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.ImageData3D 体素数据(地震数据)

基本操作

加载并显示网格
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(读写)

适用场景与替代方案

工具最适用于局限性
pyvistaPython 风格的 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,以便交互式分享
  • 使用不透明度显示内部结构

参考资料

脚本

评论

支持 Markdown