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

如何在ggplot2的PCA图中添加箭头及标签并按分组着色

解决PCA图添加箭头及标签的方法

核心思路

借助ggplot2的geom_segment()绘制箭头,搭配geom_text()或geom_label()添加标签,直接调用你已有的箭头PC分数数据即可实现,逻辑和NMDS图加箭头一致。

具体实现步骤

假设你的箭头数据框为arrow_data,包含PC1(箭头PC1轴坐标)、PC2(箭头PC2轴坐标)、feature(箭头对应特征标签);散点数据框为pca_scatter,包含PC1、PC2、organ(分组变量)。

1. 保留已有的分组散点图

先沿用你写好的基础PCA散点图代码:

library(ggplot2)

# 基础分组着色PCA散点图
p <- ggplot(pca_scatter, aes(x = PC1, y = PC2, color = organ)) +
  geom_point(size = 3) +
  theme_bw() +
  labs(x = paste0("PC1 (", 你的PC1解释率, "%)"), 
       y = paste0("PC2 (", 你的PC2解释率, "%)"))

2. 添加箭头

用geom_segment()从原点(0,0)绘制箭头到对应PC坐标,通过arrow()参数设置箭头样式:

p <- p +
  geom_segment(data = arrow_data, 
               aes(x = 0, xend = PC1, y = 0, yend = PC2),
               color = "darkgray", 
               arrow = arrow(length = unit(0.2, "cm")))

3. 添加箭头标签

用geom_text()把特征标签放在箭头终点外侧,调整系数避免遮挡:

p <- p +
  geom_text(data = arrow_data, 
            aes(x = PC1 * 1.1, y = PC2 * 1.1, label = feature),
            color = "black", 
            size = 4)

注:乘以1.1是让标签远离箭头终点,可根据实际布局调整系数

4. 完整示例代码

如果你的数据格式匹配,完整代码如下:

library(ggplot2)

# 替换为你的实际散点数据
pca_scatter <- data.frame(
  PC1 = rnorm(50),
  PC2 = rnorm(50),
  organ = sample(c("Liver", "Kidney", "Heart"), 50, replace = TRUE)
)

# 替换为你的实际箭头数据
arrow_data <- data.frame(
  PC1 = c(0.8, 0.6, -0.7, -0.5),
  PC2 = c(0.5, -0.6, 0.4, -0.3),
  feature = c("GeneA", "GeneB", "MetabC", "MetabD")
)

# 绘制带箭头和标签的PCA图
ggplot(pca_scatter, aes(x = PC1, y = PC2, color = organ)) +
  geom_point(size = 3) +
  geom_segment(data = arrow_data, 
               aes(x = 0, xend = PC1, y = 0, yend = PC2),
               color = "darkgray", 
               arrow = arrow(length = unit(0.2, "cm"))) +
  geom_text(data = arrow_data, 
            aes(x = PC1 * 1.1, y = PC2 * 1.1, label = feature),
            color = "black", 
            size = 4) +
  theme_bw() +
  labs(x = "PC1 (40%)", y = "PC2 (25%)")

额外优化建议

  • 若箭头标签重叠,可使用ggrepel包的geom_text_repel()自动调整标签位置:
library(ggrepel)
p <- p + geom_text_repel(data = arrow_data, 
                         aes(x = PC1 * 1.1, y = PC2 * 1.1, label = feature),
                         color = "black", size = 4)
  • 调整arrow()的type参数可改变箭头样式,比如type = "closed"绘制实心箭头。

内容的提问来源于stack exchange,提问作者Nadiine El Nino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:45:15