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

R语言系统发育树性状追踪:树标签替换与性状映射问题咨询

系统发育树标签替换与性状映射操作方案

1. 进化树数字标签替换为分类单元名称

当前读入的supertree对象的tip.label槽位存储的是1-36的数字编号,和导入表格tablename的code列一一对应,直接匹配替换即可,操作前先做一致性校验避免匹配错误:

# 校验树的所有tip编号是否都在性状表的code列中,返回TRUE再执行后续替换
all(supertree$tip.label %in% tablename$code)

# 按code匹配,将tip标签替换为对应的分类单元名称
supertree$tip.label <- tablename$specimen[match(supertree$tip.label, tablename$code)]

# 重新绘图验证替换结果
plot(supertree, no.margin=TRUE, edge.width=2, cex=0.7)

如果绘图出现标签重叠、显示不全,调整cex参数(字号)即可,数值越小标签字号越小。

2. 性状数据与进化树关联及后续性状映射流程

所有系统发育比较分析的核心前提:进化树的tip标签和性状表的物种标识必须完全一致,无拼写差异、无缺项,否则后续所有计算都会报错,操作流程如下:

第一步:对齐树与性状数据集

# 将性状表的行名设置为分类单元名称,匹配树的tip标签格式
rownames(tablename) <- tablename$specimen

# 提取3个待分析的性状列,生成独立的性状数据集
trait_data <- tablename[, c("HFM", "WFM", "Wpp")]

# 校验树和性状数据的匹配度
match_check <- geiger::name.check(supertree, trait_data)

如果match_check返回非空结果,说明存在不匹配项,按以下规则修正:

  • 树中存在但性状表无对应数据的tip:执行supertree <- ape::drop.tip(supertree, match_check$tree_not_data)删除
  • 性状表存在但树中无对应tip的行:执行trait_data <- trait_data[!rownames(trait_data) %in% match_check$data_not_tree, ]删除

第二步:常用性状映射操作

  • 单连续性状渐变热图映射:适合展示单个性状沿进化支的数值渐变趋势,以HFM指标为例
    # 生成性状映射热图对象
    hfm_map <- phytools::contMap(
      supertree, 
      setNames(trait_data$HFM, rownames(trait_data)), 
      outline = FALSE
    )
    # 自定义配色(蓝-灰-红对应数值从低到高)
    hfm_map <- phytools::setMap(hfm_map, colors = c("#2c7bb6", "#ffffbf", "#d7191c"))
    # 绘图展示,可自定义图例位置、字号
    plot(hfm_map, legend = 0.7*max(ape::nodeHeights(supertree)), fsize = c(0.7, 0.9))
    
  • 多性状联合映射:同时展示3个指标在各物种的数值分布
    # 圆点大小对应性状值大小
    phytools::dotTree(supertree, trait_data, length = 10, fsize = 0.7)
    
  • 系统发育信号检验:判断性状是否受系统发育关系影响,以HFM指标为例
    # 计算Blomberg's K值,test=TRUE输出显著性检验结果
    phytools::phylosig(
      supertree, 
      setNames(trait_data$HFM, rownames(trait_data)), 
      method = "K", 
      test = TRUE
    )
    
    结果中K>1且P<0.05说明性状存在显著的系统发育保守性。
  • 祖先性状重建:追溯性状在各进化支内部节点的祖先状态,实现跨支追踪
    # 最大似然法重建HFM指标的祖先状态
    hfm_anc <- phytools::fastAnc(supertree, setNames(trait_data$HFM, rownames(trait_data)))
    # 将祖先状态映射到进化树节点上展示
    plot(hfm_map, legend = FALSE)
    ape::nodelabels(
      node = 1:supertree$Nnode + ape::Ntip(supertree),
      pie = hfm_anc, 
      piecol = hfm_map$cols, 
      cex = 0.5
    )
    

内容的提问来源于stack exchange,提问作者René Deder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:48:37