Plot Bokeh回调不会更新图形

Plot Bokeh回调不会更新图形,plot,bokeh,attributeerror,Plot,Bokeh,Attributeerror,我目前正试图用共享选择在两个图中绘制数据帧的平均值和最大值。 在图1中选择时,我想绘制图2中平均的数据。 我得到了图形和选择,但它似乎没有用spyder中的选择更新图形。下面是我的代码 import pandas as pd import numpy as np from bokeh.models import ColumnDataSource from bokeh.plotting import figure, show from bokeh.layouts import row from b

我目前正试图用共享选择在两个图中绘制数据帧的平均值和最大值。 在图1中选择时,我想绘制图2中平均的数据。 我得到了图形和选择,但它似乎没有用spyder中的选择更新图形。下面是我的代码

import pandas as pd
import numpy as np
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, show
from bokeh.layouts import row
from bokeh.io import curdoc

# data for plot 2
df2 = pd.DataFrame(list([[1,1,2,3],[3,4,4,5]]))

source2 = ColumnDataSource(
        data=dict(
            x=list(df2.index.values),
            y=list(df2.iloc[:,0].values)
        )
    )

# data for plot 1 & 0
df1 = np.mean(df2)
df0 = np.max(df2)
source1 = ColumnDataSource(
        data=dict(
            x=list(range(0,df1.shape[0])),
            y=list(df1.values),
            y1=list(df0.values),
                    )
    )

# Plot graph one with data from df1 and source 1 as barplot
plot1 = figure(plot_height=300, plot_width=400, tools="box_select")
barglyph = plot1.circle(x='x',y='y',source=source1)

# Plot graph one with data from df1 and source 1 as barplot
plot0 = figure(plot_height=300, plot_width=400, tools="box_select")
barglyph = plot0.circle(x='x',y='y1',source=source1)



# Plot graph two with data from df2 and source 2 as line
plot2 = figure(plot_height=300, plot_width=400, title="myvalues", 
              tools="box_zoom,reset,save,wheel_zoom,hover")    
r1 = plot2.line(x='x',y='y',source =source2, line_alpha = 1, line_width=1)
# safe data from plot 2 for later change in subroutine
ds1 = r1.data_source

def callback(attr, old, new):
    patch_name =  source1.data['colnames'][new['1d']['indices'][0]]
    ds1.data['y'] = df2[patch_name].values

barglyph.data_source.on_change('selected',callback)
show(row(plot0,plot1,plot2))
curdoc().add_root(row(plot0,plot1,plot2))
如果我在jupyter中运行此命令,则会出现以下错误:
AttributeError:“Document”对象没有属性“references”

使用真正的Python回调,例如,使用
on\u change
需要在Bokeh服务器中作为运行代码。浏览器没有运行Python代码的能力。如果您只是以“常规”Python脚本
Python app.py
的形式运行代码,那么Python将运行代码,在浏览器中生成输出,然后Python解释器将在最后退出—此时没有Python进程来运行回调代码。因此,Bokeh服务器是持久的、长时间运行的Python进程,用于在Bokeh应用程序中运行真正的Python回调

有几种方法可以运行Bokeh服务器应用程序:

  • 作为一个单独的过程。通常,如果您的应用程序代码位于
    app.py
    中,这意味着执行类似于以下命令的命令行命令:

    bokeh serve --show app.py
    
    这将在本地浏览器中打开应用程序的会话

  • 嵌入一个Jupyter笔记本中。在这种情况下,您可以在一个类似于
    myapp(doc)
    的函数中定义应用程序代码,该函数接受一个Bokeh
    文档
    ,并将您需要的所有内容(绘图、小部件、工具、回调等)添加到该文档中。然后在笔记本中执行:

    show(myapp) 
    
    该应用程序将在笔记本中在线显示和运行。有关更多详细信息,请下载并在本地运行

  • 作为库,例如,在烧瓶应用程序中。有关此选项的详细信息,请参阅《用户手册》中的


否则,如果您不能或不想运行Bokeh服务器,则可以使用实现许多交互式功能,这些功能在独立(非服务器)Bokeh文档中起作用

您只是将其作为常规python脚本运行吗?它必须在Bokeh服务器上运行,Bokeh服务器是连接到查看器浏览器并执行回调的持久python进程,即当滑块发生变化时。如果您只是将bokeh应用程序作为“常规”python脚本运行,那么它将运行并且python进程存在,并且没有python进程可以执行回调。谢谢你的提示!通过de bokeh服务器运行工作!我还有第二个关于回调函数的问题。我想选择一个或多个点,并将此选择用作multiplot表中的索引。我找不到任何文件。因此,此函数修补程序_name=source1.data['colnames'][new['1d']['index'][0]]具有多选功能。不同的问题应放在不同的帖子中。我已将注释扩展为答案,如果您能接受它,以便其他人更容易找到,将不胜感激。