R语言Momocs包默认PCA绘图如何移除样本点后的彩色分组框
Momocs包PCA图移除分组彩色凸包的调整方法
- 查看默认绘图源码:直接在R控制台运行
getAnywhere(plot.PCA)即可调出完整的PCA绘图函数源码,你提到的样本点后方彩色分组框,是源码中通过chull()计算每组样本凸包边界、再调用polygon()绘制的半透明填充色块,当分组数超过15个时凸包互相重叠确实会严重影响可读性。 - 无需修改源码,直接调整plot参数即可关闭彩色分组框:你当前调用的
plot(lo.p, ~pop)默认开启了凸包绘制,传入chull = FALSE就能直接移除所有彩色背景框,同时可以替换为更清爽的分组展示样式,参考代码如下:
# 修正原efourier代码末尾多输入的多余字符e lo.f <- efourier(lo, 12) lo.p <- PCA(lo.f, fac = pop) # 无凸包的清爽版PCA绘图 plot(lo.p, ~pop, chull = FALSE, # 核心参数:关闭分组彩色凸包框 points.col = "#333333", # 样本点统一用深灰色,降低视觉干扰 group.col = hcl.colors(20, "Set3"), # 给20个种群分配区分度足够的柔和配色 ellipses = TRUE, # 替换为95%置信椭圆展示各组分布范围,比凸包整洁 ellipses.lty = 1, ellipses.alpha = 0.2, legend = TRUE )
- 如果需要更高的自定义自由度,可以直接提取PCA结果坐标用ggplot2绘制,完全控制所有展示元素:
# 提取主成分得分、分组信息、方差解释率 pca_res <- data.frame( PC1 = lo.p$x[,1], PC2 = lo.p$x[,2], pop = lo.p$fac$pop ) eig1 <- round(lo.p$eig[1]/sum(lo.p$eig)*100, 1) eig2 <- round(lo.p$eig[2]/sum(lo.p$eig)*100, 1) # 自定义绘图 library(ggplot2) ggplot(pca_res, aes(PC1, PC2, color = pop, shape = pop)) + geom_point(size = 1.8, alpha = 0.8) + # 不需要分组边界就删掉下一行stat_ellipse stat_ellipse(level = 0.95, linewidth = 0.7, alpha = 0.6) + theme_classic() + labs(x = paste0("PC1 (", eig1, "%)"), y = paste0("PC2 (", eig2, "%)"))
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

