如何在Dash中构建带有两个下拉菜单的柱状图
如何在Dash中构建带有两个下拉菜单的柱状图
我明白你的困扰——你的数据集结构和常见示例不太一样,而且已经搞定了单下拉菜单的情况,但双下拉的回调逻辑确实需要针对性调整一下。咱们来一步步修正你的代码:
首先看你现有回调函数的问题:你只根据selected_statistic筛选了数据,但完全没用到year这个输入,而且df2[df2]这种写法是无效的,这也是图表没正确响应年份下拉的核心原因。
假设你的数据集是长格式(包含city、statistic、year、value这几个核心列),咱们来修改代码:
修正后的完整代码
import dash import dash_core_components as dcc import dash_html_components as html from dash.dependencies import Input, Output import plotly.express as px import pandas as pd # 读取数据(确保你的Excel表中包含year列哦) df = pd.read_excel('cities.xlsx', engine='openpyxl') app = dash.Dash() app.layout = html.Div([ html.Div([ dcc.Dropdown( id= "selected_statistic", options=[ {'label': 'Population', 'value': 'pop'}, {'label': 'Area', 'value': 'a'}, {'label': 'Density', 'value': 'dens'} ], value='pop' ) ], style={'width': '48%', 'display': 'inline-block'}), html.Div([ dcc.Dropdown( id= "year", options=[ {'label': '1990', 'value': '1990'}, {'label': '2000', 'value': '2000'}, {'label': '2010', 'value': '2010'}, {'label': '2020', 'value': '2020'} ], value='1990' ), ], style={'width': '48%', 'float': 'right', 'display': 'inline-block'}), dcc.Graph(id='graph') ]) @app.callback( Output('graph', 'figure'), [Input('selected_statistic', 'value'), Input('year', 'value')] ) def update_figure(selected_statistic, year): # 同时根据统计指标和年份筛选数据,确保只拿到当前选中维度的内容 filtered_df = df[(df["statistic"] == selected_statistic) & (df["year"] == year)] # 生成柱状图,可选添加动态标题让展示更直观 fig = px.bar( filtered_df, x="city", y="value", color="city", title=f'{selected_statistic.capitalize()} by City ({year})' ) return fig if __name__ == '__main__': app.run_server(debug=True) # 加上debug=True方便开发时调试
关键修改点说明:
- 回调筛选逻辑优化:新增年份筛选条件,用
&连接两个布尔索引,实现双下拉选项的联动筛选。 - 移除无效写法:删掉了无意义的
df2[df2],直接用筛选后的filtered_df生成图表。 - 体验优化:添加动态标题,让图表能直观展示当前选中的统计指标和年份。
这样调整后,两个下拉菜单就能完全联动控制柱状图内容了——切换不同的统计指标或年份,图表会自动更新对应的数据。
备注:内容来源于stack exchange,提问作者OGhilex
相关产品推荐
相关产品推荐

