具有数据源动态更新的 Bokeh 应用程序

Bokeh apps with dynamic updates of data sources

考虑 Bokeh 中的 sliders_app.py 示例。我希望能够定期更新情节。例如,假设我们想要每 10 秒对图进行一次时移。我如何在应用程序的上下文中执行此操作?

为了说明目标,我想将以下极其简单的逻辑添加到应用程序中,简单地循环移动 X 和 Y。

请注意,没有简单的方法可以将此循环插入原始 sliders_app.py(它会去哪里?)。

  while True:
    N = 200
    # Get the current slider values
    a = self.amplitude.value
    b = self.offset.value
    w = self.phase.value
    k = self.freq.value
    
    # Circularly time-shift X and Y 
    x = self.source.data["x"]
    x = np.roll(x,1)
    y = a*np.sin(k*x + w) + b 

    # Update the data container for the plot
    self.source.data = dict(x=x, y=y)

    # Sleep until the next update
    time.sleep(0.1)

有没有办法在 Bokeh 中做到这一点? Bokeh 是否有任何定时器小部件,可以连接定时器回调来更新数据源?

如果没有,是否有计划在未来某个时间合并此功能?

更新

看起来 spectrogram.py 使用线程处理此类更新。对于任何感兴趣的人,这可能是成功的方法。

有几个选项。 AjaxDataSource 可以使客户端定期从 REST 端点直接拉取。这是一个显示其用法的示例:

https://github.com/bokeh/bokeh/blob/master/examples/plotting/file/ajax_source_realtime.py

请注意,频谱图可能很快会被重写以使用它,并减少手写的 JS 量。 (频谱图相当复杂并且有一些自定义 JS,我们一直在努力随着时间的推移减少这个数量)

另外值得一提的是,频谱图中的线程与服务器端的事物有关,它与 Bokeh 本身或与 Bokeh 的更新没有任何关系。

如果您是 运行 Bokeh 服务器中的一个应用程序,您可以根据需要随时更新数据源模型,情节就会做出响应。