2016-10-03 17 views
7

Verileri yüklemek ve/veya değiştirmek için bir döngü kullanmak ve Bokeh (Matplotlib's axes.color_cycle modelini tanıyorum) kullanarak sonucu döngü içinde çizmek istiyorum. İşte nasıl bu kadar renklerin bir listesini ve bir modül çalışmasını kadar kodlama olmadan renkler döngüsü tekrarlamak yapabilirim basit bir örnek bu arsaBokeh ile çizim yaparken, otomatik olarak bir renk paletinden nasıl geçersiniz?

bokeh plot

üretir

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) 

olduğunda sayı renkler tükendi? Buna ilişkin GitHub üzerinde bazı tartışmalar vardı

, 351 ve 2201 sorunları, ancak bu işi yapmak nasıl açık değildir. cycle color için documentation arandığında bulduğum dört sonuç, sayfada herhangi bir yerde cycle kelimesini içermiyordu.

+0

[color sayklır] (http : Matplotlib'in bir parçası olarak geliştirilen //matplotlib.org/cycler/) paketi, yalnızca renkten daha fazla çevrim yapmak için kullanılabilecek bir sözlük oluşturmak için yararlı olabilir. –

cevap

9

Muhtemelen en kolay sadece kendiniz itertools kullanarak renklerin listesi ve döngüsünü elde etmektir:

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 itertools.izip(xrange(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

bokeh/charts/utils.py bir cycle_colors işlevi var gibi, ama öyle değil Kütüphanede başka bir yere çağrılmış gibi görünüyor ve aynı şeyi yapıyor gibi görünüyor.

import numpy as np 
from bokeh.plotting import figure, output_file, show 
# seaborn handles the color palette generation, itertools handles the cycling 
import seaborn.apionly as sns 
import itertools 

output_file('bokeh_cycle_colors.html') 

p = figure(width=400, height=400) 
x = np.linspace(0, 10) 

# define the color palette 
ncolors = 5 
palette = sns.palettes.color_palette('colorblind', ncolors) 
# as hex is necessary for bokeh to render the colors properly. 
colors = itertools.cycle(palette.as_hex()) 

for m, color in itertools.izip(xrange(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

5

İki küçük değişiklikler öncesinde cevap çalışması yapacak: İşte

bir seaborn mevcut birçok paletleri birini gösteren örnek (onlar bir şey Eğer matplotlib beklemek ve daha olurdu) olduğunu Python 3 için

  • değiştirildi: for m, color in zip(range(10), colors):

  • önce:

+0

Bana göre bu, ayrı bir cevaptan ziyade bir düzenleme olarak daha mantıklı olacaktır (ancak geçerli saygınlığınızla düzenleyemeyeceğinizi görüyorum). –

1

for m, color in itertools.izip(xrange(10), colors): sadece sizin için basit bir jeneratör devir renkleri tanımlar. piton 2'de

:

from bokeh.palettes import Category10 
import itertools 

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

veya piton 3'te

:

from bokeh.palettes import Category10 
import itertools 

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

ve yeni bir renk gerektiğinde, yapın:

p.line(x, y1, line_width=2, color=next(color)) 
p.line(x, y2, line_width=2, color=next(color)) 
İlgili konular