创建接收实时异步提要的 Python 数据可视化网站的方法

问题描述

我正在寻找可视化刻度数据并将其放在网站上的方法。我遇到了以下具有明显局限性的方法

我知道使用 node.js 库是可能的,但我根本不想要 javascript,因为 a) 我讨厌 JS 作为一种语言,b) d3.js 对于一个小项目来说似乎是一种矫枉过正。

Plotly + dash 可以托管实时 python 应用程序,但从根本上说它只支持间隔更新,不支持刻度更新。可以通过将更新功能设置为高频来破解它,但我正在寻找为这个特定应用程序设计的解决方案。如果没有更好的结果,这将是我的错误解决方案。

我也看到过介绍使用 matplotlib.animations 的文章,但我不知道有什么方法可以将 matplotlib 实时提要放在服务器网站上。

其他一些文章描述了每天使用 matplotlib 导出图像,我认为这是对实时术语的滥用。

最后,请只使用 Python。

解决方法

一种选择是使用 websocket 来流式传输数据。你可以使用例如WebSocket 中的 dash-extensions==0.0.41 组件。这是一个小例子,

import json
import dash_html_components as html
import random
import dash_core_components as dcc
import plotly.graph_objects as go
from gevent import sleep
from dash import Dash
from dash.dependencies import Input,Output,State
from dash_extensions import WebSocket
from dash_extensions.websockets import SocketPool,run_server


# Generator to simulate continuous data feed.
def data_feed():
    while True:
        sleep(random.uniform(0,2))  # delay between data events
        yield random.uniform(0,1)  # the data value


# This block runs asynchronously.
def ws_handler(ws):
    for data in data_feed():
        ws.send(json.dumps(data))  # send data


# Create example app.
app = Dash(prevent_initial_callbacks=True)
socket_pool = SocketPool(app,handler=ws_handler)
app.layout = html.Div([dcc.Graph(id="graph",figure=go.Figure(go.Scatter(x=[],y=[]))),WebSocket(id="ws")])


@app.callback(Output("graph","figure"),[Input("ws","message")],[State("graph","figure")])
def update_graph(msg,figure):
    x,y = figure['data'][0]['x'],figure['data'][0]['y']
    return go.Figure(data=go.Scatter(x=x + [len(x)],y=y + [float(msg['data'])]))


if __name__ == '__main__':
    run_server(app,port=5000)  # 5000 if the default port

免责声明:我是 dash-extensions 的作者。