如何在R中绘制多子图累积方差图?解决95%累积方差可视化问题
优化高维PCA方差解释率的可视化:拆分成分组子图
当需要展示多达132个主成分的方差解释情况时,单张图表会因为数据点过于密集变得难以阅读——尤其是后面的主成分方差占比极低,几乎挤在一起。拆分成分组子图是完美的解决方案,既能保留所有信息,又能大幅提升可读性。
方案1:按累积方差区间分组(推荐)
这种方式更贴合分析逻辑,把主成分按累积方差的阶段划分,让读者能清晰看到不同阶段的方差贡献变化:
首先,我们先提取并整理PCA的特征值数据:
library(dplyr) # 提取特征值并整理成数据框 eig_data <- as.data.frame(PCA_Model_Input_Dataset$eig) colnames(eig_data) <- c("variance", "pct_variance", "cum_pct") eig_data$comp_num <- seq_len(nrow(eig_data)) # 生成主成分编号 # 按累积方差区间分组,重点突出你关心的95%阈值区间 eig_data$group <- case_when( eig_data$cum_pct <= 80 ~ "1. 累积方差 ≤ 80%", eig_data$cum_pct > 80 & eig_data$cum_pct <= 90 ~ "2. 80% < 累积方差 ≤ 90%", eig_data$cum_pct > 90 & eig_data$cum_pct <= 95 ~ "3. 90% < 累积方差 ≤ 95%", TRUE ~ "4. 累积方差 > 95%" )
然后用ggplot2分面绘制:
library(ggplot2) ggplot(eig_data, aes(x = comp_num, y = pct_variance)) + geom_bar(stat = "identity", fill = "#2E86AB") + # 添加累积方差标签,方便查看阈值节点 geom_text(aes(label = round(cum_pct, 2)), vjust = -0.3, size = 3) + # 按分组分面,x轴自适应每组的主成分范围 facet_wrap(~group, scales = "free_x") + labs(title = "PCA主成分方差解释率(按累积方差区间分组)", x = "主成分编号", y = "方差解释占比(%)") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
方案2:按主成分数量均分并拼接
如果你更倾向于用factoextra的fviz_eig函数,可以生成多个子图后拼接,同时针对不同区间调整y轴范围,让低方差的主成分细节更清晰:
library(factoextra) library(gridExtra) # 生成各组子图,针对不同区间调整ylim,适配方差占比的量级 p1 <- fviz_eig(PCA_Model_Input_Dataset, addlabels = TRUE, ncp = 20, ylim = c(0, 50)) + ggtitle("主成分 1-20(高方差贡献区)") p2 <- fviz_eig(PCA_Model_Input_Dataset, addlabels = TRUE, ncp = 60, start = 21, ylim = c(0, 5)) + ggtitle("主成分 21-60(中方差贡献区)") p3 <- fviz_eig(PCA_Model_Input_Dataset, addlabels = TRUE, ncp = 100, start = 61, ylim = c(0, 5)) + ggtitle("主成分 61-100(低方差贡献区)") # 聚焦到你关心的95%阈值附近的主成分,放大细节 p4 <- fviz_eig(PCA_Model_Input_Dataset, addlabels = TRUE, ncp = 132, start = 125, ylim = c(0, 1)) + ggtitle("主成分 125-132(接近95%累积方差)") # 拼接4张子图,布局成2行2列 grid.arrange(p1, p2, p3, p4, nrow = 2, ncol = 2)
为什么这么做?
- 前几个主成分方差占比高,用较大的y轴范围可以清晰展示它们的核心贡献
- 后面的主成分方差占比极低,缩小y轴范围后能看清它们的细微差异,尤其是你关注的95%阈值附近的几个主成分(125-132)
- 分组后每个子图的数据点数量适中,不会出现标签重叠、元素拥挤的问题
内容的提问来源于stack exchange,提问作者Edward Muldrew
相关产品推荐
相关产品推荐

