问题描述
我正在寻找可视化刻度数据并将其放在网站上的方法。我遇到了以下具有明显局限性的方法。
我知道使用 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
的作者。