カラーサイクリング#

プロッターにメッシュを順次追加する際に,色を循環させるようにしました.

Matplotlibのような多くのプロットライブラリは,あらかじめ定義された色のリストを循環して,グラフィックに追加されるデータを色付けします.PyVistaは,Matplotlibとほぼ同じ方法でこれをサポートしています.

import pyvista as pv

PyVistaのテーマでカラーサイクリングをオンにして,デフォルトのサイクラーを使用するように設定します.

pv.global_theme.color_cycler = 'default'

サイクラーで使用できる色の一覧

pv.global_theme.color_cycler
'color'
'#1f77b4'
'#ff7f0e'
'#2ca02c'
'#d62728'
'#9467bd'
'#8c564b'
'#e377c2'
'#7f7f7f'
'#bcbd22'
'#17becf'


プロッタを作成し,シーンにデータを追加します.各 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()
color cycler

サイクラーを使用せず,個々のプロッターに設定するようにテーマを再設定します.

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()
color cycler

さらに,アクティブな rendererset_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()
color cycler

また,アクターをシーンに追加した後でも,色を変更することができます.

プロによるアドバイス:以下の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()
color cycler

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

Sphinx-Galleryによるギャラリー