pyvista について
PyVistaは、地質モデル、メッシュ、点群を扱う科学分野向けのPython 3D可視化ツールです。VTKをPython向けAPIで利用でき、画像や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 | 大規模な3DデータセットをGUIで対話的に調査 | GUI中心で、スクリプト機能は二次的 |
| matplotlib 3D | シンプルな3D散布図/サーフェスプロット | 対話性に限界があり、真の3Dエンジンではない |
次の場合は pyvista を使用してください。 地質モデル、メッシュ、または点群を、 VTKの機能とPythonらしいAPIを使ってプログラムから3D可視化する必要がある場合。
次の場合は代替手段を検討してください。 大規模モデルを調査するための完全な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 対応