如何用ggtree为系统发育树内部节点标注SHaLRT/UFBoot值及设置节点样式
解决ggtree标注IQTree节点支持值及节点样式分类问题
1. 标注内部节点的UFBoot/SHaLRT支持值
IQTree输出的树文件中,node.label已存储UFBoot/SHaLRT格式的支持值,直接调用该字段即可完成标注——你之前报错“标签与节点长度不匹配”,是因为错误使用node作为标签字段,而非node.label。示例代码:
library(ggtree) # 读取IQTree生成的树文件(替换为你的树文件路径) tree <- read.tree("treefile.treefile") # 基础树图(保留你已有的末端上色逻辑) p <- ggtree(tree) + geom_tippoint(aes(color=group), size=3) + # 替换为你按物种类别上色的代码 theme_tree2() # 添加内部节点支持值标注 p + geom_text2(aes(subset=!isTip, label=node.label), hjust=-.3, size=3)
subset=!isTip确保仅给内部节点添加标签hjust=-.3让标签远离节点避免重叠,可根据树的疏密调整数值
2. 按支持值阈值设置节点样式分类
需先拆分node.label中的两个支持值,转换为数值后判断节点类别,再用geom_nodepoint设置不同样式:
# 1. 将树转换为数据框,方便处理节点属性 tree_data <- fortify(tree) # 拆分内部节点的支持值为UFBoot和SHaLRT数值列 internal_nodes <- !tree_data$isTip tree_data$ufboot[internal_nodes] <- as.numeric(sapply(tree_data$node.label[internal_nodes], function(x) strsplit(x, "/")[[1]][1])) tree_data$shalrt[internal_nodes] <- as.numeric(sapply(tree_data$node.label[internal_nodes], function(x) strsplit(x, "/")[[1]][2])) # 2. 定义支持值阈值(可按需调整) uf_thresh <- 90 shalrt_thresh <- 80 # 3. 为内部节点分配类别 tree_data$node_class <- NA tree_data$node_class[internal_nodes] <- case_when( tree_data$ufboot >= uf_thresh & tree_data$shalrt >= shalrt_thresh ~ "both_pass", tree_data$ufboot >= uf_thresh | tree_data$shalrt >= shalrt_thresh ~ "one_pass", TRUE ~ "none_pass" ) # 4. 绘制带节点分类的树图 ggtree(tree_data) + geom_tippoint(aes(color=group), size=3) + # 保留你的末端上色代码 geom_nodepoint(aes(subset=!isTip, shape=node_class, fill=node_class), size=3) + # 设置节点样式:空心圆=双值均未达标,灰色实心=单值达标,黑色实心=双值达标 scale_shape_manual(values=c("none_pass"=21, "one_pass"=21, "both_pass"=21)) + scale_fill_manual(values=c("none_pass"="white", "one_pass"="gray50", "both_pass"="black")) + theme_tree2() + guides(shape=FALSE, fill=FALSE) # 不需要图例可添加此行
shape=21是带填充色的圆形,通过fill参数控制内部颜色实现不同样式- 若你的
node.label格式非严格数字/数字,可先做格式清洗(如去除多余字符)再拆分
内容的提问来源于stack exchange,提问作者Metin Gabriel Davutoglu
相关产品推荐
相关产品推荐

