【问题标题】:When plotting with Bokeh, how do you automatically cycle through a color pallette?使用 Bokeh 绘图时,如何自动循环显示调色板?
【发布时间】:2017-02-11 20:36:34
【问题描述】:

我想使用循环加载和/或修改数据并使用 Bokeh 在循环内绘制结果(我熟悉 Matplotlib's 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)

生成此图

如何使颜色循环而不编码颜色列表和模数运算以在颜色数量用完时重复?

在 GitHub 上有一些与此相关的讨论,问题 3512201,但不清楚如何使其工作。我在documentation 中搜索cycle color 时得到的四个点击实际上并没有在页面的任何位置包含单词cycle

【问题讨论】:

  • color cycler 包是作为 matplotlib 的一部分开发的,它可能有助于创建一个字典,该字典不仅可以用于循环颜色。

标签: python plot bokeh


【解决方案1】:

获取颜色列表并使用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)

【讨论】:

  • 你也可以创建迭代器然后设置color=next(colors)跳过zip
【解决方案2】:

您可以定义一个简单的生成器,为您循环颜色。

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

【讨论】:

  • color_gen 函数相当于 itertools.cycle 上的包装器,实际上并没有做任何事情。
【解决方案3】:

两个小改动将使之前的答案适用于 Python 3。

  • 已更改:for m, color in zip(range(10), colors):

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

【讨论】:

    【解决方案4】:

    在 Python > 3.7 中,您可以执行以下操作:

    from bokeh.palettes import Category10_10
           
    color = Category10_10.__iter__()
    
    p.line(x, y1, line_width=2, color=next(color))
    

    这将循环遍历列表的每个元素,直到您每次使用 next() 时用尽。

    python 中的每个序列类型都可以返回一个迭代器对象。

    【讨论】:

    • 这种方法有一个缺点。迭代器不是循环的。第 11 次调用 next() 将引发异常。
    • 非常正确,我只是提出了一个小例子,突出了序列类型中的内置迭代器对象
    • 我会说color = iter(Category10_10) 会更可取。
    • 同样的事情,但是你是对的,它看起来更好
    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 2021-03-08
    • 2020-07-20
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多