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

如何在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))
  1. 按品种排序末端节点并调整树结构
# 匹配末端节点与品种信息
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)
  1. 用调整后的树重新绘图
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:20:54