散景回调不会更新图形

时间:2018-07-02 09:54:40

标签: plot bokeh attributeerror

我目前正在尝试在共享选择的2张图中绘制数据框的平均值和最大值。 在图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:“文档”对象没有属性“引用”

1 个答案:

答案 0 :(得分:1)

使用真实的Python回调,例如与on_change一起使用需要在Bokeh服务器中将代码作为Bokeh server application运行。浏览器没有运行Python代码的能力。如果您只是以“常规” Python脚本python app.py的形式运行代码,则Python会运行代码,并在浏览器中生成输出,然后Python解释器最终退出-此时,没有Python进程可运行您的回调代码。因此,Bokeh服务器是持久的,长期运行的Python进程,存在于Bokeh应用程序中运行真正的Python回调的过程。

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

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

    bokeh serve --show app.py
    

    这将在本地浏览器中打开应用程序的会话。

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

    show(myapp) 
    

    ,该应用将在笔记本中显示并内联运行。您可以在本地下载并运行此complete example notebook以获得更多详细信息。

  • 作为库,例如在Flask应用中。有关此选项的更多信息,请参见《用户指南》中的Embedding the Bokeh Server as a Library

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