如何在 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 上方添加标题?