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

如何基于不同主成分绘制PCA数据并关联样本深度?

解决方案:PCA得分随样本深度的可视化

我完全理解你的需求——比起双图,你更想观察每个主成分的投影值(也就是PCA得分)随样本深度的变化趋势,这在分析环境/地质样本的垂直变化时非常实用,而且完全可以实现!下面是一步步的具体操作:

步骤1:提取PCA得分并关联深度数据

首先,我们需要把PCA的得分矩阵和你的深度数据合并成一个数据框。prcomp的结果里,$x就是所有样本在各主成分上的投影值,直接和原数据的depth列合并即可:

# 提取PCA得分并合并深度数据
pca_scores <- cbind(
  depth = data$depth,
  as.data.frame(GV7.pca$x)
)

步骤2:转换为长格式数据(ggplot友好格式)

ggplot更适合处理长格式数据,所以我们用tidyr包把每个主成分的列转成“主成分名称-得分”的键值对:

library(tidyr)
library(ggplot2)

# 转换为长格式
pca_long <- pivot_longer(
  pca_scores,
  cols = starts_with("PC"),  # 选中所有以PC开头的列(即所有主成分)
  names_to = "Principal_Component",
  values_to = "Score"
)

步骤3:绘制PCA得分随深度变化的图

现在可以用ggplot绘制每个主成分的趋势了。考虑到你有1000个样本,我们可以通过调整透明度、使用平滑曲线来优化可视化效果:

# 基础绘图:每个主成分单独分面
ggplot(pca_long, aes(x = depth, y = Score)) +
  geom_line(alpha = 0.7) +  # 降低透明度避免线条重叠
  facet_wrap(~Principal_Component, scales = "free_y") +  # 每个PC一个面板,y轴自适应范围
  labs(
    x = "Sample Depth",
    y = "PCA Score",
    title = "PCA Scores vs. Sample Depth"
  ) +
  theme_bw()  # 简洁的主题

针对大数据量的优化技巧

如果1000个样本的线条还是太密集,你可以试试这些调整:

  • 添加平滑趋势线:用geom_smooth来突出整体趋势,比如:
    ggplot(pca_long, aes(x = depth, y = Score)) +
      geom_point(size = 0.3, alpha = 0.2) +  # 用小点代替线条
      geom_smooth(method = "loess", color = "red", linewidth = 1) +  # 加平滑曲线
      facet_wrap(~Principal_Component, scales = "free_y") +
      theme_bw()
    
  • 只关注特定主成分:如果只关心PC3、PC4这类次要成分,可以在转换长格式时筛选:
    pca_long_filtered <- pivot_longer(
      pca_scores,
      cols = c(PC3, PC4, PC5),  # 只选你关注的主成分
      names_to = "Principal_Component",
      values_to = "Score"
    )
    

为什么ggbiplot不适合这个场景

ggbiplot的核心是绘制PCA双图,同时展示样本得分和变量载荷的关系,它的设计目标不是关联得分和外部变量(比如depth)。而用ggplot2的话,你可以完全自定义可视化逻辑,灵活满足这类垂直变化分析的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:27:29