python - 每次数据更改时,如何在烧瓶应用程序中实时更新散景图?
问题描述
如果我有一个烧瓶应用程序,其中有几个由散景制作的图表,当添加或更改新数据时,如何在浏览器中实时更新图表?我是散景新手并阅读了我必须启动散景服务器的文档,但我仍然不明白我应该在我的代码中添加什么以使其更新。
解决方案
这是一个 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()
结果:
推荐阅读
- sass - SASS: Incompatible units: 'vw' and 'px'
- jmeter - Unable to correlate Session id
- java - Spring如何自动装配会话范围的bean?
- html - 使用 uikit 和 css 的响应式进度圈
- python-3.x - 为什么使用 Anaconda 在“用户”文件夹中创建了一些文件夹和文件?
- python - 如何在 python 中使用 pyaudio 录制音频时忽略背景噪音?
- graph-visualization - Petri Nets 图形图像生成工具
- sql - 如何从这个丑陋的代码中重写“where, and, or”语句
- javascript - 给定字符串中的一个跨度元素和另一个跨度元素中的阿拉伯语单词
- javascript - 如何在 freeswitch 中使用 sipML5 - 媒体流权限被拒绝