You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PCA Biplot变量标签自定义及图形样式调整技术求助

PCA Biplot绘制问题解决方案

背景

利用给定实验数据和R代码绘制PCA双图时,遇到两个自定义需求问题:

  1. 变量标签无法自定义:希望将后缀1/2替换为上标CT/HS,同时保留Y(II)的原始格式(避免被自动转为Y.II.);
  2. 调整个体文本颜色使其与参数图例颜色一致,同时保留物种图例颜色区分不同物种。

完整修改代码

# 加载依赖包
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()函数会自动将列名中的特殊字符(如括号)替换为点,且默认使用原始列名作为变量标签。
  • 解决逻辑:
    1. 在执行PCA前,用expression()创建带上标的列名,直接保留Y(II)的格式;
    2. 绘图时通过label.var = list(parse = TRUE)参数,让ggplot解析表达式,正确渲染上标和特殊格式。

2. 个体文本颜色与参数图例匹配

  • 核心需求:点填充色保留物种区分(cosmic调色板),个体文本颜色使用参数图例的颜色方案(brown/purple/red/blue)。
  • 解决逻辑:
    1. 手动建立物种与参数颜色的映射关系(species_color_map);
    2. 在数据框中新增列存储每个个体对应的文本颜色;
    3. 绘图时通过col.ind指定文本颜色,并用scale_color_manual()固定颜色映射,确保与参数图例颜色一致。

内容的提问来源于stack exchange,提问作者Ikram Bashir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:04:59