視覚化の事例¶
ボリュームスカラーデータの視覚化¶
3Dスカラーフィールドを可視化するには,主に3つの方法があります.次のフィールドを指定します.
import numpy as np
x, y, z = np.ogrid[-10:10:20j, -10:10:20j, -10:10:20j]
s = np.sin(x*y*z)/(x*y*z)
- 等値面:
フィールドの等値面を表示する最も簡単な方法は
mlab
contour3d()
関数を使用することです.mlab.contour3d(s)
この方法の問題は,外側の等値面が内側の等値面を隠す傾向があることです.その結果,1つの等値面しか表示されないことがよくあります.
- ボリュームレンダリング:
ボリュームレンダリングは,各ボクセルに部分的に透明なカラーを与える高度なテクニックです.これは mlab.pipeline で実現できます.
scalar_field()
ソースと volume モジュールを使用します.mlab.pipeline.volume(mlab.pipeline.scalar_field(s))
このような視覚化では,良好な効果を得るために不透明度の転送関数を微調整することが重要です.通常,ボリュームの透過性を適切な割合にするには,下限値と上限値をデータの80パーセンタイルと20パーセンタイルに制限すると便利です.
mlab.pipeline.volume(mlab.pipeline.scalar_field(s), vmin=0, vmax=0.8)
モジュールのダイアログボックス(例えば,パイプラインインターフェースを使ったり, edit_traits() メソッドを使ったりします.)を開き,カラー転送関数を調整してイメージの透明で低強度の領域をレンダリングすると便利です. このモジュール では,** Colors and Legends ** ノードで定義されているLUTは使用されません.**
ボリュームレンダリングの限界は,多くの場合非常にきれいですが,それを使用してフィールドの詳細を分析することが難しいことです.
- 切断面:
あまり印象的ではありませんが,断面はスカラーフィールドの詳細を視覚化するための非常に有益な方法です.
mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s), plane_orientation='x_axes', slice_index=10, ) mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s), plane_orientation='y_axes', slice_index=10, ) mlab.outline()
イメージプレーンウィジェットは,
mlab
volume_slice()
関数を使用してNumPy配列から作成することもできます.mlab.volume_slice(s, plane_orientation='x_axes', slice_index=10)
イメージプレーンウィジェットは, mlab.pipeline.scalar_field によって作成された正規の間隔のデータでのみ使用できます.したがって,可能な場合はスカラー切断面を優先する必要があります.
切断面をクリックしてドラッグすると,フィールドを効率的に表示できます.
- 技術の組み合わせ:
最後に,切断面を等値面と組み合わせて,等値面を使用してピーク領域のビューを表示したり,切断面を使用してフィールドの詳細を視覚化したり,等値面が大きいグローバル質量を表示したりすることもできます.
src = mlab.pipeline.scalar_field(s) mlab.pipeline.iso_surface(src, contours=[s.min()+0.1*s.ptp(), ], opacity=0.1) mlab.pipeline.iso_surface(src, contours=[s.max()-0.1*s.ptp(), ],) mlab.pipeline.image_plane_widget(src, plane_orientation='z_axes', slice_index=10, )
上記の例では,データソースとして単一のスカラーフィールドを使用するために,
contour3d()
とvolume_slice()
の代わりにmayaviのパイプライン構文を使用しています.この例では使用しませんが,場合によっては,切断面の前にしきい値フィルタを挿入して,たとえば,の値より小さい領域を削除することができます. 's.min()+0.1*s.ptp()' となります.この場合,切断面は mlab.pipeline.scalar_cut_plane で実装する必要があります.しきい値を設定した後でデータの構造体が失われた場合に使用されます.
ベクトルフィールドの視覚化¶
ベクトルフィールド,すなわちボリューム内で連続的に定義されたベクトルは,多くの情報を含んでいるため,視覚化が困難な場合があります.グリッド , u, v, w でサンプリングされた構成要素によって定義される,流体力学における多軸対流セル [1], の速度場について,異なる可視化を検討します.
import numpy as np
x, y, z = np.mgrid[0:1:20j, 0:1:20j, 0:1:20j]
u = np.sin(np.pi*x) * np.cos(np.pi*z)
v = -2*np.sin(np.pi*y) * np.cos(2*np.pi*z)
w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)
- Quiver:
ベクトルの集合を最も簡単に視覚化するには, mlab 関数 quiver3d を使用します.
mlab.quiver3d(u, v, w) mlab.outline()
この視覚化の主な制限は,グリッド上のサンプリングポイントごとに矢印を配置することです.その結果,ビジュアライゼーションは非常にビジーになります.
- マスクベクトル:
表示される矢印の数を減らすために,ベクトルの束だけでなく,ベクトルフィールドを視覚化しているということを利用できます.このためには, vector_field ソースを構築し,いくつかのマスキングパラメータ(ここでは,私たちは20のうちの一つの点だけをとっておく)を使用して vectors モジュールを適用する必要があります.
src = mlab.pipeline.vector_field(u, v, w) mlab.pipeline.vectors(src, mask_points=20, scale_factor=3.)
- 切断面:
カットに沿ってベクトルを表示する場合は,カット平面を使用できます.特に,切断面を移動してベクトルフィールドをインタラクティブに検査できます.ベクトルフィールドをクリックしてドラッグすると,ベクトルフィールドを非常に明確に理解できます.
mlab.pipeline.vector_cut_plane(src, mask_points=2, scale_factor=3)
- 大きさの等値面:
ベクトルフィールドの重要なパラメータは,その大きさです.ベクトルの法線のアイソサーフェスを表示すると,面白いことがあります.このために,ExtractVectorNormフィルタを使用してベクトルフィールドからスカラフィールドを作成し,その上でIso-Surfaceモジュールを使用します.インタラクティブに作業する場合,オブジェクトのプロパティダイアログで輪郭の値を変更すると,フィールドの大きさを十分に理解できます.
magnitude = mlab.pipeline.extract_vector_norm(src) mlab.pipeline.iso_surface(magnitude, contours=[1.9, 0.5])
- フローまたはフィールドライン:
特定のベクトルフィールドでは,フィールドに沿ったフローラインに興味深い意味があります.たとえば,これは流体力学の軌跡,あるいは電磁界の磁力線として解釈することができる. streamline モジュール,または mlab
flow()
関数を使用して,特定のシードサーフェスで生成されたフローラインを表示できます.flow = mlab.flow(u, v, w, seed_scale=1, seed_resolution=5, integration_direction='both')
- 技術の組み合わせ:
ベクトルフィールドを意味のある形で視覚化するのは困難な作業であり,手元にあるすべてのツールを使用して目的を説明する必要があります.伝えるメッセージを選ぶことが大切です.ベクトルフィールドのすべてを視覚化することはできません.上のさまざまなツールを組み合わせて作成したビジュアライゼーションの例を次に示します.
mlab.figure(fgcolor=(0., 0., 0.), bgcolor=(1, 1, 1)) src = mlab.pipeline.vector_field(u, v, w) magnitude = mlab.pipeline.extract_vector_norm(src) # We apply the following modules on the magnitude object, in order to # be able to display the norm of the vectors, eg as the color. iso = mlab.pipeline.iso_surface(magnitude, contours=[1.9, ], opacity=0.3) vec = mlab.pipeline.vectors(magnitude, mask_points=40, line_width=1, color=(.8, .8, .8), scale_factor=4.) flow = mlab.pipeline.streamline(magnitude, seedtype='plane', seed_visible=False, seed_scale=0.5, seed_resolution=1, linetype='ribbon',) vcp = mlab.pipeline.vector_cut_plane(magnitude, mask_points=2, scale_factor=4, colormap='jet', plane_orientation='x_axes')
注釈
このセクションの大部分は,ビジュアル化オブジェクトを作成するためのコードの断片に集中していますが,Mayaviはインタラクティブなプログラムであり,これらのオブジェクトのプロパティはインタラクティブに変更できることを覚えておくことが重要です. オブジェクトのプロパティをインタラクティブに変更する を参照.視覚化に最適なパラメータを事前に選択することは,多くの場合不可能です.カラー,輪郭値,カラーマップ,ビュー角度など.対話的に選択する必要があります.再現性が必要な場合は,選択した値を元のスクリプトに追加できます.
さらに, mlab 関数は,可視化オブジェクトの可能性のほんの一部しか公開しません.ダイアログには,mlab関数によって返されるオブジェクトの属性によって完全に制御される,これらの機能の多くが表示されます.これらのオブジェクトはVTKオブジェクトから作成されているため,非常に豊富です.これらのファイルを表示しているときや,VTKのドキュメントでは,修正すべき適切な属性を見つけるのが難しいかもしれません.ですから,パイプラインビューダイアログを使って対話的に変更し, record feature を使って対応するコード行を見つけるのが最も簡単な方法です. Mayaviの視覚化の構成:パイプライン を参照して,レコード機能によって生成されたコード行と mlab の間のリンクをよりよく理解してください..