You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在R语言ggtree中为进化树添加带颜色与文本的表格注释?

我懂你现在的需求——给进化树旁边加个对齐的注释表格,既要显示文本内容,还得对应不同的颜色。刚好ggtree有现成的工具能搞定,我基于你现有的代码给你完整的解决方案:

解决步骤

首先确保你加载了所需的包(除了你已经加载的,额外加个tidyr用来整理数据):

library("ggtree")
library("ggplot2")
library("phytools")
library("tidyr") # 用于整理注释数据格式

先读取并绘制你的进化树(和你原代码一致):

tree2 <- read.newick(text="(A,((B,((C,D),E)),(F,G)));")
tree_fig <- ggtree(tree2, branch.length = "none") + geom_tiplab()

下面给你两种实现方式,你可以根据自己的需求选择:

方法1:用gheatmap快速添加带颜色的注释表格

这个方法适合简单的注释场景,直接把注释数据转换成热图形式的表格,和树自动对齐:

  1. 准备注释数据框,必须保证行名和进化树的tip标签完全一致,这样才能精准匹配:
# 创建包含分组、性状的注释数据
anno_df <- data.frame(
  Group = c("Group1", "Group2", "Group2", "Group2", "Group2", "Group3", "Group3"),
  Trait = c("TraitX", "TraitY", "TraitY", "TraitY", "TraitZ", "TraitX", "TraitX"),
  row.names = c("A", "B", "C", "D", "E", "F", "G") # 行名对应进化树的tip标签
)
  1. 将注释表格添加到进化树右侧:
p <- tree_fig + 
  gheatmap(anno_df, 
           offset = 0.5, # 控制表格和树之间的间隔距离
           width = 0.2, # 调整表格的宽度
           colnames_position = "top", # 把注释列名放在表格顶部
           colnames_angle = 45) + # 列名倾斜45度避免重叠
  # 自定义颜色映射,把每个分组/性状对应到你想要的颜色
  scale_fill_manual(values = c(
    Group1 = "#FF9999", Group2 = "#99CCFF", Group3 = "#99FF99",
    TraitX = "#FFCC66", TraitY = "#CC99FF", TraitZ = "#FF6666"
  )) +
  theme(legend.position = "right") # 把图例放在右侧

方法2:用facet_plot添加带文本的注释表格(更灵活)

如果需要在颜色块上直接显示文本内容,用分面的方式更灵活,能完全自定义样式:

  1. 把注释数据整理成长格式(方便后续绘图):
anno_long <- data.frame(
  Tip = c("A", "B", "C", "D", "E", "F", "G"),
  Group = c("Group1", "Group2", "Group2", "Group2", "Group2", "Group3", "Group3"),
  Trait = c("TraitX", "TraitY", "TraitY", "TraitY", "TraitZ", "TraitX", "TraitX")
) %>% 
  pivot_longer(cols = -Tip, names_to = "Category", values_to = "Value")
  1. 定义注释部分的绘图函数,控制颜色块、文本样式:
anno_plot <- function(data) {
  ggplot(data, aes(x = Category, y = Tip, fill = Value)) +
    geom_tile(color = "white") + # 带白色边框的颜色块
    geom_text(aes(label = Value), color = "black", size = 3) + # 在颜色块上显示文本内容
    scale_fill_manual(values = c(
      Group1 = "#FF9999", Group2 = "#99CCFF", Group3 = "#99FF99",
      TraitX = "#FFCC66", TraitY = "#CC99FF", TraitZ = "#FF6666"
    )) +
    theme(
      axis.title = element_blank(),
      axis.text.y = element_blank(), # 隐藏y轴文本(和树的tip标签对齐,不需要重复显示)
      axis.ticks.y = element_blank(),
      panel.background = element_blank()
    )
}
  1. 将注释表格作为分面添加到进化树右侧:
p <- tree_fig + 
  facet_plot(
    panel = "Annotations", # 分面的标题
    data = anno_long,
    geom = anno_plot,
    width = 0.8 # 调整注释表格的宽度
  )

最后运行plot(p)就能看到你想要的效果啦,两种方法都能实现注释表格和进化树的对齐,同时包含颜色和文本内容。

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

火山引擎 最新活动