web-dev-qa-db-fra.com

Lorsque vous tracez avec Bokeh, comment parcourez-vous automatiquement une palette de couleurs?

Je veux utiliser une boucle pour charger et/ou modifier des données et tracer le résultat dans la boucle à l'aide de Bokeh (je connais Matplotlib's axes.color_cycle ). Voici un exemple 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)

qui génère ce complot

bokeh plot

Comment puis-je faire en sorte que les couleurs cycle sans coder une liste de couleurs et une opération de module à répéter lorsque le nombre de couleurs est épuisé?

Il y a eu une discussion sur GitHub à ce sujet, les problèmes 51 et 2201 , mais il n'est pas clair comment faire fonctionner cela. Les quatre résultats obtenus lors de la recherche dans documentation for cycle color ne contenait pas réellement le mot cycle n'importe où sur la page.

19
Steven C. Howell

Il est probablement plus facile d'obtenir simplement la liste des couleurs et de la faire défiler vous-même en utilisant 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)

enter image description here

20
Elliot

Deux petites modifications feront fonctionner la réponse précédente pour Python 3.

  • changé: for m, color in Zip(range(10), colors):

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

7
bob-in-columbia

Vous pouvez définir un générateur simple qui alterne les couleurs pour vous.

Dans python 3:

from bokeh.palettes import Category10
import itertools

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

ou en python 2 (ou 3):

from bokeh.palettes import Category10
import itertools

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

et quand vous avez besoin d'une nouvelle couleur, faites:

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

Voici l'exemple ci-dessus:

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)

enter image description here

4
Uduse