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

ways to create Python data visualization website receiving realtime asynchronous feed

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

我知道 node.js 库是可行的,但我根本不想要 javascript 因为 a) 我讨厌 JS 作为一种语言,b) d3.js 它看起来像对于一个小项目来说太过分了。

Plotly + dash 可以托管实时 python 应用程序,但基本上它只支持间隔更新,不支持滴答更新。可以通过将更新功能设置为高频来破解它,但我正在寻找专为该特定应用程序设计的解决方案。如果没有更好的选择,这将是我的失败解决方案。

我也看到过描述使用 matplotlib.animations 的文章,但我不知道将 matplotlib 实时提要放在服务器网站上的方法。

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

最后,Python只好。

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

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 的作者。