2016-10-03 13 views
7

Tôi muốn sử dụng vòng lặp để tải và/hoặc sửa đổi dữ liệu và vẽ kết quả trong vòng lặp bằng Bokeh (Tôi quen với Matplotlib's axes.color_cycle). Dưới đây là một ví dụ đơn giảnKhi vẽ bằng Bokeh, bạn tự động xoay vòng như thế nào qua bảng màu?

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) 

mà tạo ra âm mưu này

bokeh plot

Làm thế nào để làm cho nó để các màu sắc chu kỳ mà không cần mã hóa lên một danh sách các màu sắc và một hoạt động mô đun để lặp lại khi số màu sắc hết?

Có một số cuộc thảo luận về GitHub liên quan đến vấn đề này, phát hành 3512201, nhưng không rõ cách thực hiện công việc này. Bốn lần truy cập tôi nhận được khi tìm kiếm documentation cho cycle color không thực sự chứa từ cycle ở bất kỳ đâu trên trang.

+0

[color chu trình] (http : //matplotlib.org/cycler/) gói, được phát triển như một phần của matplotlib, có thể hữu ích cho việc tạo ra một từ điển có thể được sử dụng để chu kỳ nhiều hơn chỉ là màu sắc. –

Trả lời

9

Nó có lẽ là dễ nhất để chỉ nhận được danh sách các màu sắc và chu kỳ tự mình sử dụng 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 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

Có vẻ như là một chức năng cycle_colors trong bokeh/charts/utils.py, nhưng nó không dường như được gọi là bất cứ nơi nào khác trong thư viện, và có vẻ như đang làm điều tương tự.

Dưới đây là một ví dụ minh hoạ một trong nhiều bảng màu có sẵn trong seaborn (họ có bất cứ điều gì bạn mong chờ từ matplotlib và nhiều hơn nữa):

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

Hai thay đổi nhỏ sẽ làm cho công việc trả lời trước cho Python 3.

  • thay đổi: for m, color in zip(range(10), colors):

  • trước: for m, color in itertools.izip(xrange(10), colors):

+0

Đối với tôi, điều này sẽ có ý nghĩa hơn khi chỉnh sửa thay vì câu trả lời riêng biệt (mặc dù tôi thấy rằng với danh tiếng hiện tại của bạn, bạn không thể chỉnh sửa). –

1

chỉ xác định một máy phát điện đơn giản mà chu kỳ màu sắc cho bạn.

Trong python 2:

from bokeh.palettes import Category10 
import itertools 

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

hoặc trong python 3:

from bokeh.palettes import Category10 
import itertools 

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

và khi bạn cần một màu sắc mới, làm:

p.line(x, y1, line_width=2, color=next(color)) 
p.line(x, y2, line_width=2, color=next(color)) 
Các vấn đề liên quan