创建 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
的作者。
我正在寻找可视化报价数据并将其放在网站上的方法。我遇到了以下具有明显局限性的方法。
我知道 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
的作者。