基于PCA的HCPC树状图与聚类分析结果为何存在差异?
层次聚类树状图与散点聚类结果不一致的问题
我有34个样地的7变量数据,希望通过聚类分析划分亚组。先完成主成分分析(PCA),再基于主成分开展层次聚类,但生成的树状图与聚类散点图分组结果存在差异——例如树状图中第3类包含4个样地,而聚类分析结果里第3类有6个样地,我原本预期两者完全一致。

用到的R代码
加载依赖包
library(vegan) library(writexl) library(corrplot) library(ggplot2) library(ggrepel) library(RColorBrewer) library(devtools) devtools::install_github("cmartin/ggConvexHull") library(factoextra) library(FactoMineR) library(ggConvexHull) library(dplyr) library(tidyverse) library(RColorBrewer) library(viridis)
数据导入与分析流程
# 读取数据 Cluster <- read.csv('Data.csv', sep = ';') # 执行PCA,保留4个主成分 res.pca <- PCA(Cluster, scale.unit = TRUE, ncp = 4, graph = FALSE) # 基于PCA结果做层次聚类 res.hcpc <- HCPC(res.pca, graph = F)
可视化代码
# 绘制树状图 factoextra::fviz_dend(res.hcpc, cex = 0.7, # 标签大小 palette = c("gold1", "chartreuse4","sienna3"), show_labels = T, rect = TRUE, rect_fill = TRUE, # 为分组添加矩形框 rect_border = c("gold1", "chartreuse4","sienna3"), # 矩形框颜色 labels_track_height = 0.8, # 增加标签空间 )
# 绘制聚类散点图 fviz_cluster(res.hcpc, #repel = TRUE, # 避免标签重叠 show.clust.cent = TRUE, # 显示聚类中心 geom = c("point", "text"), #palette = "jco", palette = c("gold1","sienna3", "chartreuse4"), ggtheme = theme_minimal(), )
问题原因与解决办法
核心原因
- 调色板顺序不匹配:你在
fviz_dend和fviz_cluster中使用的调色板顺序不一致,这会直接导致颜色对应的分组错位,误以为分组数量不同。 - 聚类维度差异:
HCPC()默认基于所有主成分构建层次聚类树,但fviz_cluster仅展示前2个主成分空间下的分组;同时函数内部可能会对层次聚类结果做微调,以优化低维空间内的分组紧凑性,最终导致两个图的显示差异。
解决步骤
- 统一调色板顺序:将两个可视化函数的
palette参数设置为完全一致的顺序,比如都用c("gold1", "chartreuse4","sienna3"),先排除颜色错位导致的误解。 - 固定聚类数量:调用
HCPC()时指定nb.clust参数固定聚类数,例如res.hcpc <- HCPC(res.pca, graph = F, nb.clust = 3),避免函数自动调整分组。 - 对齐聚类维度:用
fviz_dend时指定axes参数,让树状图基于前两个主成分的聚类结果,例如fviz_dend(res.hcpc, axes = c(1,2), ...),确保与散点图的维度一致。 - 查看原始聚类结果:直接查看
res.hcpc$data.clust,这里存储了每个样地的最终分组标签,对比这个结果和两个图的显示,就能快速定位问题所在。
内容的提问来源于stack exchange,提问作者Steffi
相关产品推荐
相关产品推荐

