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

如何在ggtree中基于样本位置添加geom_cladelab与外部strip?

解决ggtree环形图添加位置外部Strip与同色内部Cladelab的问题

步骤1:数据准备与树对象构建

适配你提供的6样本场景,基础数据与树构建代码如下:

library(ggtree)
library(ggplot2)
library(ape)
library(dplyr)

# 6样本IBS矩阵
ibs_matrix <- matrix(c(0,0.1,0.2,0.5,0.6,0.7,
                       0.1,0,0.15,0.55,0.65,0.75,
                       0.2,0.15,0,0.4,0.5,0.6,
                       0.5,0.55,0.4,0,0.1,0.2,
                       0.6,0.65,0.5,0.1,0,0.15,
                       0.7,0.75,0.6,0.2,0.15,0),
                     nrow=6, dimnames=list(c("A1","A2","B1","B2","C1","C2"),
                                           c("A1","A2","B1","B2","C1","C2")))

# 样本注释:品种、采集位置
sample_info <- data.frame(
  sample = c("A1","A2","B1","B2","C1","C2"),
  cultivar = c("CultivarA","CultivarA","CultivarB","CultivarB","CultivarC","CultivarC"),
  location = c("Loc1","Loc1","Loc2","Loc2","Loc3","Loc3")
)

# 构建NJ树并关联注释数据
dist_mat <- as.dist(ibs_matrix)
tree <- nj(dist_mat)
tree <- full_join(tree, sample_info, by=c("label"="sample"))

步骤2:绘制基础环形图(按品种着色)

# 基础环形树:分支、末端标签按品种着色
p <- ggtree(tree, layout="circular", aes(color=cultivar)) +
  geom_tiplab(aes(color=cultivar), offset=0.05, size=3)

步骤3:添加外部采集位置Strip

先扩展x轴空间,再绘制带背景的位置标签:

# 获取树的最大深度,扩展x轴预留外部Strip空间
max_depth <- max(node.depth.edgelength(tree))
p <- p + xlim(0, max_depth + 0.3)

# 计算每个采集位置对应的tip节点范围,绘制背景条
location_y <- sample_info %>% 
  group_by(location) %>% 
  summarise(y_min = min(node), y_max = max(node))

p <- p + geom_rect(data=location_y, 
                   aes(xmin=max_depth + 0.1, xmax=max_depth + 0.2, 
                       ymin=y_min - 0.2, ymax=y_max + 0.2),
                   inherit.aes=FALSE, fill="gray90", color="white") +
  # 添加位置文本标签
  geom_text(data=sample_info, 
            aes(x=max_depth + 0.15, y=node, label=location), 
            inherit.aes=FALSE, color="black", size=3)

步骤4:添加内部同色品种Cladelab

找到每个品种分支的最近共同祖先(MRCA)节点,再绘制对应颜色的Cladelab:

# 定义函数:获取指定品种的MRCA节点
get_mrca_node <- function(tree, cultivar_name) {
  tips <- sample_info$sample[sample_info$cultivar == cultivar_name]
  mrca(tree, tips)
}

# 生成每个品种的MRCA节点数据框
cultivar_nodes <- data.frame(
  cultivar = unique(sample_info$cultivar),
  node = sapply(unique(sample_info$cultivar), function(x) get_mrca_node(tree, x))
)

# 添加同色Cladelab
p <- p + geom_cladelab(data=cultivar_nodes, 
                       aes(node=node, label=cultivar, color=cultivar),
                       offset=0.05, align=TRUE, barsize=1, fontsize=3)

最终输出

直接调用p即可得到目标环形图:

p

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:25:56