ColumnDataSource上的散景流不更新绘图

时间:2019-09-21 13:01:31

标签: python bokeh

我正在尝试制作一个散景图,该散景图在接收数据时会随时更新。我正在使用add_next_tick_callback(listener)来获取使用curl "http://localhost:5006/mviz/?vpom=0.9&rpom=0.9"查询发布的数据。使用curl发送时可以正确读取数据,但是

  1. 调用source.stream时,浏览器中的绘图不会更新。
  2. 在多次发送数据时,我希望每次增加行数时,它将新数据追加到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的正确方法。

1 个答案:

答案 0 :(得分:1)

此方法存在一些问题/误解:

  • 每次向Bokeh服务器发出请求时,都会创建一个Session以及该会话的DocumentDocument是Bokeh服务器自动在Python和JS保持同步的所有对象(图形,小部件等)的集合。该文档来自何处? 执行该应用代码以生成它。重申一下另一种方法:每次建立连接时重新运行应用代码

    直接的后果是,按照书面规定,使用上述代码在HTTP请求之间根本不会“持久”或“累积”任何内容。每个新连接都是空白。整个应用程序代码都会在每个新的连接上运行,但是首先可以从外部数据存储中查找并加载任何先前的数据。

  • 即使在将会话加载到浏览器之前,顶层的add_next_tick_callback也将执行。没有必要将add_next_tick_callback放在顶层(即,在其他按钮或小部件的回调代码之外),因为最终效果与将代码放在顶层的回调函数中是相同的。它可以在没有任何东西击中用户的浏览器之前完成运行。

那么您将如何实现这样的目标?

  • 如果您真的只想使用查询参数访问Bokeh应用程序URL,则您的应用程序代码需要明确负责保存和加载请求之间的状态。它可以在它读/写的平面文件中,也可以通过它连接到的某个外部数据库存储。

  • 或者,您可以embed the Bokeh serve as a library,在这种情况下,您可以将自己的新端点的新请求处理程序添加到基础Tornado应用程序中。这些处理程序可以持久/累积状态(在Bokeh服务器运行时)。如何将更新推送/传达到任何现有的开放会话是一个涉及更多的问题,具体取决于您的要求。