我正在尝试使用 Dash 构建一个折线图,显示随时间变化的吨位,并带有基于多列(列表 1 至 3)的下拉菜单。
折线图将显示 7 条线,从列表 1“Y”的吨位到列表 3“N”的吨位,下拉菜单仅切换特定线,以及显示全部线的选项。
但是,我似乎无法将所有 7 个选择选项都包含到下拉菜单中,我是否遗漏了什么?
加载的原始数据和Python数据框如下:
我申请的代码如下:
app = dash.Dash(__name__)
app.layout = html.Div([
dcc.Dropdown(
id='category-filter',
options=[
{'label': 'All', 'value': 'All'}] + [{'label': category, 'value': category} for category in df['LIST 1'].unique()],
value='All',
style={'width': '50%'}
),
dcc.Graph(id='line-chart')
])
@app.callback(
dash.Output('line-chart', 'figure'),
[dash.Input('category-filter', 'value')]
)
def update_chart(selected_category):
filtered_df = df if selected_category == 'All' else df[df['LIST 1'] == selected_category]
figure = {
'data': [
go.Scatter(
x=filtered_df['DATE'],
y=filtered_df['TONNAGE'],
mode='lines+markers',
name=selected_category if selected_category != 'All' else 'All Categories'
)
],
'layout': go.Layout(
title='Line Chart with Dropdown Filter',
xaxis={'title': 'Date'},
yaxis={'title': 'Tonnage'}
)
}
return figure
if __name__ == '__main__':
app.run_server(debug=True)
非常感谢!
但是,我似乎无法将所有 7 个选择选项都包含到下拉菜单中
options=[{'label': 'All', 'value': 'All'}] +
[{'label': category, 'value': category} for category in df['LIST 1'].unique()]
此代码仅添加按“LIST 1”列中的值进行过滤。您可以看到其他列甚至没有被提及。 如果您还需要“LIST 2”和“LIST 3”的过滤器,您应该在应用程序布局中添加另外两个 dcc.Dropdown 元素,将它们的 id 添加到输入中,并更改函数的逻辑以根据所有三个下拉列表过滤数据帧。
您还可以为单个下拉列表制作 7 个选项,并相应地更改
update_chart
功能,但这看起来很糟糕,而且用户无法一次按两列或三列进行过滤。
options=[{'label': 'All', 'value': 'All'}] +
[{'label': "list_1_" + category, 'value': "list_1_" + category} for category in df['LIST 1'].unique()] +
[{'label': "list_2_" + category, 'value': "list_2_" + category} for category in df['LIST 2'].unique()] +
[{'label': "list_3_" + category, 'value': "list_3_" + category} for category in df['LIST 3'].unique()]
在这种情况下,您还必须将
update_chart
函数中的过滤替换为:
if selected_category == 'All':
filtered_df = df
elif 'list_1' in selected_category:
filtered_df = df[df['LIST 1'] == selected_category[-1]]
elif 'list_2' in selected_category:
filtered_df = df[df['LIST 2'] == selected_category[-1]]
else:
filtered_df = df[df['LIST 3'] == selected_category[-1]]