如何在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
相关产品推荐
相关产品推荐

