Python ColumnDataSource上的Bokeh流未更新绘图
我正在尝试制作一个Bokeh图,每当它收到数据时就会更新。我正在使用Python ColumnDataSource上的Bokeh流未更新绘图,python,bokeh,Python,Bokeh,我正在尝试制作一个Bokeh图,每当它收到数据时就会更新。我正在使用add\u next\u tick\u callback(listener)通过使用curl”的查询获取发布的数据http://localhost:5006/mviz/?vpom=0.9&rpom=0.9“。使用curl发送时正确读取数据,但是 调用source.stream,浏览器中的绘图不会更新 在多次发送数据时,我希望它每次都将新数据追加到source.data,从而增加行数。但是,即使多次点击上面的curl命令,它每次也
add\u next\u tick\u callback(listener)
通过使用curl”的查询获取发布的数据http://localhost:5006/mviz/?vpom=0.9&rpom=0.9“
。使用curl发送时正确读取数据,但是
source.stream
,浏览器中的绘图不会更新source.data
,从而增加行数。但是,即使多次点击上面的curl
命令,它每次也只打印相同数量的行(只有四行,在初始化时在三行后面追加一个新行)mviz.py
中的脚本,我使用bokeh 1.0.4版调用bokeh serve mviz.py
运行该脚本:
from bokeh.layouts import column
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, curdoc
from bokeh.server.server import Server
source = ColumnDataSource({"vpom": [0.1, 0.2, 0.3], "rpom": [0.2, 0.3, 0.4]})
fig = figure(title='Streaming Circle Plot!', sizing_mode='scale_width',
x_range=[0, 1], y_range=[0, 1])
fig.circle(source=source, x='vpom', y='rpom', size=10)
curdoc().add_root(column(fig))
curdoc().title = "Now with live updating!"
def listener():
req = curdoc().session_context
if req is not None:
args = req.request.arguments
print "recv", args
if args:
source.stream({k:map(float,v) for k,v in args.items()}, 100)
print source.data
curdoc().add_next_tick_callback(listener)
是否有人可以指出上述脚本的问题,并评论这是否是将Boekh用于此用例的正确方法。此方法存在一些问题/误解:
- 每次向Bokeh服务器发出请求时,都会创建一个
,以及该会话的会话
。文档
是Bokeh服务器在Python和JS之间自动保持同步的所有对象(绘图、小部件等)的集合。这份文件来自哪里?执行应用程序代码以生成它。重申另一种方式:每次建立连接时,应用程序代码都会重新运行 一个直接的结果是,正如所写的那样,在使用上述代码的HTTP请求之间,没有任何东西会“持久”或“累积”。每一次新的联系都是一张白纸。整个应用程序代码将在每次新连接时运行,但作为第一步,它可以首先从外部数据存储中查找并加载任何以前的数据文档
- 即使在将会话加载到浏览器中之前,顶层的
add\u next\u tick\u回调也将执行。没有理由将
放在顶层(即,在其他按钮或小部件的回调代码之外),因为最终效果与将代码放在顶层回调函数中相同。它在任何东西进入用户浏览器之前就完成了运行add_next_tick_callback
- 如果您真的只想使用查询参数点击Bokeh应用程序URL,那么您的应用程序代码需要显式地负责在请求之间保存和加载状态。这可能是在它读/写的平面文件中,或者通过它连接的某个外部数据库
- 或者,在这种情况下,您可以将自己的新端点的新请求处理程序添加到底层Tornado应用程序中。这些处理程序可以保存/累积状态(在Bokeh服务器运行时)。如何推送/传达任何现有开放会话的更新是一个更复杂的问题,这取决于您的需求