phylobase含性状系统发育树存贮及绘图问题求助
解决phylobase带性状树的保存与绘图问题
一、保留性状数据的树保存方案
phylobase的phylo4d对象包含额外性状,直接用ape的write.nexus/write.tree会丢失性状,推荐两种稳妥方法:
1. 保存为R原生格式(最简便)
直接把phylo4d对象存成RData文件,完全保留所有数据:
# 假设你的无根树对象是phylo4d_unrooted save(phylo4d_unrooted, file = "unrooted_tree_with_traits.RData") # 需要时加载 load("unrooted_tree_with_traits.RData")
2. 手动导出带性状的Nexus文件
phylobase没有原生导出带性状Nexus的函数,可手动拼接树结构和性状矩阵:
library(phylobase) library(ape) # 导出无根树的Newick字符串 tree_newick <- write.tree(as(phylo4d_unrooted, "phylo")) # 提取性状数据(默认存在@data中) traits_df <- data.frame(tipLabels(phylo4d_unrooted), phylo4d_unrooted@data) colnames(traits_df)[1] <- "taxon" # 拼接完整Nexus内容 nexus_content <- paste0( "#NEXUS\n", "BEGIN TREES;\n", "\tTREE unrooted = [&U] ", tree_newick, ";\n", "END;\n", "BEGIN DATA;\n", "\tDIMENSIONS NTAX=", nrow(traits_df), " NCHAR=", ncol(traits_df)-1, ";\n", "\tFORMAT DATATYPE=CONTINUOUS MISSING=? GAP=-;\n", "\tMATRIX\n", paste(apply(traits_df, 1, function(x) paste(x[1], paste(x[-1], collapse=" "))), collapse="\n"), "\n\t;\n", "END;" ) # 写入文件 writeLines(nexus_content, "unrooted_tree_with_traits.nex")
二、结合有根树与无根树性状绘图
不需要保存无根树,直接提取性状绑定到有根树即可:
1. 提取无根树的性状数据
# 匹配有根树和无根树的末端标签,提取对应性状 tip_traits <- phylo4d_unrooted@data[match(tipLabels(phylo4d_rooted), tipLabels(phylo4d_unrooted)), ] # 如果有内部节点性状,同样匹配提取 node_traits <- phylo4d_unrooted@node.data[match(nodeId(phylo4d_rooted, "internal"), nodeId(phylo4d_unrooted, "internal")), ]
2. 生成带性状的有根树对象
# 将有根树转为phylo4d并绑定性状 phylo4d_rooted_with_traits <- phylo4d(as(phylo4d_rooted, "phylo"), data = tip_traits, node.data = node_traits)
3. 绘图示例(用ggtree更灵活)
library(ggtree) library(ggplot2) # 绘制有根树,映射性状到节点/末端颜色 p <- ggtree(phylo4d_rooted_with_traits, layout = "rectangular") + geom_tippoint(aes(color = 你的性状列名), size = 3) + # 替换成实际性状列名 geom_nodepoint(aes(color = 节点性状列名), size = 2) + # 有节点性状才加 scale_color_viridis_c() + # 颜色标尺可按需调整 theme_tree2() print(p)
三、直接绘制无根树的办法
如果一定要画无根树,phylobase的plot函数支持无根布局:
plot(phylo4d_unrooted, type = "unrooted", show.tip.label = TRUE, trait.type = "tip", col = phylo4d_unrooted@data$你的性状列名)
内容的提问来源于stack exchange,提问作者Shg456
相关产品推荐
相关产品推荐

