首页 > 解决方案 > 每次数据更改时,如何在烧瓶应用程序中实时更新散景图?

问题描述

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

标签: pythonflaskbokeh

解决方案


这是一个 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()

结果:

在此处输入图像描述


推荐阅读