mcpField
P
pyvista

pyvista

github.com/steadfastasartData & databases7382 installsUpdated 6w ago
Repository

About pyvista

PyVista is a Python toolkit for programmatic 3D visualization and mesh work, aimed at scientific users working with geological models, meshes, and point clouds. It wraps VTK with a Python-oriented API and supports image and HTML export.

Key features

  1. 01Load and write common VTK formats
  2. 02Render meshes, grids, and point clouds
  3. 03Volume rendering and slicing
  4. 04Combine surfaces with colors and opacity
  5. 05Export screenshots and interactive HTML

Use cases

  1. 01Inspect geological horizons and fault surfaces
  2. 02Visualize seismic volumes and slices
  3. 03Render well paths alongside surfaces
  4. 04Generate publication images in batch scripts

Install

Copy the command and run it in a terminal.

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

After installing, type/pyvistain Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
mesh_types.md
plotting_options.md
scripts/
visualize_surface.py

Details

From the project README

PyVista - 3D Visualization

Quick Reference

import pyvista as pv

mesh = pv.read('model.vtk')
plotter = pv.Plotter()
plotter.add_mesh(mesh, scalars='property', cmap='viridis')
plotter.show()

Key Classes

ClassPurpose
pv.PlotterMain visualization window
pv.PolyDataSurface meshes, point clouds
pv.StructuredGridRegular 3D grids
pv.UnstructuredGridIrregular meshes
pv.ImageData3D voxel data (seismic)

Essential Operations

Load and Display Mesh
mesh = pv.read('model.vtk')
plotter = pv.Plotter()
plotter.add_mesh(mesh, scalars='lithology', cmap='Set1')
plotter.show()
Create Structured Grid (Surface)
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()
Visualize Point Cloud
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()
Volume Rendering (Seismic)
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()
Slice Through Volume
volume = pv.read('seismic.vti')
slice_x = volume.slice(normal='x', origin=volume.center)
pv.Plotter().add_mesh(slice_x, cmap='seismic').show()
Well Path Visualization
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()
Combine Multiple Surfaces
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()
Export for Publication
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

Color Maps

MapUse Case
terrainTopography, elevation
seismicSeismic amplitudes (diverging)
viridisGeneral scientific
Set1, Set2Categorical (lithology)

Supported Formats

.vtk, .vtu, .vti, .vtp, .stl, .obj, .ply (read/write)

When to Use vs Alternatives

ToolBest ForLimitations
pyvistaPythonic 3D viz, VTK wrapper, mesh operations, scriptingRequires display or off-screen backend
MayaviScientific 3D visualization, volume renderingHeavier dependency, less active development
ParaViewInteractive GUI exploration of large 3D datasetsGUI-focused, scripting is secondary
matplotlib 3DSimple 3D scatter/surface plotsLimited interactivity, not true 3D engine

Use pyvista when you need programmatic 3D visualization of geological models, meshes, or point clouds with VTK power but a Pythonic API.

Consider alternatives when you need a full GUI for exploring large models (use ParaView), legacy scientific visualization (use Mayavi), or only need simple 3D scatter plots (use matplotlib 3D).

Common Workflows

Visualize 3D geological model with multiple surfaces
  • Load mesh files with pv.read() for each surface/horizon
  • Create plotter with pv.Plotter() (use off_screen=True for scripts)
  • Add each surface with plotter.add_mesh() and distinct colors/opacity
  • Add well paths as tubes with pv.Spline().tube()
  • Add axes and legend with plotter.add_axes() and plotter.add_legend()
  • Set camera position for desired view angle
  • Export screenshot with plotter.screenshot() or HTML with plotter.export_html()

Tips

  • Use off_screen=True for batch processing
  • Add axes with plotter.add_axes() for publication
  • Export to HTML for interactive sharing
  • Use opacity to show internal structure

References

Scripts

Comments

Markdown supported