在Dash中更新多个plot



我有一个非常基本的问题,主要是为了了解当变量变化时Dash是如何工作的。我刚开始建立一个仪表板,我仍然不熟悉完整的语法。

在我的布局中有一个plot,一个下拉框,回调函数和更新函数,像这样:

@app.callback(
Output(component_id='plot1', component_property='figure'),
Input(component_id='drop1', component_property='value')
)
def update_graph(sel):
""" Stuff for updating the plot """
return fig

效果很好,但是我不完全明白为什么。

现在,我的问题是……

  1. 回调如何知道update_graph()是要调用的函数,以便更新该绘图?它永远不会在回调方法中被调用,下拉框选择的值永远不会被传递到任何地方,等等。
  2. 如果我有多个动态情节会发生什么?另一个下拉框或任何其他响应元素在我的布局,我想更新第二个图形基于第二个输入对象。我需要做另一个回调和另一个更新函数?同样,每个回调如何知道要使用哪个更新函数?

提前感谢!

好的,我将用一个图表来解释一个简单的例子。一旦我们理解了单个图,那么多个图就更容易理解了。

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.layout = html.Div([
html.H6("Change the value in the text box to see callbacks in action!"),
html.Div(["Input: ",
dcc.Input(id='my-input', value='initial value', type='text')]),
html.Br(),
html.Div(id='my-output'),
])

@app.callback(
Output(component_id='my-output', component_property='children'),
Input(component_id='my-input', component_property='value')
)
def update_output_div(input_value):
return 'Output: {}'.format(input_value)

if __name__ == '__main__':
app.run_server(debug=True)

首先让我们注意输入和输出component_id。注意,输入的component_iddcc.Inputid匹配。匹配的id意味着在装饰器、@app.callback和布局对象之间有一个链接。这个链接意味着,一旦输入发生变化,装饰器将被调用,装饰器将查看其各自的输出id。然后,装饰器将寻求更新输出组件,即HTMLdiv。为了做到这一点,装饰器将始终查看自身下方的函数,在本例中是update_output_div。修改后的值(输入)将传递给此函数。

现在看多幅图。在下面的代码中,我将省略app.layout声明,只假设下面的每个id (square, cube two, threes, x^x, num-multi,dropdown)都链接到它们的对应项。

@app.callback(
Output('square', 'children'),
Output('cube', 'children'),
Output('twos', 'children'),
Output('threes', 'children'),
Output('x^x', 'children'),
Input('num-multi', 'value'),
Input('dropdown', 'value2'))
def callback_a(v, v2):
# update 

同样,装饰器将只查找任何输入中的更改,然后通过callback_a函数更新每个输出

那么回答你的第一个问题。回调总是直接在它的下面调用函数,而不需要隐式地对它进行编码。当然,您可以决定在该函数中调用其他函数。例如,如果我有多个可能不相关的输入,我可以查找实际触发的内容。

@app.callback(
Output('map', 'figure'),
Input('map','clickData'),
Input('map','selectedData'))
def update_scatter_plots(
ctx = dash.callback_context
if ctx.triggered[0]['prop_id'] == 'map.clickData':
#it was a click 
elif ctx.triggered[0]['prop_id'] == 'map.selectedData':
#it was a selection

这里我有一个地图图形,我有两个不同的输入一个点击事件和一个选择事件,根据上下文我可以决定如何处理传递的信息。

关于你的第二个问题,如果你想让我再详细说明一下,请告诉我。

最新更新