散景:与图例标签文本交互

时间:2016-08-20 01:24:21

标签: python bokeh

有没有办法以交互方式更改Bokeh中的图例标签文字?

我看过https://github.com/bokeh/bokeh/issues/2274How to interactively display and hide lines in a Bokeh plot?,但都不适用。

我不需要修改颜色或任何比更改标签文本更复杂的东西,但我找不到办法。

4 个答案:

答案 0 :(得分:3)

我希望这个答案可以帮助其他人解决类似问题。

这个问题有一个解决方法:从版本0.12.3开始,您的图例可以通过用于生成给定元素的ColumnDataSource对象动态修改。例如:

source_points = ColumnDataSource(dict(
                x=[1, 2, 3, 4, 5, 6],
                y=[2, 1, 2, 1, 2, 1],
                color=['blue','red','blue','red','blue','red'],
                category=['hi', 'lo', 'hi', 'lo', 'hi', 'lo']
                ))
self._figure.circle('x',
                    'y',
                    color='color',
                    legend='category',
                    source=source_points)

然后,您应该可以通过再次设置类别值来更新图例,例如:

# must have the same length
source_points.data['category'] = ['stack', 'flow', 'stack', 'flow', 'stack', 'flow']

请注意categorycolor之间的关系。如果您有这样的事情:

source = ColumnDataSource(dict(
        x=[1, 2, 3, 4, 5, 6],
        y=[2, 1, 2, 1, 2, 1],
        color=['blue','red','blue','red','blue','red'],
        category=['hi', 'hi', 'hi', 'lo', 'hi', 'lo']
    ))

然后第二个hi也会显示蓝色。它只匹配第一次出现。

答案 1 :(得分:1)

从Bokeh 0.12.1开始,它看起来不像目前支持的那样。 Legend个对象具有legends属性,可将文本映射到字形列表:

{
    "foo": [circle1], 
    "bar": [line2, circle2]
}

理想情况下,您可以更新此legends属性以使其重新呈现。但是看the source code,它似乎在初始化时使用了值,但是如果值发生变化,则没有强制重新渲染的管道。可能的解决方法可能是更改legends的值,然后立即设置执行触发重新呈现的其他属性。

在任何情况下,使这项工作更新不应该有太多工作,并且对于新的贡献者来说将是一个不错的公关。我鼓励您在GitHub issue tracker上提交功能请求问题,如果您有能力执行拉请求(我们很乐意帮助新贡献者开始并回答问题)

答案 2 :(得分:1)

就我而言,我使用了下一个代码:

from bokeh.plotting import figure, show

# Create and show the plot
plt = figure()
handle = show(plt, notebook_handle=True)

# Update the legends without generating the whole plot once shown
for legend in plt.legend:
    for legend_item, new_value in zip(legend.items, new_legend_values):
        legend_item.label['value'] = new_value
push_notebook(handle=handle)

就我而言,我正在绘制一些发行版,然后以交互方式进行更新(就像发行版中的更改动画一样)。在图例中,我有随时间推移的分布参数,我需要在每次迭代时更新它们。

请注意,此代码仅适用于Jupyter笔记本。

答案 3 :(得分:0)

我最后只是重新绘制了整个图表,因为在我的情况下,行数也有所不同。

一个小型的Jupyter笔记本电脑示例:

from bokeh.io import show
from bokeh.plotting import figure
from bokeh.palettes import brewer
from math import sin, pi
output_notebook()   

def update(Sine):
    p = figure() 
    r = []
    for i in range(sines.index(Sine) + 1):
        y = [sin(xi/(10*(i+1))) for xi in x]
        r.append(p.line(x, y, legend=labels[i], color=colors[i], line_width = 3))

    show(p, notebook_handle=True)
    push_notebook()  

sines = ["one sine", "two sines", "three sines"]
labels = ["First sine", "second sine", "Third sine"]
colors = brewer['BuPu'][3]
x = [i for i in range(100)]

interact(update, Sine=sines)

enter image description here