Plot Bokeh回调不会更新图形
我目前正试图用共享选择在两个图中绘制数据帧的平均值和最大值。 在图1中选择时,我想绘制图2中平均的数据。 我得到了图形和选择,但它似乎没有用spyder中的选择更新图形。下面是我的代码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
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笔记本中。在这种情况下,您可以在一个类似于
的函数中定义应用程序代码,该函数接受一个Bokehmyapp(doc)
,并将您需要的所有内容(绘图、小部件、工具、回调等)添加到该文档中。然后在笔记本中执行:文档
该应用程序将在笔记本中在线显示和运行。有关更多详细信息,请下载并在本地运行show(myapp)
- 作为库,例如,在烧瓶应用程序中。有关此选项的详细信息,请参阅《用户手册》中的
否则,如果您不能或不想运行Bokeh服务器,则可以使用实现许多交互式功能,这些功能在独立(非服务器)Bokeh文档中起作用 您只是将其作为常规python脚本运行吗?它必须在Bokeh服务器上运行,Bokeh服务器是连接到查看器浏览器并执行回调的持久python进程,即当滑块发生变化时。如果您只是将bokeh应用程序作为“常规”python脚本运行,那么它将运行并且python进程存在,并且没有python进程可以执行回调。谢谢你的提示!通过de bokeh服务器运行工作!我还有第二个关于回调函数的问题。我想选择一个或多个点,并将此选择用作multiplot表中的索引。我找不到任何文件。因此,此函数修补程序_name=source1.data['colnames'][new['1d']['index'][0]]具有多选功能。不同的问题应放在不同的帖子中。我已将注释扩展为答案,如果您能接受它,以便其他人更容易找到,将不胜感激。