如何用Python Plotly实现带双下拉菜单切换主成分的交互式PCA散点图
实现思路
核心方案:不预创建所有PC组合的trace(会导致trace数量过多、visible状态管理混乱),基于你原有plotly express生成的基础图(保留原生美观样式),通过下拉菜单动态修改现有3条trace的x/y数据源、坐标轴标签和图表标题,仅需3条trace即可实现所有PC组合切换。
完整可运行代码
import pandas as pd import plotly.express as px import plotly.graph_objects as go # 读取数据 components_df = pd.read_csv("components_df.csv") # 预设配置 labels = { '0': 'PC 1 (22.0%)', '1': 'PC 2 (19.6%)', '2': 'PC 3 (11.1%)', '3': 'PC 4 (8.2%)', '4': 'PC 5 (3.9%)', 'color': 'Group' } pc_cols = [0,1,2,3,4] # 和px生成的trace顺序保持一致,按需调整 class_order = ["Before", "After", "QC"] # 存储当前选中的x/y pc编号,用于标题同步 current_x_pc = 0 current_y_pc = 1 # 用px生成基础图,完全保留你原有的样式、hover效果 fig = px.scatter( components_df, x=current_x_pc, y=current_y_pc, color='Class', width=1000, height=700, template='presentation', labels=labels, title=f"PCA Score Plot (PC{current_x_pc+1} vs. PC{current_y_pc+1})", hover_data=['idx', 'SampleID'] ) # ========== 配置x轴下拉菜单 ========== x_buttons = [] for x_pc in pc_cols: x_buttons.append(dict( label=f"PC{x_pc+1}", method="update", args=[ # 修改所有trace的x数据源 {"x": [components_df.loc[components_df.Class == c, x_pc] for c in class_order]}, # 修改x轴标签和标题 { "xaxis.title": labels[str(x_pc)], "title": f"PCA Score Plot (PC{x_pc+1} vs. PC{current_y_pc+1})" } ] )) # ========== 配置y轴下拉菜单 ========== y_buttons = [] for y_pc in pc_cols: y_buttons.append(dict( label=f"PC{y_pc+1}", method="update", args=[ # 修改所有trace的y数据源 {"y": [components_df.loc[components_df.Class == c, y_pc] for c in class_order]}, # 修改y轴标签和标题 { "yaxis.title": labels[str(y_pc)], "title": f"PCA Score Plot (PC{current_x_pc+1} vs. PC{y_pc+1})" } ] )) # ========== 把两个下拉菜单添加到图表 ========== fig.update_layout( updatemenus=[ # x轴下拉菜单,放在左上角 dict( buttons=x_buttons, direction="down", showactive=True, x=0.1, xanchor="left", y=1.15, yanchor="top", active=current_x_pc, pad={"r": 10, "t": 10}, name="X轴主成分" ), # y轴下拉菜单,放在x下拉右侧 dict( buttons=y_buttons, direction="down", showactive=True, x=0.4, xanchor="left", y=1.15, yanchor="top", active=current_y_pc, pad={"r": 10, "t": 10}, name="Y轴主成分" ) ] ) # 添加下拉菜单的说明文本 fig.add_annotation( x=0.05, y=1.15, xref='paper', yref='paper', showarrow=False, text="X轴选择:", font=dict(size=14) ) fig.add_annotation( x=0.35, y=1.15, xref='paper', yref='paper', showarrow=False, text="Y轴选择:", font=dict(size=14) ) fig.show()
问题解决说明
- 图例固定:全程仅3条trace对应三个分组,无新增/删除trace操作,图例始终保持一致
- 数据准确:直接动态替换trace的x/y数据源,无需管理大量trace的visible状态,不存在匹配错误问题
- 样式保留:完全基于你原有plotly express生成的图表修改,保留了原生配色、模板、hover提示等所有样式
- 双下拉实现:两个独立下拉菜单分别控制x轴、y轴的主成分选择,切换时自动同步坐标轴标签和图表标题
内容的提问来源于stack exchange,提问作者TaL
相关产品推荐
相关产品推荐

