在R中绘制系统发育树时遇'tree badly conformed'错误的解决求助
解决R绘制系统发育树时"tree badly conformed; cannot plot. Check the edge matrix"错误
问题原因
你遇到的错误核心是修改tip.label后,新标签的数量与系统发育树实际末端节点数不匹配。原代码中seq(1,54,by=2)是硬编码的固定长度,但从Open Tree of Life获取的子树经过is_in_tree筛选后,实际末端节点数可能不是27(54/2),导致树结构和标签数组长度不一致,触发报错。同时,用substr截取再分割的方式也容易破坏标签对应关系。
解决方法
1. 确保标签数量与末端节点数一致
先获取树的实际末端节点数,再基于该数量处理标签,避免硬编码:
# 获取实际末端节点数 tip_count <- Ntip(phyl_tree)
2. 用原始分类群名称生成发表级标签
直接用你最初定义的taxa列表,结合resolved_names的匹配结果,把树的tip标签替换为需要的正式名称,准确性更高:
# 创建OTT ID到原始taxa名称的映射 name_map <- setNames(resolved_names$unique_name, resolved_names$ott_id) # 提取每个tip的OTT编号,匹配到原始分类群名称 phyl_tree$tip.label <- sapply(phyl_tree$tip.label, function(x) { ott_id <- gsub("ott([0-9]+)", "\\1", x) # 从默认标签中提取OTT编号 name_map[[ott_id]] # 匹配对应的原始分类群名称 })
3. 简化标签处理(若仅需下划线前的内容)
如果你确实想保留OTT标签的前缀部分,用安全方式逐个处理标签,确保数量一致:
# 对每个tip标签提取下划线前的内容 phyl_tree$tip.label <- sapply(phyl_tree$tip.label, function(x) { strsplit(x, "_")[[1]][1] })
完整修正后的代码
library(rncl) library(rotl) taxa <- c("Gastrotricha","Platyhelminthes", "Ectoprocta","Brachiopoda","Nemertea", "Mollusca","Annelida","Entoprocta", "Cycliophora","Mesozoa","Rotifera", "Gnathostenetroididae","Micrognathozoa", "Chaetognatha","Kinorhyncha", "Priapulida","Loricifera","Nematoda", "Nematomorpha","Tardigrada", "Onychophora","Arthropoda","Vertebrata", "rochordata","Cephalochordata", "Hemichordata","Echinodermata", "Xenacoelomorpha", "Cnidaria", "Ctenophora", "Placozoa","Porifera") resolved_names <- tnrs_match_names(taxa) # 筛选出在树中的有效OTT ID valid_ott_ids <- ott_id(resolved_names)[is_in_tree(resolved_names)] phyl_tree <- tol_induced_subtree(ott_ids = valid_ott_ids) # 替换为原始分类群名称 name_map <- setNames(resolved_names$unique_name, resolved_names$ott_id) phyl_tree$tip.label <- sapply(phyl_tree$tip.label, function(x) { ott_id <- gsub("ott([0-9]+)", "\\1", x) name_map[[ott_id]] }) # 绘制树 plot(phyl_tree, cex = .8, label.offset = .1, no.margin = TRUE)
额外优化建议
- 检查
resolved_names的匹配结果,确保分类群没有匹配错误,避免标签混乱。 - 若需要更精细化的发表级树样式,可使用
ggtree包,支持灵活的标签调整和美化:
library(ggtree) ggtree(phyl_tree) + geom_tiplab(size = 3, offset = 0.1) + theme_tree2()
内容的提问来源于stack exchange,提问作者Mustal
相关产品推荐
相关产品推荐

