在Python Bokeh绘图中选择图示符

在Python Bokeh绘图中选择图示符,python,bokeh,Python,Bokeh,我有一个包含多行的Python Bokeh绘图,有没有一种方法可以交互地打开和关闭其中的一些行 p1.line(Time,Temp0,size=12,color=getcolor()) p1.line(Time,Temp1,size=12,color=getcolor()) p1.line(Time,Temp2,size=12,color=getcolor()) p1.line(Time,Temp3,size=12,color=getcolor()) .... show(p1) 我只是偶然发现

我有一个包含多行的Python Bokeh绘图,有没有一种方法可以交互地打开和关闭其中的一些行

p1.line(Time,Temp0,size=12,color=getcolor())
p1.line(Time,Temp1,size=12,color=getcolor())
p1.line(Time,Temp2,size=12,color=getcolor())
p1.line(Time,Temp3,size=12,color=getcolor())
....
show(p1)
我只是偶然发现。在我的情况下,我还想对它进行其他操作

有两种可能的方法:

1.)客户机-服务器方法

2.)客户专用方法


1.)客户机服务器接近ak Bokeh服务器

实现这种交互性的一种方法是使用bokeh服务器,您可以阅读更多有关该服务器的信息。我将更详细地描述这种方式,因为在这一点上,我更熟悉它

按照上面的例子,如果我要使用bokeh服务,我会首先设置一个ColumnDataSource,如下所示:

source = ColumnDataSource(data = dict(
    time = Time,
    temp0 = [],
    temp1 = [],
    temp2 = [],
    temp3 = [],
)
p1.line("time","temp0", source=source, size=12,color=getcolor())
p1.line("time","temp1", source=source, size=12,color=getcolor())
p1.line("time","temp2", source=source, size=12,color=getcolor())
p1.line(Time,Temp3, source=source, size=12,color=getcolor())
下一步,我将允许您切换要显示的温度:

multi_select = MultiSelect(title="Option:", value=["Temp1"],
                       options=["Temp1", "Temp2", "Temp3"])
# Add an event listener on the python side.
multi_select.on_change('value', lambda attr, old, new: update())
然后我会像下面那样定义更新函数。update函数的目的是使用您现在要在图中填充的值更新ColumnDataSource(以前为空)

def update():
    """This function will syncronize the server data object with 
       your browser data object. """
    # Here I retrieve the value of selected elements from multi-select
    selection_options = multi_select.options
    selections = multi_select.value
    for option in selection_options:
        if option not in selections:
            source.data[option] = []
        else:
            # I am assuming your temperatures are in a dataframe.
            source.data[option] = df[option]
最后要做的是重新定义如何绘制图示符。我们不会从列表或数据框中绘制数据,而是从ColumnDataSource中绘制数据,如下所示:

source = ColumnDataSource(data = dict(
    time = Time,
    temp0 = [],
    temp1 = [],
    temp2 = [],
    temp3 = [],
)
p1.line("time","temp0", source=source, size=12,color=getcolor())
p1.line("time","temp1", source=source, size=12,color=getcolor())
p1.line("time","temp2", source=source, size=12,color=getcolor())
p1.line(Time,Temp3, source=source, size=12,color=getcolor())
因此,基本上通过控制ColumnDataSource的内容(与browser对象同步),我可以切换是否显示数据点。您可能需要也可能不需要定义多个ColumnDataSource。先这样试试

2.)仅客户端方法ak回调

上述方法使用客户机-服务器体系结构。另一种可能的方法是在前端完成这一切。显示了如何通过各种形式的回调完全在浏览器端完成一些简单的交互


不管怎样,我希望这是有帮助的。干杯

这个问题是很久以前提过的,但是Bokeh现在有了交互式图例功能-您只需指定

your_figure.legend.click_policy = 'hide'
这使得图例在列出您的行时具有交互性,您可以打开/关闭每一行