散景:在图例上隐藏某些内容时更新缩放图

时间:2018-01-09 09:46:08

标签: python-3.x bokeh

我在Bokeh中有以下图表:

enter image description here

我想知道Bokeh库中是否有一些命令允许我在图例上隐藏一些系列时更新y轴(或者缩放我的绘图)。示例:当我从图例中隐藏第一对条形图时,我希望这是结果:

enter image description here

4 个答案:

答案 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服务器中。