Python 是否有一种方法可以使用Bokeh中的MultiSelect来选择绘制哪个流数据通道?

Python 是否有一种方法可以使用Bokeh中的MultiSelect来选择绘制哪个流数据通道?,python,bokeh,Python,Bokeh,我正在组装一个bokeh服务器来收集多个数据流,并提供用户在MultiSelect菜单中选择哪个频道的实时绘图。我有流位工作,但我不确定如何选择我添加到布局中的图形中显示的流 我尝试使用curdoc.remove\u root删除当前布局,然后添加一个新布局,但这只会杀死应用程序,新布局不会显示。我也尝试过简单地更新数据,但这也会扼杀应用程序 从bokeh.layouts导入列 从bokeh.plotting导入图,curdoc 从bokeh.models导入ColumnDataSource 从

我正在组装一个bokeh服务器来收集多个数据流,并提供用户在MultiSelect菜单中选择哪个频道的实时绘图。我有流位工作,但我不确定如何选择我添加到布局中的图形中显示的流

我尝试使用curdoc.remove\u root删除当前布局,然后添加一个新布局,但这只会杀死应用程序,新布局不会显示。我也尝试过简单地更新数据,但这也会扼杀应用程序

从bokeh.layouts导入列 从bokeh.plotting导入图,curdoc 从bokeh.models导入ColumnDataSource 从bokeh.models.widgets导入MultiSelect def change_plotattr,旧的,新的: 全局模型,选择器,p,源 curdoc.remove\u rootmode p=数字 p、 circlex=new+''x',y=new+''y',source=source 模型=列选择器,p curdoc.add_rootmodel def更新图: newdata={} 对于范围10中的i: 以下两行名义上提供真实数据 新数据[stri+''\u x']=1 新数据[stri+''u y']=1 来源:streamnewdata,100 选择器=MultiSelecttitle='Options',值=[stri代表范围10中的i] 选择器。在“更改值”上,更改绘图 数据={} 对于范围10中的i: 数据[stri+'\u x']=0 数据[stri+''u y']=0 源=列数据源数据=数据 p=数字 p、 circlex='0_x',y='0_y',source=source curdoc.add_rootmodel curdoc.add_periodic_callbackupdate_plot,100
我使用bokeh serve-show app.py运行这段代码,我希望每次更新MultiSelect时它都会创建一个新的绘图,但是,它只是在change_plot回调中的某个地方崩溃。

在这段代码中,在MultiSelect中选择一行,如果它不在画布中,则会添加一个新行,并开始流式处理,如果该行已经在画布中,则仅切换流式处理。代码适用于BokehV1.0.4。使用bokeh serve跑步-show app.py

结果:


哦,太好了,谢谢你!一对相关的后续问题:是否有方法在取消选择时从绘图中完全删除一行,以及是否有方法在选择时显示一行到当前时间的完整历史记录?1选择该行时开始流式处理,因此在此之前没有历史记录。在它被切换之后。2 Bokeh不支持从绘图中删除图示符,但可以使用.visibility=False隐藏它们。或者,您可以清除整个根,但随后绘图将消失。
from bokeh.models import ColumnDataSource, MultiSelect, Column
from bokeh.plotting import figure, curdoc
from datetime import datetime
from random import randint
from bokeh.palettes import Category10

lines = ['line_{}'.format(i) for i in range(10)]
data = [{'time':[], item:[]} for item in lines]
sources = [ColumnDataSource(item) for item in data]

plot = figure(plot_width = 1200, x_axis_type = 'datetime')

def add_line(attr, old, new):
    for line in new:
        if not plot.select_one({"name": line}):
            index = lines.index(line)
            plot.line(x = 'time', y = line, color = Category10[10][index], name = line, source = sources[index])

multiselect = MultiSelect(title = 'Options', options = [(i, i) for i in lines], value = [''])
multiselect.on_change('value', add_line)

def update():
    for line in lines:
        if line in multiselect.value:
            if plot.select({"name": line}):
                sources[lines.index(line)].stream(eval('dict(time = [datetime.now()], ' + line + ' = [randint(5, 10)])'))

curdoc().add_root(Column(plot, multiselect))
curdoc().add_periodic_callback(update, 1000)