You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:35:03