PCA Biplot变量标签自定义及图形样式调整技术求助
PCA Biplot绘制问题解决方案
背景
利用给定实验数据和R代码绘制PCA双图时,遇到两个自定义需求问题:
- 变量标签无法自定义:希望将后缀1/2替换为上标CT/HS,同时保留
Y(II)的原始格式(避免被自动转为Y.II.); - 调整个体文本颜色使其与参数图例颜色一致,同时保留物种图例颜色区分不同物种。
完整修改代码
# 加载依赖包 library(FactoMineR) library(factoextra) library(ggpubr) # 构造实验数据框 data <- data.frame( Genotype = c("BEL", "BGB003", "BGB008", "BGB083", "BGB086", "BGB088", "BGB089"), Species = c("sp1", "sp2", "sp2", "sp3", "sp3", "sp4", "sp4"), SPAD1 = c(0.6, -0.24, -0.54, -1.18, -0.89, -0.4, -0.52), Pn1 = c(14.38, 14.87, 11.92, 6.61, 9.05, 8.75, 9.86), `Y(II)1` = c(0.25, 0.2, 0.14, 0.13, 0.19, 0.15, 0.2), DMC1 = c(0.21, -1.24, -1.24, 0.74, -0.53, -0.39, -0.05), SPAD2 = c(1.64, -0.33, -0.37, -0.04, -0.33, 0.28, 0.47), Pn2 = c(16.5, 16.63, 12.6, 5.41, 11.2, 12.36, 11.06), `Y(II)2` = c(0.29, 0.27, 0.15, 0.16, 0.17, 0.22, 0.19), DMC2 = c(-0.4, -1.24, -0.72, 0.63, -0.28, -0.6, -0.44) ) # 自定义变量列名:替换后缀1/2为上标CT/HS,保留Y(II)格式 colnames(data)[-c(1,2)] <- c( expression(SPAD^CT), expression(Pn^CT), expression(Y(II)^CT), expression(DMC^CT), expression(SPAD^HS), expression(Pn^HS), expression(Y(II)^HS), expression(DMC^HS) ) # 执行PCA(关闭默认绘图) pca <- PCA(data.frame(data[,-2], row.names = 1), ncp=7, graph = FALSE, scale.unit = TRUE) # 定义变量分组 SPAD <- "Chlorophyll Index" IRGA <- "Gas exchange" CF <- "Chlorophyll fluorescence" ag <- "Morphological traits" traits <- factor(c(SPAD,IRGA,CF,ag,SPAD, IRGA,CF,ag)) # 建立物种与参数图例颜色的映射关系 species_color_map <- setNames(c("brown", "purple", "red","blue"), c("sp1", "sp2", "sp3", "sp4")) data$ind_text_color <- species_color_map[data$Species] # 绘制PCA双图 fviz_pca_biplot(pca, geom.ind = c("point","text"), pointshape = 21, pointsize = 2.5, fill.ind = data$Species, # 点填充色对应物种 col.ind = data$ind_text_color, # 个体文本颜色匹配参数图例 col.var = traits, legend.title = list(fill = "Species", color = "Parameters"), label.var = list(parse = TRUE),# 解析表达式,正确显示上标 repel = TRUE )+ ggpubr::fill_palette("cosmic")+ # 物种填充色板 ggpubr::color_palette(c("brown", "purple", "red","blue")) + # 参数变量颜色板 scale_color_manual(values = species_color_map) + # 手动指定个体文本颜色 theme_gray() + theme(legend.position = "right", legend.text = element_text(face="italic"), plot.caption = element_text(hjust = 0), legend.key.size = unit(0.5, 'cm'), legend.background = element_rect(fill='transparent'), panel.background = element_rect(colour = "grey30")) + labs(title = "", x= "PC1 (62.56%)", y= "PC2 (29.10%)", caption = "*1: Control , 2: Heat stress")
问题解决细节
1. 自定义变量标签
- 核心问题:
PCA()函数会自动将列名中的特殊字符(如括号)替换为点,且默认使用原始列名作为变量标签。 - 解决逻辑:
- 在执行PCA前,用
expression()创建带上标的列名,直接保留Y(II)的格式; - 绘图时通过
label.var = list(parse = TRUE)参数,让ggplot解析表达式,正确渲染上标和特殊格式。
- 在执行PCA前,用
2. 个体文本颜色与参数图例匹配
- 核心需求:点填充色保留物种区分(cosmic调色板),个体文本颜色使用参数图例的颜色方案(brown/purple/red/blue)。
- 解决逻辑:
- 手动建立物种与参数颜色的映射关系(
species_color_map); - 在数据框中新增列存储每个个体对应的文本颜色;
- 绘图时通过
col.ind指定文本颜色,并用scale_color_manual()固定颜色映射,确保与参数图例颜色一致。
- 手动建立物种与参数颜色的映射关系(
内容的提问来源于stack exchange,提问作者Ikram Bashir
相关产品推荐
相关产品推荐

