如何在PCA聚类图中添加聚类到中心点的连接线?
给PCA聚类图添加样本到中心的连接线
1. 提取PCA坐标与聚类中心
先从PCA结果中提取样本的主成分坐标,再按物种分组计算每个类别的中心坐标:
library(factoextra) library(ggplot2) library(dplyr) data(iris) res.pca <- prcomp(iris[,-5], scale=TRUE) # 提取样本的前两个主成分坐标 pca_coords <- as.data.frame(res.pca$x[,1:2]) %>% mutate(Species = iris$Species) # 计算每个物种的PCA中心坐标 centroids <- pca_coords %>% group_by(Species) %>% summarise(PC1 = mean(PC1), PC2 = mean(PC2))
2. 绘制带连接线的PCA图
直接用ggplot2构建图表,依次添加连接线、样本点和聚类椭圆:
ggplot() + # 绘制样本到对应聚类中心的连接线 geom_segment(data = pca_coords, aes(x = PC1, y = PC2, xend = centroids$PC1[match(Species, centroids$Species)], yend = centroids$PC2[match(Species, centroids$Species)], color = Species), alpha = 0.3) + # 绘制样本点 geom_point(data = pca_coords, aes(x = PC1, y = PC2, color = Species), shape = 19, alpha = 1) + # 添加95%置信椭圆 stat_ellipse(data = pca_coords, aes(x = PC1, y = PC2, color = Species), level = 0.95) + # 匹配factoextra的简洁风格 theme_minimal() + labs(x = "PC1", y = "PC2", color = "Species")
用ggforce实现连接线
如果想用ggforce包,替换geom_segment为geom_link即可(静态图效果一致,支持动态过渡):
library(ggforce) ggplot() + geom_link(data = pca_coords, aes(x = PC1, y = PC2, xend = centroids$PC1[match(Species, centroids$Species)], yend = centroids$PC2[match(Species, centroids$Species)], color = Species), alpha = 0.3, linewidth = 0.5) + geom_point(data = pca_coords, aes(x = PC1, y = PC2, color = Species), shape = 19, alpha = 1) + stat_ellipse(data = pca_coords, aes(x = PC1, y = PC2, color = Species), level = 0.95) + theme_minimal() + labs(x = "PC1", y = "PC2", color = "Species")
注意事项
- 连接线透明度设为0.3是为了避免线条密集遮挡样本点,可根据需求调整
alpha值。 stat_ellipse和factoextra的addEllipses逻辑一致,都是基于多元正态分布生成95%置信椭圆。- 直接用ggplot2构建图表比修改factoextra生成的对象更灵活,便于自定义扩展。
内容的提问来源于stack exchange,提问作者dkcongo
相关产品推荐
相关产品推荐

