每次数据更改时,如何在Flask应用程序中实时更新散景图?

时间:2019-01-29 13:58:47

标签: python flask bokeh

如果我有一个烧瓶应用程序,其中包含一些由bokeh制成的图表,那么当添加或更改新数据时,如何在浏览器中实时更新图表?我是bokeh的新手,并阅读了启动bokeh服务器所需的文档,但我仍然不明白我应该在代码中添加什么以使其更新。

1 个答案:

答案 0 :(得分:0)

这是一个Bokeh服务器应用程序,每 1s 执行一次回调,每 5s 更新一次数据。查看当前的plot_data长度并将其与last_data_length进行比较,让我们确定何时需要更新绘图(代码适用于Bokeh v1.0.4)

import random, time
from tornado.ioloop import IOLoop
from bokeh.server.server import Server
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler
from bokeh.plotting import figure, ColumnDataSource
from threading import Thread

class BokehApp():
    plot_data = []
    last_data_length = None

    def __init__(self):
        thread = Thread(target = self.startDataAcquisition)
        thread.start()

        io_loop = IOLoop.current()
        server = Server(applications = {'/myapp': Application(FunctionHandler(self.make_document))}, io_loop = io_loop, port = 5001)
        server.start()
        server.show('/myapp')
        io_loop.start()

    def startDataAcquisition(self):
        while True:
            self.plot_data.append({'x': [random.random()], 'y': [random.random()], 'color': [random.choice(['red', 'blue', 'green'])]})
            time.sleep(5)

    def make_document(self, doc):
        source = ColumnDataSource({'x': [], 'y': [], 'color': []})
        fig = figure(title = 'Streaming Circle Plot!', sizing_mode = 'scale_both')
        fig.circle(source = source, x = 'x', y = 'y', color = 'color', size = 10)

        def update():
            if self.last_data_length is not None and self.last_data_length != len(self.plot_data):
                source.stream(self.plot_data[-1])
            self.last_data_length = len(self.plot_data)

        doc.add_root(fig)
        doc.add_periodic_callback(update, 1000)

if __name__ == '__main__':
    app = BokehApp()

结果:

enter image description here