如何在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
相关产品推荐
相关产品推荐

