You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用gghighlight在PCA图中选中特定组并保留时间相关的颜色渐变效果

如何使用gghighlight在PCA图中选中特定组并保留时间相关的颜色渐变效果

从你的描述和数据来看,核心需求是让PCA点的颜色随年份(早深晚浅)渐变,同时突出显示某一个分组(比如Honey)。你之前的问题主要是颜色映射的方向不对(之前把color设为分组列Trib,而非时间变量Year),再加上gghighlightautoplot的图层兼容问题,导致效果不符合预期。下面给你两个可行的解决方案:


前置准备:数据预处理

首先确保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:分层绘图(更灵活,兼容复杂需求)

如果gghighlightautoplot的图层出现冲突,你可以手动拆分图层:先画所有组的灰色背景点,再叠加目标组的彩色渐变点,完全自定义每个图层的样式:

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)

优势:

  • 完全控制每个图层的样式(比如背景点的透明度、目标点的尺寸)
  • 避免autoplotgghighlight的图层冲突问题
  • 可自由扩展添加其他元素(比如分组标签、自定义载荷样式)

你之前尝试失败的原因

  1. 颜色映射错误:之前把color设为Trib(分组列),导致颜色是离散的分组色,无法实现时间渐变
  2. scale_color_manual是针对离散变量的,无法适配连续的年份渐变需求

内容来源于stack exchange

火山引擎 最新活动