Python Bokeh-更改“选择”时不会更新图

时间:2019-08-21 13:36:53

标签: python bokeh

我编写了一个函数,该函数基本上进行一些计算并返回Bokeh图对象。

然后,我正在调用该函数以向用户显示一些初始输出。之后,我有一个功能可以检查更新。 我也有一个“选择”,因此用户可以选择他/她想要的选项。最后,我要更新情节。

这是代码的结构:

plot = my_custom_function(dataset, 'input_parameter')

def update_plot(attr, old, new):
    if new == 'some_other':
        plot = my_custom_function(dataset, new)
    else:
        plot = my_custom_function(dataset, old)

select = Select(title='Charging Station', options=['the_first', 'some_other'], value='the_first')
select.on_change('value', update_plot)

layout = row(select, plot)
curdoc().add_root(layout)

问题是,图表未更新?有什么问题吗?

1 个答案:

答案 0 :(得分:0)

这里有很多事情要提:

  • 首先,您是否正在使用Bokeh服务器(即bokeh serve maypp.py)运行它?真正的Python回调(例如,使用on_change)仅在Bokeh服务器中工作(Bokeh服务器是实际上运行回调代码的Python进程)

  • 您所写的回调没有任何作用。您将分配给局部变量 plot,该变量仅存在于回调函数中,然后在函数结束时消失。您实际上还没有更新任何内容,因此整个回调是无操作的。回调需要做的是修改您之前绘制的图,例如通过更新现有数据源。典型的Bokeh应用具有以下结构:

    source = ColumnDataSource(...)
    p = figure(...)
    p.line(..., source=source)
    
    def update(attr, old, new):
        source.data = some_new_data  # Update the *existing* data source
        p.title.text = "new title"   # Update properties on *existing* objects
    
    select = Select(...)
    select.on_change('value', update)
    

    所有example apps in repository都遵循这种模式。

最后要提到的是,使尽可能小的更改始终是100%的最佳实践。即您应该为现有数据源更新.data,而不是用新数据源替换整个数据源(或绘图)。散景已针对此类更新进行了优化。