如何在 Dash/Plotly 应用程序中自动为多个图表添加回调
How to add callbacks for multiple graphs in a Dash/Plotly app automatically
在单页 Dash by Plotly 应用程序中,我想显示许多相似的图表。
为此我创建了一个 "factory class" 可以生成很多图表。
此 class 公开了要在 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_...
函数的调用?
通过深入研究装饰器,我自己找到了一个解决方案:您可以直接在对象的 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
function/method ,与往常不同 return 值 .
为了防止其他人寻找另一种方法来执行此操作,Dash 0.39 中引入了一个解决方案 - 多输出。
https://community.plotly.com/t/multiple-outputs-in-dash-now-available/19437
Use a list/tuple of Output as output in callbacks.
Return a tuple/list of value from the callbacks
The returned list must have the same length as the list of output
The output props are applied in the order they were declared in the output > list.
'Applied' = 在 app.layout 中应用的回调中声明的输出按从上到下的顺序
在单页 Dash by Plotly 应用程序中,我想显示许多相似的图表。
为此我创建了一个 "factory class" 可以生成很多图表。
此 class 公开了要在 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_...
函数的调用?
通过深入研究装饰器,我自己找到了一个解决方案:您可以直接在对象的 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
function/method ,与往常不同 return 值 .
为了防止其他人寻找另一种方法来执行此操作,Dash 0.39 中引入了一个解决方案 - 多输出。
https://community.plotly.com/t/multiple-outputs-in-dash-now-available/19437
Use a list/tuple of Output as output in callbacks. Return a tuple/list of value from the callbacks The returned list must have the same length as the list of output The output props are applied in the order they were declared in the output > list.
'Applied' = 在 app.layout 中应用的回调中声明的输出按从上到下的顺序