Al trazar con Bokeh, ¿cómo hace un ciclo automáticamente a través de una paleta de colores?

Quiero usar un bucle para cargar y / o modificar datos y trazar el resultado dentro del bucle usando Bokeh (estoy familiarizado con los axes.color_cycle de axes.color_cycle de Matplotlib.color_cycle ). Aquí hay un ejemplo simple.

 import 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) 

lo que genera esta ttwig

parcela de bokeh

¿Cómo lo hago para que los colores circulen sin codificar una lista de colores y una operación de módulo para repetir cuando se acabe la cantidad de colores?

Hubo una discusión sobre GitHub relacionada con esto, números 351 y 2201 , pero no está claro cómo hacer que esto funcione. Los cuatro resultados que obtuve al buscar en la documentación el cycle color no contenían la palabra cycle ninguna parte de la página.

Probablemente sea más fácil obtener la lista de colores y hacer un ciclo usted mismo usando 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) 

introduzca la descripción de la imagen aquí

Dos pequeños cambios harán que la respuesta previa funcione para Python 3.

  • cambiado: for m, color in zip(range(10), colors):

  • antes: for m, color in itertools.izip(xrange(10), colors):

Puedes definir un generador simple que alterne los colores por ti.

En Python 3:

 from bokeh.palettes import Category10 import itertools def color_gen(): yield from itertools.cycle(Category10[10]) color = color_gen() 

o en python 2 (o 3):

 from bokeh.palettes import Category10 import itertools def color_gen(): for c in itertools.cycle(Category10[10]): yield c color = color_gen() 

y cuando necesites un nuevo color, haz:

 p.line(x, y1, line_width=2, color=color) p.line(x, y2, line_width=2, color=color) 

Aquí está el ejemplo anterior:

 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) 

introduzca la descripción de la imagen aquí