有没有办法在 Dash Plotly Python 中打开开关时不断更新图形?
Is there a way to constantly update a graph figure while a switch is on in Dash Plotly Python?
我有一个使用算法更新图形图形的函数,以及一个 return 图形图形(以及许多其他内容)的回调函数。这是基本思路:
for i in range(0,5):
time.sleep(0.1)
randomfunction(i)
return plot
如何在不中断循环的情况下更新图形?我尝试使用 yield 而不是 return 无济于事,因为回调不希望输出生成器 class。
Dash 中的标准方法是从循环内将图形(或只是数据)写入服务器端缓存(例如磁盘上的文件或 Redis 缓存),
for i in range(0,5):
time.sleep(0.1)
randomfunction(i)
# write data to server side cache
然后使用 Interval
组件触发从缓存中读取并更新图形的回调。像,
@app.callback(Output("graph_id", "figure"), Input("interval_id", "n_intervals")):
def update_graph(_):
data = ... # read data from server side cache
figure = ... # generate figure from data
return figure
虽然接受的答案肯定有效,但对于可能想要在没有外部存储的情况下执行此操作的任何人来说,还有另一种方法可以做到这一点。
有一个名为 dcc.Interval
的 Dash 核心组件,您可以使用它来不断触发回调,您可以在其中更新图表。
例如,设置一个包含图表布局和以下内容的布局:
import dash_core_components as dcc
dcc.Interval(id="refresh-graph-interval", disabled=False, interval=1000)
然后,在您的回调中:
from dash.exceptions import PreventUpdate
@app.callback(
Output("graph", "figure"),
[Input("refresh-graph-interval", "n_intervals")]
)
def refresh_graph_interval_callback(n_intervals):
if n_intervals is not None:
for i in range(0,5):
time.sleep(0.1)
randomfunction(i)
return plot
raise PreventUpdate()
我有一个使用算法更新图形图形的函数,以及一个 return 图形图形(以及许多其他内容)的回调函数。这是基本思路:
for i in range(0,5):
time.sleep(0.1)
randomfunction(i)
return plot
如何在不中断循环的情况下更新图形?我尝试使用 yield 而不是 return 无济于事,因为回调不希望输出生成器 class。
Dash 中的标准方法是从循环内将图形(或只是数据)写入服务器端缓存(例如磁盘上的文件或 Redis 缓存),
for i in range(0,5):
time.sleep(0.1)
randomfunction(i)
# write data to server side cache
然后使用 Interval
组件触发从缓存中读取并更新图形的回调。像,
@app.callback(Output("graph_id", "figure"), Input("interval_id", "n_intervals")):
def update_graph(_):
data = ... # read data from server side cache
figure = ... # generate figure from data
return figure
虽然接受的答案肯定有效,但对于可能想要在没有外部存储的情况下执行此操作的任何人来说,还有另一种方法可以做到这一点。
有一个名为 dcc.Interval
的 Dash 核心组件,您可以使用它来不断触发回调,您可以在其中更新图表。
例如,设置一个包含图表布局和以下内容的布局:
import dash_core_components as dcc
dcc.Interval(id="refresh-graph-interval", disabled=False, interval=1000)
然后,在您的回调中:
from dash.exceptions import PreventUpdate
@app.callback(
Output("graph", "figure"),
[Input("refresh-graph-interval", "n_intervals")]
)
def refresh_graph_interval_callback(n_intervals):
if n_intervals is not None:
for i in range(0,5):
time.sleep(0.1)
randomfunction(i)
return plot
raise PreventUpdate()