答案 0 :(得分:1)
以下是一个例子:
进口:
from bokeh.models import ColumnDataSource, Legend, CustomJS
from bokeh.plotting import figure
from bokeh.io import show, output_notebook
import numpy as np
output_notebook()
抽奖代码:
x = np.linspace(0, 4*np.pi, 100)
y1 = np.sin(x)
y2 = y1 + 1.2
y3 = 0.1 * x**2
fig = figure(plot_height=250)
source = ColumnDataSource(data=dict(x=x, y1=y1, y2=y2, y3=y3))
line1 = fig.line("x", "y1", source=source, legend="Y1", color="red", line_width=3)
line2 = fig.line("x", "y2", source=source, legend="Y2", color="green", line_width=3)
line3 = fig.line("x", "y3", source=source, legend="Y3", color="blue", line_width=3)
legend = fig.legend[0]
legend.click_policy = "hide"
def callback(fig=fig, legend=fig.legend[0]):
y_range = fig.y_range
y_range.have_updated_interactively = False
y_range.renderers = [item.renderers[0] for item in legend.items if item.renderers[0].visible]
Bokeh.index[fig.id].plot_canvas_view.update_dataranges()
for item in legend.items:
item.renderers[0].js_on_change("visible", CustomJS.from_py_func(callback))
show(fig)
结果:
http://nbviewer.jupyter.org/gist/ruoyu0088/8e2d5fb768ee837d3cb59943f944c61f
答案 1 :(得分:1)
在现代散景中,DataRange1d
类(如果未指定,则默认用于创建范围)具有only_visible
属性。
要执行所需的操作,只需在对y_range=DataRange1d(only_visible=True)
的调用中指定figure
。
答案 2 :(得分:0)
简短的回答是否定的,因为目前(截至Bokeh 0.12.13
),交互式图例不会公开任何事件或钩子以使其成为可能。这似乎是一个合理的功能,可能不太难实现,所以我鼓励你制作issue on GitHub。
可能还有其他更多的迂回方式来完成这样的事情,但它需要一些探索和迭代,而SO并不是真的有用。如果您想继续尝试找到解决方案,我建议您发送到public mailing list。
答案 3 :(得分:0)
如果像我一样坚持使用Bokeh 1.3.4,Bryan from Bokeh recommends:
callback = """
y_range = fig.y_range
y_range.have_updated_interactively = false
y_range.renderers = []
for (let it of legend.items) {
for (let r of it.renderers) {
if (r.visible)
y_range.renderers.push(r)
}
}
Bokeh.index[fig.id].update_dataranges()
"""
for item in legend.items:
item.renderers[0].js_on_change("visible",
CustomJS(args=dict(fig=fig, legend=fig.legend[0]), code=callback))
他们使用自定义JS,因此更新发生在客户端的浏览器中,而不是在bokeh服务器中。