Color Cycling#

Cycle through colors when sequentially adding meshes to a plotter.

Many plotting libraries like Matplotlib cycle through a predefined list of colors to colorize the data being added to the graphic. PyVista supports this in much the same way as Matplotlib.

import pyvista as pv

Turn on color cycling in PyVista’s theme and set it to use the default cycler.

pv.global_theme.color_cycler = 'default'

List the available colors in the cycler

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


Create a plotter and add data to the scene. You’ll notice that each add_mesh call iterates over the colors in 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

Reset the theme to not use a cycler and instead set on individual plotters.

pv.global_theme.color_cycler = None

If you do not want to set a global color cycler but instead just want to use a cycler for a single plotter, you can set this on with 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

Further, you can control this on a per-renderer basis by calling set_color_cycler() on the active renderer.

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

You can also change the colors of actors after they are added to the scene.

ProTip: you could place the for-loop below in an event callback for a key event to cycle through the colors on-demand. Or better yet, have your cycler randomly select colors.

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.072 seconds)

Gallery generated by Sphinx-Gallery