散景0.7.1:动态添加绘图到Bokeh服务器生成的现有页面

时间:2015-03-02 15:20:28

标签: python python-2.7 bokeh

我正在使用bokeh-server通过tcp处理数据流到我目前使用output_server显示给浏览器的图。我希望能够动态地向当前浏览器页面添加更多绘图,因为数据通过套接字传递。我的部分麻烦在于我不完全理解cursession()和curdoc()是如何工作的/它们是如何不同的。

我目前的代码如下:

 plots = []

 if create_new_plot:
      plots.append(create_new_plot_def())
 if open_new_tab:
      show(plots)
      open_new_tab = False
 else:
      curdoc().add(plots)

当我运行它时,我收到一个错误,即'list'对象没有属性'references'。为了解决这个问题,似乎我必须循环并单独添加每个绘图,但这也不起作用。 plots[]包含我想要在当前时间显示的所有绘图对象的运行列表。我发现的一个解决方法是每次只使用show(),但每次在浏览器中打开一个新选项卡,这不实用/优雅。

传统上,我使用cursession()。add_object()来更新我的图上的数据源。在我看来,cursession()处理所有数据后端,而curdoc()控制页面上的实际可视化。这是对的吗?

我是否有办法在相同的现有浏览器页面(即文档)上触发全新绘图的显示?有人可以简要解释一下如何正确使用cursession()和curdoc()吗?谢谢!


编辑: 我找到了一个修复程序,但仍无法绕过多个show()调用,导致打开多个浏览器标签。我的代码现在看起来像这样:

if open_tab:
     show(grid_plot)
     open_tab = False
else:
    curdoc().clear()
    curdoc().add(grid_plot)
    show()

1 个答案:

答案 0 :(得分:2)

我在io.py中使用push()找到了解决方案。适用的新代码片段:

if open_tab:
     show(grid_plot)
     open_tab = False
else:
     curdoc().clear()
     curdoc().add(grid_plot)
     push()

这样做会刷新html页面,而不是生成第二个重复页面(新标签页)。

检查一下:https://groups.google.com/a/continuum.io/d/msg/bokeh/rMDt1sT5Cwk/fkKfS8yeTO8J以获取有关curdoc()vs cursession()的解释。请留意即将发布的文档。