You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Dash多列筛选下拉菜单折线图开发问题

Python Dash多列筛选下拉菜单折线图开发问题

嗨,我来帮你搞定这个问题!你当前的代码只用到了LIST 1的选项,完全没涉及LIST 2和LIST 3,所以肯定凑不齐你要的7个选项呀!接下来咱们一步步调整代码,实现你想要的功能:

问题核心分析

你需要的7个下拉选项是:「All」 + 「List1-Y」「List1-N」「List2-Y」「List2-N」「List3-Y」「List3-N」。现在的代码只生成了LIST 1的选项,所以得先把另外两个列表的选项加进去,再调整回调里的绘图逻辑。

修改后的完整代码

import dash
from dash import html, dcc, Input, Output
import plotly.graph_objects as go
import pandas as pd

# 假设你已经加载了df数据,替换成你的真实数据加载逻辑即可
# df = pd.read_csv("your_data_source.csv")

app = dash.Dash(__name__)

# 构建完整的7个下拉选项
dropdown_options = [
    {'label': 'All', 'value': 'All'}
] + [
    {'label': f'List {num} - {val}', 'value': f'List{num}_{val}'}
    for num in [1, 2, 3]
    for val in ['Y', 'N']
]

app.layout = html.Div([
    dcc.Dropdown(
        id='category-filter',
        options=dropdown_options,
        value='All',  
        style={'width': '50%'}
    ),
    dcc.Graph(id='line-chart')
])

@app.callback(
    Output('line-chart', 'figure'),
    Input('category-filter', 'value')
)
def update_chart(selected_category):
    figure_data = []
    
    if selected_category == 'All':
        # 选中All时,绘制所有6种分类的折线
        for num in [1, 2, 3]:
            for val in ['Y', 'N']:
                filtered_df = df[df[f'LIST {num}'] == val]
                figure_data.append(go.Scatter(
                    x=filtered_df['DATE'],
                    y=filtered_df['TONNAGE'],
                    mode='lines+markers',
                    name=f'List {num} - {val}'
                ))
    else:
        # 解析选中的具体选项,拆分出对应列表和Y/N值
        list_tag, val = selected_category.split('_')
        list_col = f'LIST {list_tag[-1]}'  # 提取编号,比如List1_Y对应LIST 1
        filtered_df = df[df[list_col] == val]
        figure_data.append(go.Scatter(
            x=filtered_df['DATE'],
            y=filtered_df['TONNAGE'],
            mode='lines+markers',
            name=selected_category.replace('_', ' - ')
        ))
    
    # 构建图表布局
    figure = {
        'data': figure_data,
        'layout': go.Layout(
            title='Tonnage Over Time by List Categories',
            xaxis={'title': 'Date'},
            yaxis={'title': 'Tonnage'},
            legend={'title': 'Category'}
        )
    }
    return figure

if __name__ == '__main__':
    app.run_server(debug=True)

关键修改点说明

  • 下拉选项补全:用嵌套循环生成List1-Y到List3-N的所有分类选项,给每个选项分配唯一的value(比如List1_Y),避免标签和值混淆。
  • 回调逻辑优化:
    • 选「All」时,遍历所有6种List+Y/N组合,分别过滤数据并生成折线,一次性展示所有分类趋势;
    • 选单个选项时,拆分value字符串得到对应的列表列和Y/N值,精准过滤数据并绘制单条折线。
  • 可读性提升:给图例添加标题,让每条折线对应的分类更清晰。

这样调整后,下拉菜单就有你需要的7个选项,并且能正确切换显示对应的折线啦!

备注:内容来源于stack exchange,提问作者TropicalMagic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:19:33