web-dev-qa-db-ja.com

Bokehでプロットする場合、どのようにカラーパレットを自動的に切り替えますか?

ループを使用してデータをロードおよび/または変更し、Bokehを使用してループ内で結果をプロットします( Matplotlibのaxes.color_cycle )。これは簡単な例です

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)

このプロットを生成します

bokeh plot

色のリストとモジュラス演算をコーディングせずに色を循環させて、色の数がなくなったときに繰り返すようにするにはどうすればよいですか?

これに関連してGitHubでいくつかの議論があり、 51 および 2201 が発行されますが、これをどのように機能させるかは明確ではありません。 cycle colorの-​​ documentation を検索したときに得られた4つのヒットには、実際にはページのどこにもWord cycleが含まれていませんでした。

19

色のリストを取得して、 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

2つの小さな変更により、Python 3。

  • 変更:for m, color in Zip(range(10), colors):

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

7
bob-in-columbia

色を循環させる単純なジェネレーターを定義できます。

In python 3:

from bokeh.palettes import Category10
import itertools

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

またはpython 2(または3):

from bokeh.palettes import Category10
import itertools

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

新しい色が必要なときは、次のことを行います。

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

上記の例を次に示します。

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