如何使用gghighlight在PCA图中选中特定组并保留时间相关的颜色渐变效果
如何使用gghighlight在PCA图中选中特定组并保留时间相关的颜色渐变效果
从你的描述和数据来看,核心需求是让PCA点的颜色随年份(早深晚浅)渐变,同时突出显示某一个分组(比如Honey)。你之前的问题主要是颜色映射的方向不对(之前把color设为分组列Trib,而非时间变量Year),再加上gghighlight和autoplot的图层兼容问题,导致效果不符合预期。下面给你两个可行的解决方案:
前置准备:数据预处理
首先确保Year是数值型变量,这样才能生成连续的颜色渐变:
# 转换Year为数值型(如果原本是字符型的话) Trsfmd$Year <- as.numeric(Trsfmd$Year) # 重新计算PCA(如果之前的PCA是基于正确列的话可以跳过) AllPCA <- prcomp(Trsfmd[,c(7:14)], scale=TRUE, center = TRUE)
方案1:用gghighlight快速实现(简洁高效)
直接在autoplot中将颜色映射到Year实现渐变,再用gghighlight突出目标分组,同时淡化其他组:
library(ggfortify) library(gghighlight) library(ggplot2) autoplot(AllPCA, data = Trsfmd, color = "Year", # 颜色随年份渐变,核心调整! loadings = TRUE, loadings.label = TRUE, label = TRUE, label.label = "Year", label.repel = TRUE) + theme_bw() + # 突出指定分组(比如Honey),设置其他组为灰色半透明 gghighlight(Trib == "Honey", unhighlighted_params = list(color = "grey70", alpha = 0.5)) + # 调整渐变配色:早年份深色,晚年份浅色(direction=-1反转默认渐变方向) scale_color_viridis_c(option = "plasma", direction = -1) + labs(color = "Year")
效果说明:
- 目标分组(Honey)的点会保留
Year对应的颜色渐变 - 其他分组的点会变成灰色半透明,作为背景衬托
- 载荷、年份标签等元素会正常保留
方案2:分层绘图(更灵活,兼容复杂需求)
如果gghighlight和autoplot的图层出现冲突,你可以手动拆分图层:先画所有组的灰色背景点,再叠加目标组的彩色渐变点,完全自定义每个图层的样式:
library(ggfortify) library(ggplot2) library(dplyr) # 提取PCA得分并合并原数据的分组/年份信息 pca_scores <- as.data.frame(AllPCA$x) %>% cbind(Trsfmd[, c("Year", "Trib", "Name")]) # 手动构建PCA图 ggplot(pca_scores, aes(x = PC1, y = PC2)) + # 第一步:画所有组的背景点(灰色半透明) geom_point(aes(group = Trib), color = "grey70", alpha = 0.5) + # 第二步:画目标分组的彩色渐变点(尺寸放大更突出) geom_point(data = subset(pca_scores, Trib == "Honey"), aes(color = Year), size = 2.5) + # 第三步:添加载荷向量和标签(和autoplot效果一致) geom_segment(data = as.data.frame(AllPCA$rotation) %>% rownames_to_column("variable") %>% mutate(PC1 = PC1 * 10, PC2 = PC2 * 10), # 缩放载荷到合适显示比例 aes(x = 0, xend = PC1, y = 0, yend = PC2), arrow = arrow(length = unit(0.2, "cm")), color = "darkred") + geom_text(data = as.data.frame(AllPCA$rotation) %>% rownames_to_column("variable") %>% mutate(PC1 = PC1 * 12, PC2 = PC2 * 12), aes(label = variable), color = "darkred", size = 3.5) + # 调整年份渐变配色(早深晚浅) scale_color_viridis_c(option = "plasma", direction = -1) + theme_bw() + labs(color = "Year") + # 可选:给目标分组添加年份标签 geom_text_repel(data = subset(pca_scores, Trib == "Honey"), aes(label = Year), size = 3, nudge_x = 0.2)
优势:
- 完全控制每个图层的样式(比如背景点的透明度、目标点的尺寸)
- 避免
autoplot和gghighlight的图层冲突问题 - 可自由扩展添加其他元素(比如分组标签、自定义载荷样式)
你之前尝试失败的原因
- 颜色映射错误:之前把
color设为Trib(分组列),导致颜色是离散的分组色,无法实现时间渐变 scale_color_manual是针对离散变量的,无法适配连续的年份渐变需求
内容来源于stack exchange




