如何用plot.phylo按数据框属信息着色进化树标签并加图例
解决进化树节点标签按病毒属着色的问题
核心思路
要让节点颜色对应属分类,关键是把进化树的节点名称和数据框的Genus列精准匹配,再根据属分配颜色,而非直接按数据框顺序赋值。
具体实现步骤
假设你已拥有:
- 比对完成的序列对象(示例中用
msa_result指代) - 包含病毒名称(需与进化树节点名完全一致)、
Genus列的数据框virus_df
1. 生成进化树对象
先完成基础的进化树构建(以NJ树为例):
library(msa) library(Biostrings) library(ape) # 将比对结果转换为ape可处理的格式 dna_aln <- msaConvert(msa_result, type="ape::DNAbin") # 构建NJ进化树 tree <- nj(dist.dna(dna_aln))
2. 匹配节点名称与属信息
确保进化树节点名和数据框中的病毒名称完全匹配,再创建颜色映射:
# 按进化树节点顺序,匹配对应病毒的属信息 tip_genus <- virus_df$Genus[match(tree$tip.label, virus_df$病毒名称列)] # 给每个属分配唯一颜色(可自定义配色) unique_genera <- unique(tip_genus) # 用RColorBrewer生成配色,也可手动指定颜色向量 genus_colors <- setNames(RColorBrewer::brewer.pal(length(unique_genera), "Set1"), unique_genera) # 生成对应每个节点的颜色向量 tip_colors <- genus_colors[tip_genus]
3. 绘制带着色标签的进化树并添加图例
# 绘制进化树,设置节点标签颜色 plot(tree, tip.color=tip_colors, cex=0.8, main="病毒进化树(按属着色)") # 添加图例,位置可根据树布局调整(如"topright""bottomleft") legend("topright", legend=unique_genera, fill=genus_colors, cex=0.7, title="病毒属")
关键注意事项
- 进化树的
tip.label必须和数据框中的病毒名称完全一致(包括大小写、空格、后缀),否则会出现NA值导致颜色匹配失败。 - 若属的数量超过所选配色方案的颜色数,可换用
rainbow()生成配色,或手动定义颜色向量。 - 若使用环形等特殊树布局(如
type="fan"),需调整图例位置到合适区域。
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

