如何用Plotly Dash绘制带筛选下拉框的文本变量折线图
解决方案
要实现每月Code数量统计折线图+多维度下拉筛选,且在Plotly代码内完成聚合操作,可以通过plotly.graph_objects的updatemenus功能动态切换筛选条件,同时在每个选项中实时完成分组聚合。以下是完整实现步骤:
核心思路
- 先生成无筛选时的基础聚合数据(每月Code总数)
- 为每个筛选维度(
type/group/Spec.)的所有取值生成对应的聚合数据 - 将所有筛选选项添加到下拉菜单,通过
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
相关产品推荐
相关产品推荐

