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

如何用Plotly Dash绘制带筛选下拉框的文本变量折线图

解决方案

要实现每月Code数量统计折线图+多维度下拉筛选,且在Plotly代码内完成聚合操作,可以通过plotly.graph_objects的updatemenus功能动态切换筛选条件,同时在每个选项中实时完成分组聚合。以下是完整实现步骤:

核心思路

  1. 先生成无筛选时的基础聚合数据(每月Code总数)
  2. 为每个筛选维度(type/group/Spec.)的所有取值生成对应的聚合数据
  3. 将所有筛选选项添加到下拉菜单,通过restyle方法动态更新图表数据

完整代码

import plotly.express as px
import pandas as pd

# 假设你的DataFrame为df,包含month、code、type、group、Spec.列
# df = pd.read_csv('your_data.csv')  # 替换为你的数据读取方式

# 1. 生成无筛选时的基础数据
df_total = df.groupby('month')['code'].count().reset_index(name='code_count')

# 2. 初始化基础折线图
fig = px.line(
    df_total,
    x='month',
    y='code_count',
    title='每月Code数量统计',
    labels={'month': '月份', 'code_count': 'Code数量'}
)

# 3. 构建下拉菜单选项
menu_buttons = []

# 添加「无筛选」选项
menu_buttons.append({
    'label': '无筛选',
    'method': 'restyle',
    'args': [{'x': [df_total['month']], 'y': [df_total['code_count']]}]
})

# 添加「按type筛选」的所有取值选项
for type_val in df['type'].unique():
    df_filtered = df[df['type'] == type_val].groupby('month')['code'].count().reset_index(name='code_count')
    menu_buttons.append({
        'label': f'Type: {type_val}',
        'method': 'restyle',
        'args': [{'x': [df_filtered['month']], 'y': [df_filtered['code_count']]}]
    })

# 添加「按group筛选」的所有取值选项
for group_val in df['group'].unique():
    df_filtered = df[df['group'] == group_val].groupby('month')['code'].count().reset_index(name='code_count')
    menu_buttons.append({
        'label': f'Group: {group_val}',
        'method': 'restyle',
        'args': [{'x': [df_filtered['month']], 'y': [df_filtered['code_count']]}]
    })

# 添加「按Spec.筛选」的所有取值选项
for spec_val in df['Spec.'].unique():
    df_filtered = df[df['Spec.'] == spec_val].groupby('month')['code'].count().reset_index(name='code_count')
    menu_buttons.append({
        'label': f'Spec.: {spec_val}',
        'method': 'restyle',
        'args': [{'x': [df_filtered['month']], 'y': [df_filtered['code_count']]}]
    })

# 4. 将下拉菜单添加到图表布局
fig.update_layout(
    updatemenus=[{
        'buttons': menu_buttons,
        'direction': 'down',
        'showactive': True,
        'x': 0.1,
        'xanchor': 'left',
        'y': 1.15,
        'yanchor': 'top'
    }]
)

fig.show()

为什么之前的尝试失效?

  • 直接用px.line(df, x='month', y='code')会把每个code值作为独立折线,而非统计每月数量
  • 仅添加assign_value=1但未结合groupby聚合,无法得到每月的统计结果

上述代码中,每个筛选选项都会先过滤数据,再按month分组统计code数量,完全在Plotly代码流程内完成聚合,无需提前修改原始DataFrame。

内容的提问来源于stack exchange,提问作者Yan Teixeira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:55:20