この記事は Calendar for UdonTech Advent Calendar 2021 | Advent Calendar 2021 - Qiita の3日目の穴埋め記事です。
pyvistaとは
pyvistaとはpythonでVTKを扱うためのモジュールです。 "VTK for humans" という素晴らしい響きのキャッチフレーズが全てを表わしているんじゃないでしょうか。
VTKというのは、数値計算業界ではデファクトスタンダードとなっている*1可視化用のファイルフォーマットと、それを扱うためのToolkitです。たぶんComputer Visionの人達には、ポイントクラウドのレンダリングに使ってるやつとして親しまれてるんじゃないでしょうか。*2
VTKの可視化の例を知りたい方は、こちらのギャラリーをご覧ください。
pyvistaを使うとこれが人間にも簡単に扱えるということに加えて、jupyter notebookでのレンダリングもできるということのようなので、今日はこれを試してみたいと思います。
Jupyter Notebook Plotting — PyVista 0.32.0 documentation
テスト環境
- MacBook Air (M1, 2020)
- macOS Monterey 12.1
- jupyter lab desktop app version 3.2.5-2
- conda 4.11.0
インストール
condaでpyvista本体をインストールします。
conda install -c conda-forge pyvista
続けてjupyterから使うためのモジュールがいくつか用意されているので、とりあえずかたっぱしから入れてみます。ただし、ipyganyについては
Currently, this backend has inferior support and features than the pythreejs.
とのことなのパスで。
また、itkwidgetsも
JupyterLab 3 support is not yet available. JupyterLab 2 or the Jupyter Notebook are possible alternatives.
とのことなのでパスしました。
pythreejs
conda install -c conda-forge pythreejs
panel
conda install -c conda-forge panel
ipyvtklink
conda install -c conda-forge ipyvtklink
この3つはどう違うかというと
pythreejs - three.jsを使ってクライアントサイドでレンダリング
panel - vtk.jsを使ってクライアントサイドでレンダリング
ipyvtklink - サーバサイドのPyVistaを使ったレンダリング結果をノートブックへストリーミング
ということのようです。
インタラクティブにやるなら、pythreejs, 重いデータでjupyter labのサーバとクアイアントの距離が離れてる時(colabを使う時とか?)は、ipyvtklinkの方が有利になりそうですね。
まーぶっちゃけうちの環境(jupyter lab desktop app)なら、サーバサイドかクライアントサイドかの違いは大差無いはずなので、レンダリングエンジン(threejs, vtk.js or vtk)の違いだけですね。
バックエンドの切り替え方法
Jupyter Notebook Plotting — PyVista 0.32.0 documentation
set_jupyter_backend()を使って、事前に設定しておくか、plot時にjupyter_backend引数から渡せば良いみたいです。
実際に表示してみる。
pythreejsのサンプルとして載っているこちらのコードを使って、jupyter_backend引数を変えて各レンダリングエンジンで同じものを表示してみました。
import pyvista as pv from pyvista import examples # download an example and display it using physically based rendering. mesh = examples.download_lucy() mesh.plot(color='lightgrey', pbr=True, metallic=0.2, jupyter_backend='pythreejs')
pythreejs
panel *3
ipyvtklink
画像のサイズがバラバラですが
- pythreejs -> コード部まで含めて画面の高さに合わせる
- panel -> 画面の幅に合わせる。高さはモデルのサイズに合わせる?(固定値かも)
- ipyvtklink -> 表示部と画面の高さを合わせる
という挙動のようにみえます。
まず、操作性に関してですが、pythreejs、panelと比べるとipyvtklinkは格段に落ちます。 まさにparaviewなりfieldviewなりの可視化ソフトでリモート可視化をしている時の感覚に近いです。 データもレンダリングもローカルマシンでやっててこの操作感はちょっと辛い
表示品質は
- pythreejs -> "キレイ"すぎて使えない
- panel -> ごく普通(当然のことだけどparaviewと同じレベル)
といった感じです。
オプションをいじれば、また違ってくるとは思うんですが、なんかpythreejsの陰影の付け方が見映え重視のようで、これに物理量の表示を重ねたりするとちょっと見辛そうな感じがします。
ローカルにあるファイルの表示
前の例では、PyVistaが用意しているサンプルファイルをダウンロードしてきて表示しましたが、PC内にあるファイルを表示するケースの方が多いんじゃないでしょうか。
とりあえず、HPC業界内の超有名モデルをダウンロードして、表示してみました。
彼はobjファイルとして配布されていますが、PyVista.read()で簡単に読めます!! 一応コードも書いておきますが、たったの3行です。
import pyvista as pv mesh=pv.read('motorBike.obj') mesh.plot(color='lightgrey', jupyter_backend='panel')
続いて、STLファイルが読めるか確認してみましょう。 データは国土地理院が配布している、香川県のSTLファイルを使います。
こちらのページからSTLファイルをダウンロードして表示します。
なんか凄い向きなんで、調整してみましょう。
mesh.rotate_x(-45) mesh.rotate_y(180) mesh.rotate_z(-45) mesh.plot(color='lightgrey', jupyter_backend='panel')
ドキュメントによると、STLとOBJ以外にも、BYUファイルというのと(当然ながら)VTKファイルも扱えるようです。
シミュレーションの実行結果ファイルがあれば、スライスを切ってコンターを描いたりなんて処理もjupyter lab上でできるようなので、レポート作成が捗りそうですね。
まとめ
Jupyterlabとpandas, matplotlib, PyVistaがあればたぶん私の仕事の報告資料全部作れる予感・・・