マッピング前に補間#

add_mesh メソッドには interpolate_before_map 引数があり,スカラーデータを色で可視化する方法を変更することができます. この効果は,データセットのトポロジーと選択されたカラーマップによって異なります.

この例では,この違いと,この機能をデフォルトで有効にした理由を説明します.

詳しくは What is InterpolateScalarsBeforeMapping in VTK? をご覧ください.

import pyvista as pv

メッシュは,ノードまたはセルのデータによって色付けされます.ノードのデータによってメッシュを色付けする場合は,値をセルの面全体に補間する必要があります.これらのスカラーを補間するプロセスは重要です. interpolate_before_map を省略すると,カラーマッピングはポリゴンポイントで行われ,カラーは補間されますが,一般的には精度が低くなります.一方, interpolate_before_map がオンの場合は,スカラーはデータセットのトポロジ全体にわたって補間され,より精度が高くなります.

要約すると, interpolate_before_map がオフの場合,色はレンダリング後に補間され, interpolate_before_map がオンの場合,スカラーはメッシュ全体で補間され,それらの値が色にマッピングされます.

違いを見てみましょう

# Load a cylinder which has cells with a wide spread
cyl = pv.Cylinder(direction=(0, 0, 1), height=2).elevation()

# Common display argument to make sure all else is constant
dargs = dict(scalars='Elevation', cmap='rainbow', show_edges=True)

p = pv.Plotter(shape=(1, 2))
p.add_mesh(
    cyl,
    interpolate_before_map=False,
    scalar_bar_args={'title': 'Elevation - not interpolated'},
    **dargs,
)
p.subplot(0, 1)
p.add_mesh(
    cyl, interpolate_before_map=True, scalar_bar_args={'title': 'Elevation - interpolated'}, **dargs
)
p.link_views()
p.camera_position = [(-1.67, -5.10, 2.06), (0.0, 0.0, 0.0), (0.00, 0.37, 0.93)]
p.show()
interpolate before map

上の図に示すように,マッピング前にスカラーを補間しない場合,基本のグラフィックライブラリ (OpenGL) によって頂点間でカラー(スカラーではなくRGB値)が補間され,表示されるカラーは正確ではありません.

ワイヤフレームの表示でも,同じ補間効果が得られます.

# Common display argument to make sure all else is constant
dargs = dict(scalars='Elevation', cmap='rainbow', show_edges=True, style='wireframe')

p = pv.Plotter(shape=(1, 2))
p.add_mesh(
    cyl,
    interpolate_before_map=False,
    scalar_bar_args={'title': 'Elevation - not interpolated'},
    **dargs,
)
p.subplot(0, 1)
p.add_mesh(
    cyl, interpolate_before_map=True, scalar_bar_args={'title': 'Elevation - interpolated'}, **dargs
)
p.link_views()
p.camera_position = [(-1.67, -5.10, 2.06), (0.0, 0.0, 0.0), (0.00, 0.37, 0.93)]
p.show()
interpolate before map

上のcyliderメッシュは,頂点間に広いスプレッドがあり(点は円柱の上部と下部のみにあります),メッシュの高いサーフェスを補間する必要があるため,これに関する優れたサンプルデータセットです.

ただし,ほとんどのメッシュではそのような広がりはなく,カラー補間の効果を確認するのは困難です.waveletの例を見て, interpolate_before_map オプションがレンダリングにどのように影響するかを調べてみましょう.

wavelet = pv.Wavelet().clip('x')

# Common display argument to make sure all else is constant
dargs = dict(scalars='RTData', cmap='rainbow', show_edges=True)

p = pv.Plotter(shape=(1, 2))
p.add_mesh(
    wavelet,
    interpolate_before_map=False,
    scalar_bar_args={'title': 'RTData - not interpolated'},
    **dargs,
)
p.subplot(0, 1)
p.add_mesh(
    wavelet,
    interpolate_before_map=True,
    scalar_bar_args={'title': 'RTData - interpolated'},
    **dargs,
)
p.link_views()
p.camera_position = [(55.0, 16, 31), (-5.0, 0.0, 0.0), (-0.22, 0.97, -0.09)]
p.show()
interpolate before map

今回は違いに気付くのがかなり難しいです-違いはそこにあり,微妙ですが,存在しています.カラーマップ内の色の数を減らすと,違いがより顕著になります. n_colors 引数によって8つの個別の色を使用する場合の違いを見てみましょう.

dargs = dict(scalars='RTData', cmap='rainbow', show_edges=True, n_colors=8)

p = pv.Plotter(shape=(1, 2))
p.add_mesh(
    wavelet,
    interpolate_before_map=False,
    scalar_bar_args={'title': 'RTData - not interpolated'},
    **dargs,
)
p.subplot(0, 1)
p.add_mesh(
    wavelet,
    interpolate_before_map=True,
    scalar_bar_args={'title': 'RTData - interpolated'},
    **dargs,
)
p.link_views()
p.camera_position = [(55.0, 16, 31), (-5.0, 0.0, 0.0), (-0.22, 0.97, -0.09)]
p.show()
interpolate before map

interpolate_before_map OFF.右, interpolate_before_map ON.

これで,さらに説得力が増しました.右側ではスカラーフィールドの輪郭が表示されていますが,左側ではOpenGLによるカラー補間のために輪郭が不明瞭になっています.どちらの場合も頂点のカラーは同じで,頂点間のカラーの割り当て方法が異なります.

私たちの意見では,色補間は科学的可視化のための好ましいデフォルトではなく, interpolate_before_map フラグを True に設定することを選んだ理由です.

Total running time of the script: (0 minutes 2.120 seconds)

Sphinx-Galleryによるギャラリー