有没有办法在 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()