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 exampl
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):
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.
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)
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)