注釈
Go to the end をクリックすると完全なサンプルコードをダウンロードできます.
カラーサイクリング#
プロッターにメッシュを順次追加する際に,色を循環させるようにしました.
Matplotlibのような多くのプロットライブラリは,あらかじめ定義された色のリストを循環して,グラフィックに追加されるデータを色付けします.PyVistaは,Matplotlibとほぼ同じ方法でこれをサポートしています.
import pyvista as pv
PyVistaのテーマでカラーサイクリングをオンにして,デフォルトのサイクラーを使用するように設定します.
pv.global_theme.color_cycler = 'default'
サイクラーで使用できる色の一覧
pv.global_theme.color_cycler
プロッタを作成し,シーンにデータを追加します.各 add_mesh
の呼び出しは, pv.global_theme.color_cycler
の色に対して反復処理されることが分かります.
pl = pv.Plotter()
pl.add_mesh(pv.Cone(center=(0, 0, 0)))
pl.add_mesh(pv.Cube(center=(1, 0, 0)))
pl.add_mesh(pv.Sphere(center=(1, 1, 0)))
pl.add_mesh(pv.Cylinder(center=(0, 1, 0)))
pl.show()
サイクラーを使用せず,個々のプロッターに設定するようにテーマを再設定します.
pv.global_theme.color_cycler = None
もし,グローバルなカラーサイクラーを設定せず,単一のプロッタのサイクラーを使用したい場合は, set_color_cycler()
でこれを設定することができます.
pl = pv.Plotter()
# Set to iterate over Red, Green, and Blue
pl.set_color_cycler(['red', 'green', 'blue'])
pl.add_mesh(pv.Cone(center=(0, 0, 0))) # red
pl.add_mesh(pv.Cube(center=(1, 0, 0))) # green
pl.add_mesh(pv.Sphere(center=(1, 1, 0))) # blue
pl.add_mesh(pv.Cylinder(center=(0, 1, 0))) # red again
pl.show()
さらに,アクティブな renderer
で set_color_cycler()
を呼び出すと,レンダラーごとにこれをコントロールすることができます.
pl = pv.Plotter(shape=(1, 2))
pl.subplot(0, 0)
pl.renderer.set_color_cycler('default')
pl.add_mesh(pv.Cone(center=(0, 0, 0)))
pl.add_mesh(pv.Cube(center=(1, 0, 0)))
pl.add_mesh(pv.Sphere(center=(1, 1, 0)))
pl.add_mesh(pv.Cylinder(center=(0, 1, 0)))
pl.subplot(0, 1)
pl.renderer.set_color_cycler(['magenta', 'seagreen', 'aqua', 'orange'])
pl.add_mesh(pv.Cone(center=(0, 0, 0)))
pl.add_mesh(pv.Cube(center=(1, 0, 0)))
pl.add_mesh(pv.Sphere(center=(1, 1, 0)))
pl.add_mesh(pv.Cylinder(center=(0, 1, 0)))
pl.link_views()
pl.view_isometric()
pl.show()
また,アクターをシーンに追加した後でも,色を変更することができます.
プロによるアドバイス:以下のfor-loopをキーイベントのイベントコールバックに配置すると,オンデマンドで色を循環させることができます.あるいは,サイクラーにランダムに色を選択させるのもよいでしょう.
from cycler import cycler
pl = pv.Plotter()
pl.add_mesh(pv.Cone(center=(0, 0, 0)))
pl.add_mesh(pv.Cube(center=(1, 0, 0)))
pl.add_mesh(pv.Sphere(center=(1, 1, 0)))
pl.add_mesh(pv.Cylinder(center=(0, 1, 0)))
colors = cycler('color', ['lightcoral', 'seagreen', 'aqua', 'firebrick'])()
for actor in pl.renderer.actors.values():
if isinstance(actor, pv.Actor):
actor.prop.color = next(colors)['color']
pl.show()
Total running time of the script: (0 minutes 1.165 seconds)