plotly-Dash - 如何基于数据集列创建 3 个过滤器(下拉列表可以是多个 select)

plotly-Dash - how to create 3 filters based on dataset columns (drop down list can be multi select)

我是 Dash 的新手,我不了解 css 和 html。

我有一个要求,即基于数据中心、客户和公司 ID 列以及破折号库,为桑基图添加 3 个过滤器,类型是多选下拉列表。所以我可以过滤桑基图。 我需要的所有 3 个过滤器的默认值是 'Select All'.

我参考了https://dash.plotly.com/页的一些资料,但是由于某种原因,我没能成功。

这是 dash 部分的代码,我不知道如何为这 3 个过滤器添加回调。

app.layout = html.Div([
    dcc.Dropdown(
        id='my-multi-dataCenter-dropdown',
        options=[ {'label': i, 'value': i} for i in dataset['companyID'].unique()] + [{'label': 'Select all', 'value': 'allID'}],
        multi=True, placeholder='Please select Data Center'),
    dcc.Dropdown(
        id='my-multi-customer-dropdown',
        options=[{'label': i, 'value': i} for i in dataset['Customer'].unique()]  + [{'label': 'Select all', 'value': 'allID'}],
        multi=True, placeholder='Please select Customer'),
    
    dcc.Dropdown(
        id='my-multi-companyID-dropdown',
        options=[{'label': i, 'value': i} for i in dataset['companyID'].unique()] + [{'label': 'Select all', 'value': 'allID'}],
        multi=True, placeholder='Please select companyID'),
    
    html.Div(id='dd-output-container'),
    
    dcc.Graph(id='uxrPerfGoalSankey',figure=fig)
])
@app.callback(
    Output('dd-output-container', 'children'),
    Input('my-multi-dataCenter-dropdown', 'value'),
    Input('my-multi-customer-dropdown', 'value'),
    Input('my-multi-companyID-dropdown', 'value')
)
def update_output(value):
    return 'You have selected "{}"'.format(value)
if __name__ == '__main__':
    app.run_server(debug=True)

要添加 'select all' 选项,您可以这样做:

dcc.Dropdown(
    id='my-multi-companyID-dropdown',
    options=[
        {'label': i, 'value': i} for i in dataset['companyID'].unique()
    ] + [{'label': 'Select all', 'value': 'allID'],
    multi=True, placeholder='Please select companyID')

然后,在您的回调中,您可以检查 'allID' 值,并知道这意味着所有值。您可以为每个回调设置一个略有不同的回调,这样您就可以将它们区分开来。

编辑:修复回调。您需要确保函数采用的参数数量与您分配给回调的 InputState 值的数量相匹配。回调应如下所示:

@app.callback(
    Output('dd-output-container', 'children'),
    Input('my-multi-dataCenter-dropdown', 'value'),
    Input('my-multi-customer-dropdown', 'value'),
    Input('my-multi-companyID-dropdown', 'value')
)
def update_output(data_value, customer_value, company_id_value):
    # function body goes here