如何在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快速添加带颜色的注释表格
这个方法适合简单的注释场景,直接把注释数据转换成热图形式的表格,和树自动对齐:
- 准备注释数据框,必须保证行名和进化树的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标签 )
- 将注释表格添加到进化树右侧:
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添加带文本的注释表格(更灵活)
如果需要在颜色块上直接显示文本内容,用分面的方式更灵活,能完全自定义样式:
- 把注释数据整理成长格式(方便后续绘图):
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")
- 定义注释部分的绘图函数,控制颜色块、文本样式:
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() ) }
- 将注释表格作为分面添加到进化树右侧:
p <- tree_fig + facet_plot( panel = "Annotations", # 分面的标题 data = anno_long, geom = anno_plot, width = 0.8 # 调整注释表格的宽度 )
最后运行plot(p)就能看到你想要的效果啦,两种方法都能实现注释表格和进化树的对齐,同时包含颜色和文本内容。
内容的提问来源于stack exchange,提问作者bmv




