ggplot2绘制PCA图出现坐标轴翻转,如何调整使两张图完全一致
ggplot2绘制PCA图坐标轴方向反转的解决方法
PCA计算过程中特征向量符号随机翻转是正常数值计算现象,和脚本本身无关,可通过以下三种方案解决:
方案1:直接在绘图时调整坐标轴方向
以其中一张图为基准,另一张图对反转的坐标轴添加scale_*_reverse()函数,同时固定坐标轴范围避免缩放差异:
# 基准图轴设置示例(根据你的实际PCA结果调整范围值) scale_x_continuous(limits = c(-5, 5), breaks = seq(-5,5,2)) + scale_y_continuous(limits = c(-4, 4), breaks = seq(-4,4,2)) # 若PC1方向反转,替换x轴设置为 scale_x_reverse(limits = c(5, -5), breaks = seq(-5,5,2)) + scale_y_continuous(limits = c(-4, 4), breaks = seq(-4,4,2)) # 若PC2方向反转,替换y轴设置为 scale_x_continuous(limits = c(-5, 5), breaks = seq(-5,5,2)) + scale_y_reverse(limits = c(4, -4), breaks = seq(-4,4,2))
方案2:合并数据统一做PCA(根源避免问题)
不要分两次独立运行PCA计算,将两组数据合并后执行一次PCA,再拆分绘图,可保证坐标轴完全一致:
library(ggplot2) library(dplyr) # 给两组数据添加分组标签 df1$group <- "数据集1" df2$group <- "数据集2" # 合并两组数据,仅保留用于PCA计算的数值列+分组列 all_data <- bind_rows(df1, df2) # 对全部样本统一执行PCA pca_res <- prcomp(all_data[, c("此处替换为你用于PCA的数值列名")], scale. = TRUE) # 提取PC1、PC2坐标并关联分组信息 pca_coord <- as.data.frame(pca_res$x[,1:2]) %>% mutate(group = all_data$group) # 绘制第一组PCA图 ggplot(filter(pca_coord, group == "数据集1"), aes(x=PC1, y=PC2)) + geom_point() + # 固定轴范围为全部样本的PC最值,保证两张图范围完全一致 scale_x_continuous(limits = c(min(pca_coord$PC1), max(pca_coord$PC1))) + scale_y_continuous(limits = c(min(pca_coord$PC2), max(pca_coord$PC2))) # 绘制第二组PCA图 ggplot(filter(pca_coord, group == "数据集2"), aes(x=PC1, y=PC2)) + geom_point() + scale_x_continuous(limits = c(min(pca_coord$PC1), max(pca_coord$PC1))) + scale_y_continuous(limits = c(min(pca_coord$PC2), max(pca_coord$PC2)))
方案3:数据层面对齐PCA坐标符号
如果必须分开运行PCA,可通过相关系数判断符号是否翻转,直接对PCA结果乘以-1对齐:
# 假设pca1为基准组的prcomp计算结果,pca2为待对齐组的计算结果 # 对齐PC1 if (cor(pca1$x[,1], pca2$x[,1]) < 0) { pca2$x[,1] <- pca2$x[,1] * -1 } # 对齐PC2 if (cor(pca1$x[,2], pca2$x[,2]) < 0) { pca2$x[,2] <- pca2$x[,2] * -1 }
额外注意事项
- 所有绘图的坐标轴范围、刻度参数必须完全一致,不要使用ggplot的默认自动计算逻辑
- 如果需要标注解释度,可统一提取基准组的PCA解释度标注在两张图上,保持图例、字体、配色参数完全一致
内容的提问来源于stack exchange,提问作者Rita
相关产品推荐
相关产品推荐

