有没有办法在 Dash Plotly Python 中打开开关时不断更新图形?

Posted

技术标签:

【中文标题】有没有办法在 Dash Plotly Python 中打开开关时不断更新图形?【英文标题】:Is there a way to constantly update a graph figure while a switch is on in Dash Plotly Python? 【发布时间】:2022-01-03 04:25:35 【问题描述】:

我有一个使用算法更新图形图形的函数,以及一个用于返回图形图形的回调函数(以及许多其他内容)。这是基本思想:

for i in range(0,5):
    time.sleep(0.1)
    randomfunction(i)
    return plot

如何在不中断循环的情况下更新图表?我尝试使用 yield 而不是 return 无济于事,因为回调不希望输出生成器类。

【问题讨论】:

【参考方案1】:

虽然公认的答案确实有效,但对于任何想要在没有外部存储的情况下执行此操作的人来说,还有另一种方法。

有一个名为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()

【讨论】:

谢谢,这真的很有帮助。不过,我所做的是将 for 循环替换为函数的参数为​​ (n_intervals%5),因为它对我的特定任务(和拥挤的回调)效果更好。【参考方案2】:

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

【讨论】:

以上是关于有没有办法在 Dash Plotly Python 中打开开关时不断更新图形?的主要内容,如果未能解决你的问题,请参考以下文章

在 python dash plotly 主题中更改颜色

在 Plotly Dash 图表中放置刻度标签 - Python

Plotly Dash:在 Python 中绘制 networkx

即使屏幕尺寸在 Dash-plotly 中使用 python 改变,如何在导航栏中固定按钮的位置

如何通过 Python 中的 Plotly 从 Dash 的下拉列表中选择数据集列?

python 示例django-plotly-dash views.py