基于Treatment和Variety分组的PCA双图绘制技术求助
解决方案
1. 修正PCA数据预处理
PCA分析仅需数值型观测变量(如示例中的ARI、NDVI_1等30个指标),需排除所有分类/标识列(Treatment、Variety、Rep),而非仅删除Treatment:
# 提取数值型变量列(假设前3列为分类/标识列,后续为观测变量) pca_data <- all.data[, -c(1:3)] # 执行PCA并标准化数据 res.pca <- prcomp(pca_data, scale. = TRUE)
2. 实现两层分组的PCA双图
fviz_pca_biplot的habillage仅支持单一分组维度,要同时用颜色区分Treatment、形状区分Variety,可通过以下两种方式实现:
方法一:直接扩展fviz_pca_biplot参数
library(factoextra) library(ggplot2) fviz_pca_biplot(res.pca, label = "var", # 仅显示变量标签 repel = TRUE, # 避免标签重叠 # 映射样本点属性:颜色绑定Treatment,形状绑定Variety point.params = list(aes(color = all.data$Treatment, shape = all.data$Variety)), # 按Treatment分组添加95%置信椭圆 addEllipses = TRUE, ellipse.level = 0.95, ellipse.group = all.data$Treatment, ggtheme = theme_minimal()) + # 自定义配色与图例名称(可选) scale_color_brewer(palette = "Set1") + labs(color = "处理(Treatment)", shape = "品种(Variety)")
方法二:拆分样本与变量图层(更灵活)
若需精细化控制,可分别绘制样本点和变量箭头后组合:
# 绘制样本点图层:颜色区分Treatment,形状区分Variety,添加Treatment分组椭圆 p_ind <- fviz_pca_ind(res.pca, geom = "point", aes(color = all.data$Treatment, shape = all.data$Variety), addEllipses = TRUE, ellipse.level = 0.95, ellipse.group = all.data$Treatment, show.legend = FALSE) # 绘制变量箭头图层 p_var <- fviz_pca_var(res.pca, geom = "arrow", repel = TRUE, show.legend = FALSE) # 组合图层并优化样式 p_ind + p_var + scale_color_brewer(palette = "Set1") + labs(color = "处理(Treatment)", shape = "品种(Variety)") + theme_minimal() + theme(legend.position = "bottom")
关键注意事项
- 务必保证PCA输入为纯数值型变量,分类列和重复编号列不能纳入分析,否则会导致PCA结果失真。
- 若Variety为数值格式(如示例中的"5""7"),需先转换为因子:
all.data$Variety <- as.factor(all.data$Variety),避免形状被识别为连续变量。 ellipse.group可单独指定椭圆的分组维度,实现椭圆与样本点属性的分层控制。
内容的提问来源于stack exchange,提问作者Aria P.
相关产品推荐
相关产品推荐

