Python Dash - 带有下拉菜单的折线图,用于按多列进行过滤

问题描述 投票:0回答:1

我正在尝试使用 Dash 构建一个折线图,显示随时间变化的吨位,并带有基于多列(列表 1 至 3)的下拉菜单。

折线图将显示 7 条线,从列表 1“Y”的吨位到列表 3“N”的吨位,下拉菜单仅切换特定线,以及显示全部线的选项。

但是,我似乎无法将所有 7 个选择选项都包含到下拉菜单中,我是否遗漏了什么?

加载的原始数据和Python数据框如下:

enter image description here

我申请的代码如下:

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)

非常感谢!

python drop-down-menu plotly-dash
1个回答
0
投票

但是,我似乎无法将所有 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]]
© www.soinside.com 2019 - 2024. All rights reserved.