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

基于PCA结果制作子图优化散点图可视化的技术问询

优化PCA结果可视化的方案

你的核心问题在于尝试可视化60个主成分(PC)的散点矩阵——60×60的子图网格必然会导致布局拥挤、点重叠严重,完全丧失可读性。下面提供几种针对性的优化方案,聚焦关键信息同时保持可视化的清晰度:


1. 聚焦高方差贡献的前N个PC

PCA的核心逻辑是前几个PC已经包含了数据的大部分方差,后续PC的贡献极低,没有必要全部展示。先通过方差贡献分析确定要展示的PC数量,再生成散点矩阵:

import pandas as pd
import plotly.express as px
from sklearn.decomposition import PCA

# 假设df是包含前60个变量的数据集
n_components = 60
pca = PCA(n_components=n_components)
components = pca.fit_transform(df)

# 输出前10个PC的方差贡献,判断需要保留的数量
print("前10个PC的方差贡献(%):", [f"{v:.1f}" for v in pca.explained_variance_ratio_[:10]*100])

# 选择前4个PC进行可视化(可根据实际方差贡献调整)
show_pcs = 4
# 给每个PC标注方差占比,增强信息密度
labels = {str(i): f"PC {i+1} ({pca.explained_variance_ratio_[i]:.1%})" for i in range(show_pcs)}

fig = px.scatter_matrix(
    components[:, :show_pcs],  # 仅取前show_pcs个PC
    color=target,
    dimensions=range(show_pcs),
    labels=labels,
    title=f'Total Explained Variance (Top {show_pcs} PCs): {pca.explained_variance_ratio_[:show_pcs].sum()*100:.2f}%',
)
fig.update_traces(diagonal_visible=False, marker=dict(size=4))  # 调整点大小避免重叠
fig.show()

2. 自定义子图展示关键PC两两组合

如果需要更灵活的布局,比如重点展示前4个PC的两两对比,可以用Plotly子图手动构建:

import plotly.graph_objects as go
from plotly.subplots import make_subplots

# 选择前4个PC
pc_indices = [0, 1, 2, 3]
# 定义要展示的两两PC组合
pc_pairs = [(0,1), (0,2), (0,3), (1,2), (1,3), (2,3)]

# 创建3行2列的子图布局
fig = make_subplots(
    rows=3, cols=2,
    subplot_titles=[f"PC {i+1} vs PC {j+1}" for i,j in pc_pairs],
    x_title="Principal Component",
    y_title="Principal Component"
)

# 遍历每个类别绘制散点
for t, c in zip(targets, colors):
    mask = target == t
    for idx, (i,j) in enumerate(pc_pairs):
        row = idx//2 + 1
        col = idx%2 + 1
        fig.add_trace(go.Scatter(
            x=components[mask, i],
            y=components[mask, j],
            mode='markers',
            marker_color=c,
            name=t,
            showlegend=(idx==0)  # 仅在第一个子图显示图例,避免重复
        ), row=row, col=col)

# 调整整体布局和点大小
fig.update_layout(height=800, width=1000, title_text="PCA Pairwise Scatters (Top 4 PCs)")
fig.update_traces(marker=dict(size=5))
fig.show()

3. 3D散点图展示前3个PC

如果想直观观察样本在三维空间的聚类情况,用3D散点图展示前3个PC是高效的选择:

fig = px.scatter_3d(
    components[:, :3],
    x=0, y=1, z=2,
    color=target,
    labels={
        '0': f"PC 1 ({pca.explained_variance_ratio_[0]:.1%})",
        '1': f"PC 2 ({pca.explained_variance_ratio_[1]:.1%})",
        '2': f"PC 3 ({pca.explained_variance_ratio_[2]:.1%})"
    },
    title=f"3D PCA Plot (Top 3 PCs, Total Variance: {pca.explained_variance_ratio_[:3].sum()*100:.2f}%)"
)
fig.update_traces(marker=dict(size=6))
fig.show()

4. 先可视化方差贡献,确定关键PC

先绘制每个PC的方差贡献条形图,帮你快速判断哪些PC值得深入分析:

import plotly.graph_objects as go

pc_variance = pca.explained_variance_ratio_ * 100
fig = go.Figure(go.Bar(
    x=[f"PC {i+1}" for i in range(n_components)],
    y=pc_variance,
    text=[f"{v:.1f}%" for v in pc_variance],
    textposition='auto'
))
fig.update_layout(
    title="PCA Explained Variance per Component",
    xaxis_title="Principal Component",
    yaxis_title="Explained Variance (%)",
    xaxis_tickangle=-45
)
fig.show()

核心思路总结

  • 放弃展示所有60个PC:后续PC的方差贡献极低,对分析无实质帮助
  • 优先聚焦前3-5个PC:通常能覆盖80%以上的总方差
  • 根据分析需求选择可视化方式:散点矩阵(少量PC)适合整体对比,自定义子图适合重点分析,3D图适合聚类观察

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:53:13