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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:06:03