我尝试构建一个带有绘图破折号的仪表板,其中有一个下拉菜单作为输入年份,输出是数据框,它将由下拉列表中的输入进行过滤。当我运行该应用程序时,什么也没有发生。
这是我的代码:
app= dash.Dash(__name__)
app.layout= html.Div([
html.H1("Total Medals of Each Country", style={'text-alugn':'center', 'color':'white'}),
dcc.Dropdown(id='select_year',
options=np.array(medals_by_country.year.unique(), dtype=np.int64),
multi=True,
value= ' ',
style={'width':'40%'}
),
html.Br(),
html.Div([
dash_table.DataTable(
id='datatable_id',
data=medals_by_country.to_dict('records'),
columns=[
{"name":i, "id":i, "deletable":False, "selectable":False} for i in medals_by_country.columns
],
editable=False,
# filter_action="native",
# sort_action="native",
# sort_mode="multi",
row_selectable="multi",
row_deletable=False,
selected_rows=[],
page_action="native",
page_current=0,
page_size=6,
# page_action='none',
# style_cell={'whiteSpace': "normal"},
# fixed_rows={'headers':True, 'data':0},
# virtualization=False,
style_cell_conditional=[{'width':'40%'}],
)
]),
])
@app.callback(
Output(component_id='datatable_id', component_property='selected_rows'),
Input(component_id='select_year', component_property='value')
)
def update_table(option_selected):
dff= medals_by_country.copy()
dff= dff[dff['year']== option_selected]
return dff
if __name__ == '__main__':
app.run_server(debug=True)
我不知道如何在下拉列表和数据表之间连接,任何建议都会有帮助。 另一个问题:如果我的 DataTable 具有过滤列的能力,filter_action =“native”,我的 @app.callback 是否需要来自 DataTable 本身的输入 id?
谢谢你
使用具有选项
Dropdown
的 multi = True
,您不能在代码中使用 dff= dff[dff['year']== option_selected]
,但可以使用 isin
。
您的
callback
应如下所示:
@app.callback(
Output('datatable_id', 'data'),
Input('select_year', 'value')
)
def update_table(option_selected):
dff= medals_by_country.copy()
dff= dff[dff['year'].isin(option_selected)]
return dff.to_dict('records)
if __name__ == '__main__':
app.run_server(debug=True)