如何在ggtree中按品种分组排布环形进化树节点?
解决ggtree环形进化树节点按品种聚集的问题
问题背景
用ggtree绘制了包含3种植物品种的环形进化树,计划在circos区域添加额外信息,但当前同品种节点相互混杂,尝试group_by和group_split方法未达到预期效果。
图示
- 当前效果图:
- 目标效果图:
核心解决方案
ggtree的环形布局节点顺序由进化树的拓扑结构决定,单纯分组函数无法改变节点位置。要实现同品种节点聚集,需重新调整树的末端节点顺序,再重新绘图。
修改步骤及代码
假设原代码如下:
library(ggtree) library(tidyverse) # 加载数据 tree <- read.tree("tree.nwk") meta_data <- read.csv("meta.csv") # 原绘图代码 ggtree(tree, layout = "circular") + geom_tippoint(aes(color = cultivar)) + geom_facet(panel = "circos", data = meta_data, geom = geom_bar, aes(x = value))
- 按品种排序末端节点并调整树结构
# 匹配末端节点与品种信息 tip_cultivar <- meta_data$cultivar[match(tree$tip.label, meta_data$sample_id)] # 按品种对末端节点排序 sorted_tips <- tree$tip.label[order(tip_cultivar)] # 重新调整树的末端顺序(依赖ape包) sorted_tree <- ape::rotateConstr(tree, sorted_tips)
- 用调整后的树重新绘图
ggtree(sorted_tree, layout = "circular") + geom_tippoint(aes(color = cultivar)) + geom_facet(panel = "circos", data = meta_data, geom = geom_bar, aes(x = value))
补充说明
- 如果
rotateConstr效果不佳,可尝试phytools::rotateNodes手动调整分支,或在构建进化树时直接指定末端节点顺序(若树是自行构建)。 - 确保meta_data中
sample_id与树的tip.label完全匹配,否则会出现匹配错误。
内容的提问来源于stack exchange,提问作者Matteo
相关产品推荐
相关产品推荐

