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

如何在R中用PCA计算结果作为ggplot的坐标轴标签

自动生成带变异解释率的PCA绘图坐标轴标签

要解决手动修改坐标轴标签的麻烦,核心是从PCA结果中自动提取各主成分的变异解释百分比,再把逻辑封装成可复用的代码,不用每次手动拼接标签。下面用iris数据集做完整演示:

1. 执行PCA并提取变异解释率

library(ggplot2)
library(stats)

# 对iris的数值列做标准化PCA
iris_pca <- prcomp(iris[, 1:4], scale. = TRUE)

# 计算每个PC的变异解释百分比(保留两位小数)
var_explained <- round((iris_pca$sdev^2 / sum(iris_pca$sdev^2)) * 100, 2)

2. 封装可复用的绘图函数

把标签生成、绘图逻辑打包成函数,切换PC时只需修改x/y对应的PC编号:

plot_pca <- function(pca_obj, pc_x = 1, pc_y = 2, groups = NULL) {
  # 提取PCA得分数据
  scores <- as.data.frame(pca_obj$x)
  
  # 若有分组信息,合并到得分数据中
  if (!is.null(groups)) {
    scores$group <- groups
  }
  
  # 自动生成坐标轴标签
  x_lab <- paste0("PC", pc_x, " (", var_explained[pc_x], "%)")
  y_lab <- paste0("PC", pc_y, " (", var_explained[pc_y], "%)")
  
  # 初始化ggplot绘图
  p <- ggplot(scores, aes(x = .data[[paste0("PC", pc_x)]], y = .data[[paste0("PC", pc_y)]])) +
    geom_point(alpha = 0.7) +
    labs(x = x_lab, y = y_lab, title = "PCA Score Plot") +
    theme_minimal()
  
  # 若有分组,添加颜色映射
  if (!is.null(groups)) {
    p <- p + aes(color = group)
  }
  
  return(p)
}

3. 调用函数快速切换PC绘图

画PC1 vs PC2:

plot_pca(iris_pca, pc_x = 1, pc_y = 2, groups = iris$Species)

要切换成PC2 vs PC3?直接修改参数即可,完全不用手动调整标签:

plot_pca(iris_pca, pc_x = 2, pc_y = 3, groups = iris$Species)

关键细节说明

  • 使用.data[[paste0("PC", pc_x)]]是为了规避ggplot的非标准求值问题,确保能正确引用对应的PC列
  • 变异解释率的计算逻辑:PCA对象的sdev是各主成分的标准差,平方后得到方差,除以总方差就是该PC的解释比例,转成百分比后保留两位小数更美观
  • 函数支持可选的分组参数,不需要分组时直接省略groups参数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:02:17