When plotting with Bokeh, how do you automatically cycle through a color pallette?
Solution 1
It is probably easiest to just get the list of colors and cycle it yourself using itertools
:
import numpy as np
from bokeh.plotting import figure, output_file, show
# select a palette
from bokeh.palettes import Dark2_5 as palette
# itertools handles the cycling
import itertools
output_file('bokeh_cycle_colors.html')
p = figure(width=400, height=400)
x = np.linspace(0, 10)
# create a color iterator
colors = itertools.cycle(palette)
for m, color in zip(range(10), colors):
y = m * x
p.line(x, y, legend='m = {}'.format(m), color=color)
p.legend.location='top_left'
show(p)
Solution 2
You can define a simple generator that cycles colors for you.
In python 3:
from bokeh.palettes import Category10
import itertools
def color_gen():
yield from itertools.cycle(Category10[10])
color = color_gen()
or in python 2 (or 3):
from bokeh.palettes import Category10
import itertools
def color_gen():
for c in itertools.cycle(Category10[10]):
yield c
color = color_gen()
and when you need a new color, do:
p.line(x, y1, line_width=2, color=color)
p.line(x, y2, line_width=2, color=color)
Here is the above example:
p = figure(width=400, height=400)
x = np.linspace(0, 10)
for m, c in zip(range(10), color):
y = m * x
p.line(x, y, legend='m = {}'.format(m), color=c)
p.legend.location='top_left'
show(p)
Solution 3
Two small changes will make prior answer work for Python 3.
changed:
for m, color in zip(range(10), colors):
prior:
for m, color in itertools.izip(xrange(10), colors):
Solution 4
In Python > 3.7 you could do something like this:
from bokeh.palettes import Category10_10
color = Category10_10.__iter__()
p.line(x, y1, line_width=2, color=next(color))
This will cycle through each element of the list until exhausted each time you use next()
.
Every sequence type in python can return an iterator object.
Steven C. Howell
Researching novel test and evaluation solutions to foster broader confidence in artificial intelligence and autonomous systems.
Updated on June 06, 2022Comments
-
Steven C. Howell almost 2 years
I want to use a loop to load and/or modify data and plot the result within the loop using Bokeh (I am familiar with Matplotlib's
axes.color_cycle
). Here is a simple exampleimport numpy as np from bokeh.plotting import figure, output_file, show output_file('bokeh_cycle_colors.html') p = figure(width=400, height=400) x = np.linspace(0, 10) for m in xrange(10): y = m * x p.line(x, y, legend='m = {}'.format(m)) p.legend.location='top_left' show(p)
which generates this plot
How do I make it so the colors cycle without coding up a list of colors and a modulus operation to repeat when the number of colors runs out?
There was some discussion on GitHub related to this, issues 351 and 2201, but it is not clear how to make this work. The four hits I got when searching the documentation for
cycle color
did not actually contain the wordcycle
anywhere on the page.