如何在 Dash/Plotly 应用程序中自动为多个图形添加回调

Posted

技术标签:

【中文标题】如何在 Dash/Plotly 应用程序中自动为多个图形添加回调【英文标题】:How to add callbacks for multiple graphs in a Dash/Plotly app automatically 【发布时间】:2019-06-16 13:49:56 【问题描述】:

在单页 Dash by Plotly 应用程序中,我想显示许多类似的图表。

为此,我创建了一个可以生成许多图形的“工厂类”。

此类公开要在 Dash 应用程序的 app.layout@app.callback 代码中使用的方法。带有两个图表的示例app.py 如下所示:

import ...

app = dash.Dash(__name__)

graph_A = GraphFactory(feature="A")
graph_B = GraphFactory(feature="B")

app.layout = html.Div([
            graph_A.graph(),
            graph_B.graph(),
            ])

@app.callback(
    graph_A.callback_output(), graph_A.callback_inputs()
)
def update_A(value):
    return graph_A.callback_update(value)

@app.callback(
    graph_B.callback_output(), graph_B.callback_inputs()
)
def update_B(value):
    return graph_B.callback_update(value)

这很好用。但是我想显示GraphFactory 对象列表中的许多图表。创建对象并将它们放入应用布局中很容易:

graph_list = [ GraphFactory(feature=f) for f in feature_list ]

app.layout = html.Div([ 
            g.graph() for g in graph_list
            ])

但是**如何添加许多callback_output()callback_inputs()callback_update(value) 调用?有没有办法只编写一次装饰器和函数并在其中添加对callback_...函数的调用?

【问题讨论】:

【参考方案1】:

通过深入研究装饰器,我自己找到了一个解决方案:您可以直接在对象的callback_update 函数上调用 Dash 装饰器。因此,对于问题中的示例,您可以编写:

for g in graph_list:
    dash_app.callback(g.callback_output(),
                      g.callback_inputs())(g.callback_update)

请注意,g.callback_update 没有(),因为app.callback 函数被应用于g.callback_update函数/方法,而不是像往常一样返回价值

【讨论】:

【参考方案2】:

如果其他人在寻找另一种方法,Dash 0.39 - Multiple Outputs 中引入了一个解决方案。

https://community.plotly.com/t/multiple-outputs-in-dash-now-available/19437

在回调中使用输出列表/元组作为输出。 从回调中返回一个元组/值列表 返回的列表必须与输出列表的长度相同 输出道具按照它们在输出 > 列表中声明的顺序应用。

'Applied' = 在回调中声明的输出在 app.layout 中按从上到下的顺序应用

【讨论】:

以上是关于如何在 Dash/Plotly 应用程序中自动为多个图形添加回调的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有多个唯一图形的布局上实现 Dash/Plotly 清单持久性?

Plotly Dash:如何在 html.Img 上方添加标题?

在 python dash plotly 主题中更改颜色

在 python 中使用 panda 库和 Dash Plotly 创建带有标签和值的下拉菜单

将表单添加到 Dash/Plotly 应用程序

在 Plotly Dash 中居中 dcc.input 字段