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

创建接收实时异步提要的Python数据可视化网站的方法,python,data-visualization,plotly-dash,real-time-updates,Python,Data Visualization,Plotly Dash,Real Time Updates,我正在寻找可视化蜱虫数据并将其放到网站上的方法。我遇到了以下有明显局限性的方法 我知道node.js库是可能的,但我根本不想要javascript,因为a)我讨厌js作为一种语言,b)d3.js对于一个小项目来说,这似乎是一种过火的行为 Plotly+dash可以托管实时python应用程序,但基本上它只支持间隔更新,不支持勾号更新。可以通过将更新功能设置为高频来破解它,但我正在寻找一种针对这个特定应用程序设计的解决方案。如果没有更好的办法,这将是我的退路 我还看到过一些介绍使用matplotl

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

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

Plotly+dash可以托管实时python应用程序,但基本上它只支持间隔更新,不支持勾号更新。可以通过将更新功能设置为高频来破解它,但我正在寻找一种针对这个特定应用程序设计的解决方案。如果没有更好的办法,这将是我的退路

我还看到过一些介绍使用matplotlib.animations的文章,但我不知道如何将matplotlib live feed放到服务器网站上

其他一些文章描述了每天使用matplotlib导出图像,我发现这是对术语realtime的滥用


最后,请只使用Python。

一个选项是使用websocket来流式传输数据。例如,您可以使用
仪表板扩展==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

的作者,对于任何异步任务,您都需要使用第三方服务,如redis或rabbitmq,在Pyton中,您应该使用celecryI。我正在尝试用从另一个线程接收数据的队列替换数据源,但是由于某些原因,ws.send会运行,但它从不调用update_graph函数,因此图形永远不会更新。你知道为什么吗?threading.Thread(target=genData,daemon=True,args=(q,).start()。。。socket\u pool=SocketPool(app,handler=lambda x:ws\u handler(x,q))。。。def ws_handler(ws,q):#对于data_feed()中的数据:#ws.send(json.dumps(data))#在len(list(q.queue))时发送数据=0:data=q.get()ws.send(json.dumps(data))q.task_done()