Python Plotly Dash : 如何在回调后插入新值进行过滤? (更新过滤器)
Python Plotly Dash : How to insert new values to filter after the callback? (Update filter)
我的情况是 user_id 只有在他登录后我才得到 table。
例如:
app = dash.Dash(__name__)
#Filter with static values
Month_Selector = dcc.Dropdown(id='month_dropdown',
options=[
{"label": "November 2021", "value": "November 2021"},
{"label": "October 2021", "value": "October 2021"},
{"label": "September 2021", "value": "September 2021"},
],
placeholder="Select Month",
value = datetime.today().strftime('%B %Y'),
searchable=False
)
app.layout = html.Div(
children=[
html.Div(Month_Selector, style={'width': '200px'}),
dcc.Graph(id='chart')
]
)
@dash_app.callback(
[
Output(component_id='chart', component_property='figure')
],
[Input(component_id="submit-button-state", component_property="n_clicks"),
Input(component_id="month_dropdown", component_property="value")]
)
def get_user_name(n_clicks, selected_month):
# Can get a table only after user authorization.
df= get_table_by_an_authorized_user_id
#filter table by slicer value
filtered_df= df[ (df['Month Name'] == selected_month)]
# This new values that need to insert to slicer Month_Selector
new_options_for_month_selector=[{'label': i, 'value': i} for i in df['Month Name'].unique()]
fig = px.bar(filtered_df, x='Month Name', y='Sales')
return fig
# Run Local Server
if __name__ == '__main__':
app.run_server(debug=True, use_reloader=False)
因此在@callback 之前我只能使用过滤静态值。
如何使用 @callback 后获得的动态值更新或替换过滤器值?
您想更新下拉列表的 options
属性,因此您可以使用新选项添加 Output 并进行回调 return 他们连同更新后的数字:
@dash_app.callback(
[Output(component_id='chart', component_property='figure'),
Output(component_id='month_dropdown', component_property='options')],
[Input(component_id="submit-button-state", component_property="n_clicks"),
Input(component_id="month_dropdown", component_property="value")]
)
def get_user_name(n_clicks, selected_month):
# Can get a table only after user authorization.
df= get_table_by_an_authorized_user_id
#filter table by slicer value
filtered_df= df[ (df['Month Name'] == selected_month)]
# This new values that need to insert to slicer Month_Selector
new_options_for_month_selector=[{'label': i, 'value': i} for i in df['Month Name'].unique()]
fig = px.bar(filtered_df, x='Month Name', y='Sales')
return [fig, new_options_for_month_selector]
我的情况是 user_id 只有在他登录后我才得到 table。
例如:
app = dash.Dash(__name__)
#Filter with static values
Month_Selector = dcc.Dropdown(id='month_dropdown',
options=[
{"label": "November 2021", "value": "November 2021"},
{"label": "October 2021", "value": "October 2021"},
{"label": "September 2021", "value": "September 2021"},
],
placeholder="Select Month",
value = datetime.today().strftime('%B %Y'),
searchable=False
)
app.layout = html.Div(
children=[
html.Div(Month_Selector, style={'width': '200px'}),
dcc.Graph(id='chart')
]
)
@dash_app.callback(
[
Output(component_id='chart', component_property='figure')
],
[Input(component_id="submit-button-state", component_property="n_clicks"),
Input(component_id="month_dropdown", component_property="value")]
)
def get_user_name(n_clicks, selected_month):
# Can get a table only after user authorization.
df= get_table_by_an_authorized_user_id
#filter table by slicer value
filtered_df= df[ (df['Month Name'] == selected_month)]
# This new values that need to insert to slicer Month_Selector
new_options_for_month_selector=[{'label': i, 'value': i} for i in df['Month Name'].unique()]
fig = px.bar(filtered_df, x='Month Name', y='Sales')
return fig
# Run Local Server
if __name__ == '__main__':
app.run_server(debug=True, use_reloader=False)
因此在@callback 之前我只能使用过滤静态值。 如何使用 @callback 后获得的动态值更新或替换过滤器值?
您想更新下拉列表的 options
属性,因此您可以使用新选项添加 Output 并进行回调 return 他们连同更新后的数字:
@dash_app.callback(
[Output(component_id='chart', component_property='figure'),
Output(component_id='month_dropdown', component_property='options')],
[Input(component_id="submit-button-state", component_property="n_clicks"),
Input(component_id="month_dropdown", component_property="value")]
)
def get_user_name(n_clicks, selected_month):
# Can get a table only after user authorization.
df= get_table_by_an_authorized_user_id
#filter table by slicer value
filtered_df= df[ (df['Month Name'] == selected_month)]
# This new values that need to insert to slicer Month_Selector
new_options_for_month_selector=[{'label': i, 'value': i} for i in df['Month Name'].unique()]
fig = px.bar(filtered_df, x='Month Name', y='Sales')
return [fig, new_options_for_month_selector]