Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R语言之系统进化树的美化

R语言之系统进化树的美化

作者头像
一粒沙
发布于 2019-07-31 06:40:35
发布于 2019-07-31 06:40:35
5.5K00
代码可运行
举报
文章被收录于专栏:R语言交流中心R语言交流中心
运行总次数:0
代码可运行

百度百科对进化树的定义是:在生物学中,用来表示物种之间的进化关系。生物分类学家和进化论者根据各类生物间的亲缘关系的远近,把各类生物安置在有分枝的树状的图表上,简明地表示生物的进化历程和亲缘关系。在进化树上每个叶子结点代表一个物种,如果每一条边都被赋予一个适当的权值,那么两个叶子结点之间的最短距离就可以表示相应的两个物种之间的差异程度。同时有很多算法应运而生主要包括:贝叶斯法(Bayesian),最大似然法(Maximum likelihood,ML),最大简约法(Maximum parsimony,MP),邻接法(Neighbor-Joining,NJ),最小进化法(Minimum Evolution,ME),类平均法(UPGMA)。与此同时相对应的软件也出现,下图总结来源于网络:

我们今天就不一一介绍树状图的形成,如果实在没操作过那可以参考下面的创建进化树数据的实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mafft --auto ggtree.fasta > ggtree_aligned.fasta##序列的比对
./FastTree ggtree_ aligned.fasta >ggtree_resource.tree ###最大似然法进化树构建

接下来就是我们今天的主题如何对获得进化树数据进行美化。需要用到R语言的包ggtree。

包的安装我们就是不赘述了,请参考bioconductor安装方式。

首先我们看数据的导入。所用到的函数是read.tree。

主要的参数:

file和text参数是相互补充的数据。如果设置了file就不用管text,如果传入自己的文本数据那就会忽略file。

Skip参数主要是在读入数据时需要忽略的前多少行。同时去掉后面多少字符的则是coment.char,它会忽略此处设置的单个字符串以后的数据。

keep.multi 主要是面对多个进化树时,可以设置为true,并且利用tree.names进行选择对应的树。

实例:

单个树的文件构建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s <-"owls(((Strix_aluco:4.2,Asio_otus:4.2):3.1,Athene_noctua:7.3):6.3, Tyto_alba:13.5);"
cat(s, file = "ex.tre", sep ="\n")
tree.owls <-read.tree("ex.tre")
str(tree.owls)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s <-"owls(((Strix_aluco:4.2,Asio_otus:4.2):3.1,Athene_noctua:7.3):6.3, Tyto_alba:13.5);\nowls1(((Strix_aluco:4.2,Asio_otus:4.2):3.1,Athene_noctua:7.3):6.3,Tyto_alba:13.5);"
cat(s, file = "ex.tre", sep ="\n")
tree.owls <-read.tree("ex.tre", keep.multi = TRUE)
str(tree.owls)

当然有时候我们直接从给我们的其他软件直接生成的tree文件,就可以直接利用file参数读进去,那个就不赘述了。

接下来我们看下其绘制进化树图的主函数ggtree。

主要参数:

Tr主要是进化树的数据

Layout主要是展现的样式具体的我们引用下官网的例子:

Ladderize主要是指的是否对进化树进行阶梯状重构,同时结合right进行设置阶梯化的方向。

Open.angle主要是对于“fan”布局角度设置。

当然其他的一些修饰是完全和ggplot2一致的,比如color,linetype等。

接下来就是对构建好的基础系统进化树进行美化,添加图层,主要会用到下面的函数,其语法类似于ggplot2:

我们介绍其中几个比较常用的:

theme_tree2 添加X轴。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set.seed(2017-02-16)
tree <- rtree(50)
ggtree(tree) + theme_tree2()

geom_point2 注释想要注释的样本信息。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) +theme_tree2()+geom_point2(aes(subset=(node == 21)), size=5, shape=23,fill="steelblue")

geom_point 注释每一个节点。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree)+theme_tree2()+geom_point(aes(shape=isTip, color=isTip), size=3)

geom_treescale 添加距离标尺。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) +theme_tree2()+geom_point(aes(shape=isTip, color=isTip), size=3)+geom_treescale(x=0,y=45, width=0.2, color='red')

geom_nodepoint 注释节点信息,可以在节点生成圆形的阴影。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) +theme_tree2()+geom_point(aes(shape=isTip, color=isTip),size=3)+geom_treescale(x=0, y=45, width=0.2,color='red')+geom_nodepoint(color="#b5e521", alpha=1/4, size=10)

geom_tippoint 对每个样本进行标注。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) +theme_tree2()+geom_point(aes(shape=isTip, color=isTip),size=3)+geom_treescale(x=0, y=45, width=0.2,color='red')+geom_nodepoint(color="#b5e521", alpha=1/4,size=10)+geom_tippoint(color="#FDAC4F", shape=8, size=3)

geom_tiplab 标注每一个样本的名称。如果是圆形的图像需要设置aes(angle=angle)。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) +theme_tree2()+geom_point(aes(shape=isTip, color=isTip),size=3)+geom_treescale(x=0, y=45, width=0.2,color='red')+geom_nodepoint(color="#b5e521", alpha=1/4,size=10)+geom_tippoint(color="#FDAC4F", shape=8,size=3)+geom_tiplab(size=3, color="purple")

geom_text2 注释每个节点的编号。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) +theme_tree2()+geom_point(aes(shape=isTip, color=isTip),size=3)+geom_treescale(x=0, y=45, width=0.2, color='red')+geom_nodepoint(color="#b5e521",alpha=1/4, size=10)+geom_tippoint(color="#FDAC4F", shape=8,size=3)+geom_tiplab(size=3,color="purple")+geom_text2(aes(subset=!isTip, label=node), hjust=-.3)

geom_cladelabel 注释某一个节点区域。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) + theme_tree2()+geom_point(aes(shape=isTip,color=isTip), size=3)+geom_treescale(x=0, y=45, width=0.2,color='red')+geom_nodepoint(color="#b5e521", alpha=1/4,size=10)+geom_tippoint(color="#FDAC4F", shape=8,size=3)+geom_tiplab(size=3, color="purple")+geom_text2(aes(subset=!isTip,label=node), hjust=-.3)+geom_cladelabel(node=84, label="test label")+geom_cladelabel(node=59, label="another clade")

geom_strip 可以更加美化的进行色块的直接注释。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) +theme_tree2()+geom_point(aes(shape=isTip, color=isTip),size=3)+geom_treescale(x=0, y=45, width=0.2,color='red')+geom_nodepoint(color="#b5e521", alpha=1/4,size=10)+geom_tippoint(color="#FDAC4F", shape=8, size=3)+geom_tiplab(size=3,color="purple")+geom_text2(aes(subset=!isTip, label=node),hjust=-.3)+geom_cladelabel(node=84, label="test label")+geom_cladelabel(node=59, label="another clade")+geom_strip(57, 59,barsize=2, color='red') + geom_strip(87, 88, barsize=2, color='blue')

geom_hilight 注释某一个节点的区域。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) +theme_tree2()+geom_point(aes(shape=isTip, color=isTip),size=3)+geom_treescale(x=0, y=45, width=0.2,color='red')+geom_nodepoint(color="#b5e521", alpha=1/4,size=10)+geom_tippoint(color="#FDAC4F", shape=8, size=3)+geom_tiplab(size=3,color="purple")+geom_text2(aes(subset=!isTip, label=node),hjust=-.3)+geom_hilight(node=59, fill="darkgreen", alpha=.6)

geom_balance 注释某个节点后相邻子代的两代区域。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) +theme_tree2()+geom_point(aes(shape=isTip, color=isTip),size=3)+geom_treescale(x=0, y=45, width=0.2,color='red')+geom_nodepoint(color="#b5e521", alpha=1/4,size=10)+geom_tippoint(color="#FDAC4F", shape=8, size=3)+geom_tiplab(size=3,color="purple")+geom_text2(aes(subset=!isTip, label=node),hjust=-.3)+geom_balance(node=95, fill='darkgreen', color='white', alpha=0.6,extend=1)

Theme 进行legend注释设置。

实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggtree(tree) +theme_tree2()+geom_point(aes(shape=isTip, color=isTip), size=3)+geom_treescale(x=0,y=45, width=0.2, color='red')+geom_nodepoint(color="#b5e521",alpha=1/4, size=10)+geom_tippoint(color="#FDAC4F", shape=8,size=3)+geom_tiplab(size=3,color="purple")+geom_text2(aes(subset=!isTip, label=node), hjust=-.3)+geom_balance(node=95,fill='darkgreen', color='white', alpha=0.6,extend=1)+theme(legend.position="right")

然后介绍一个可以对进化树局部放大的函数gzoom。其主要的参数就是focus,他可以支持各种对label筛选的结果。实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library("ape")
data(chiroptera)
library("ggtree")
gzoom(chiroptera,grep("Plecotus", chiroptera$tip.label))

以上是基础的绘图,那么我们还可以进行美化,我们就直接借用官网的实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
groupInfo <- split(chiroptera$tip.label,gsub("_\\w+", "", chiroptera$tip.label))
chiroptera <- groupOTU(chiroptera,groupInfo)
p <- ggtree(chiroptera,aes(color=group)) + geom_tiplab() + xlim(NA, 23)
gzoom(p, grep("Plecotus",chiroptera$tip.label), xmax_adjust=2)

我们也可以进行多个系统进化树的同时展示,需要用到函数facet_wrap,示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
trees <- lapply(c(10, 20, 40), rtree)
class(trees) <- "multiPhylo"
ggtree(trees) + facet_wrap(~.id,scale="free") + geom_tiplab()

那么接下来我们看下更加复杂的多图像可视化,首先是如何将每个样本对应的其他信息以热图形式组合展示。具体我们不挨个剖析了,看下官方给的实例:

在运行实例前,我们需要先加载ape和ggplot2两个包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
beast_file <-system.file("examples/MCC_FluA_H3.tree", package="ggtree")
beast_tree <- read.beast(beast_file)
 
genotype_file <-system.file("examples/Genotype.txt", package="ggtree")
genotype <- read.table(genotype_file,sep="\t", stringsAsFactor=F)
colnames(genotype) <-sub("\\.$", "", colnames(genotype))
p <- ggtree(beast_tree,mrsd="2013-01-01") + geom_treescale(x=2008, y=1, offset=2)
p <- p + geom_tiplab(size=2)
gheatmap(p, genotype, offset=5, width=0.5,font.size=3, colnames_angle=-45, hjust=0) +
scale_fill_manual(breaks=c("HuH3N2","pdm", "trig"), values=c("steelblue","firebrick", "darkgreen"))

现在有个问题就是,感觉X轴并不是那么协调,我们也可以进行进一步美化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p <- ggtree(beast_tree,mrsd="2013-01-01") + geom_tiplab(size=2,, linesize=.5) +theme_tree2()
pp <- (p +scale_y_continuous(expand=c(0, 0.3))) %>%
   gheatmap(genotype, offset=8, width=0.6, colnames=FALSE) %>%
       scale_x_ggtree()
pp +theme(legend.position="right")

我们这是系统进化树可视化,那么制定离不了序列。当然此包也引入了序列的可视化展示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fasta <-system.file("examples/FluA_H3_AA.fas", package="ggtree")
msaplot(ggtree(beast_tree), fasta) +theme(legend.position="right")

最后,我们来看个更加复杂的多图的展示,还是要回到我们最初的组合函数faset_plot:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tr <- rtree(30)
 
d1 <- data.frame(id=tr$tip.label,val=rnorm(30, sd=3))
p <- ggtree(tr)
 
p2 <- facet_plot(p,panel="dot", data=d1, geom=geom_point, aes(x=val), color='firebrick')
d2 <- data.frame(id=tr$tip.label,value=abs(rnorm(30, mean=100, sd=50)))
 
facet_plot(p2, panel='bar', data=d2,geom=geom_segment, aes(x=0, xend=value, y=y, yend=y), size=3,color='steelblue') + theme_tree2()

欢迎大家学习交流!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 R语言交流中心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ggtree-给你的进化树盛世美颜
ggtree是ggplot2的拓展包,可以应用于进化树的绘制,还能对进化树丰富的注释分析。
作图丫
2022/03/29
12.5K0
ggtree-给你的进化树盛世美颜
跟着NatureCommunications学作图:R语言ggtree根据分组给进化树上色
https://www.nature.com/articles/s41467-022-29438-7
用户7010445
2023/01/06
1.6K0
跟着NatureCommunications学作图:R语言ggtree根据分组给进化树上色
跟着Nature Plants学作图:R语言ggtree包展示进化树
https://www.nature.com/articles/s41477-022-01146-6#Sec44
用户7010445
2022/05/23
3.6K0
跟着Nature Plants学作图:R语言ggtree包展示进化树
跟着NatureGenetics学作图:R语言ggplot2做进化树图及添加不同形状的背景色块
https://www.nature.com/articles/s41588-022-01127-7#Sec31
用户7010445
2023/01/06
1.6K0
跟着NatureGenetics学作图:R语言ggplot2做进化树图及添加不同形状的背景色块
跟着Nature Communications学作图:R语言ggtree绘制进化树
A highly conserved core bacterial microbiota with nitrogen-fixation capacity inhabits the xylem sap in maize plants
用户7010445
2023/01/06
1.3K0
跟着Nature Communications学作图:R语言ggtree绘制进化树
如何使用R语言ggtree包在进化树上标记自己取样测序的样本
随着三代测序技术的发展和测序成本的下降,现在基于三代测序数据组装基因组做泛基因组的研究越来越多。虽然测序成本降低了许多,但也是相对于之前,做大规模的测序组装的费用也是非常昂贵的,现在通常的做法是如果做了大规模的二代测序,通常会利用这些数据做的进化树,然后根据进化树的分布在每一个类群里选取一些有代表性的个体去做三代测序组装。比如大豆cell发表的泛基因组论文,就是从2000多份材料里选择26份有代表性的材料。
用户7010445
2024/02/23
3110
如何使用R语言ggtree包在进化树上标记自己取样测序的样本
使用Y叔神包ggtree进行基因家族基因进化树构建
大家好,我是技能树的老朋友啦,三年前在群主的第一波RNA-seq入门8步活动中因为表现优异获得群主青睐成为技能树VIP一员,也开启了自己的学习经验分享人生!
生信技能树
2019/08/02
9.1K1
使用Y叔神包ggtree进行基因家族基因进化树构建
跟着Nature学作图:R语言ggplot2+ggtree树图组合热图
1、进化树中挑选子集 2、进化树默认是左下角到右上角这种布局,如何调整成左上到右下角这种布局 3、进化树把某个clade压缩成三角性状 4、给进化树添加根小尾巴
用户7010445
2024/02/03
8800
跟着Nature学作图:R语言ggplot2+ggtree树图组合热图
R语言的ggtree展示进化树的一些常用操作
可以首先加上theme_tree2()函数显示出坐标轴范围,然后用xlim()函数更改坐标轴范围
用户7010445
2021/01/06
14K0
一步一步教你使用ggtree
ggtree是R语言中一个强大的系统发育树可视化及注释软件包,在Bioconductor中发布,同时兼有ggplot2的优点。ggtree可以读取多种格式(包括newick,nexus,NHX,jplace和phylip)的系统发育树,并结合不同类型的相关数据进行注释分析。在R中ggtree的安装方法如下:
SYSU星空
2022/05/05
9.6K0
一步一步教你使用ggtree
R语言ggtree画圆形的树状图展示聚类分析的结果
那么圆形的树状图如何实现呢?我查找了一下相关资料。R语言包dendextend这个包可以实现,利用help(package="dendextend")查看帮助文档,能够看到其中的一个小例子
用户7010445
2020/11/13
3.7K0
R语言ggtree画圆形的树状图展示聚类分析的结果
跟着ISEM学作图:R语言ggtree+ggplot2组合进化树和气泡图
论文 Conserved and reproducible bacterial communities associate with extraradical hyphae of arbuscular mycorrhizal fungi image.png 今天的推文我们来重复一下论文中的 Figure 2 image.png 没有找到论文提供的原始数据,这里数据我自己构造一份 首先是左侧的进化树文件 (((A8:0.9735669859,((A5:0.7219205995,A9:0.53850
用户7010445
2022/05/23
1.4K0
跟着ISEM学作图:R语言ggtree+ggplot2组合进化树和气泡图
跟着Nature学作图:R语言ggtree给进化树的节点添加饼状图
https://www.nature.com/articles/s41586-022-04897-6
用户7010445
2023/01/06
7220
跟着Nature学作图:R语言ggtree给进化树的节点添加饼状图
R语言ggtree+msa可视化进化树+多序列比对的结果
里面一小部分内容是关于进化树的可视化展示并且关联多序列比对的结果的。记录下这个代码
用户7010445
2021/11/16
2.1K0
R语言ggtree+msa可视化进化树+多序列比对的结果
只需2步!用ChatGPT打造CNS级精美图表
各位科研小伙伴,是不是经常遇到这样的情况:看到论文里一个超级赞的图,结果作者既没有标明图的类型,也没提供相应的代码?只能干瞪眼,到处求源代码
用户11203141
2025/03/06
1290
只需2步!用ChatGPT打造CNS级精美图表
文献笔记五十六:武汉新型冠状病毒的进化分析2
论文题目 Evolution of the novel coronavirus from the ongoing Wuhan outbreak and modeling of its spike pr
用户7010445
2020/03/03
5520
跟着Nature Methods学画图:R语言ggplot2+ggtree+aplot画气泡图组合聚类树图
论文对应的代码是公开的 https://github.com/ajwilk/2020_Wilk_COVID
用户7010445
2021/03/15
2.4K0
技术贴:R语言拼图全面介绍
说起R语言的拼图,可能大家一点都不陌生,比如常用的“cowplot”和“patchwork”。gridExtra包也提供了一个拼图函数”grid.arrange“。另外,南方医科大学余光创教授也开发了一个更为神奇的拼图R包:aplot。本文将依次对它们的用法进行介绍。
作图丫
2022/03/29
6K0
技术贴:R语言拼图全面介绍
R语言读入比对好的fasta文件然后做NJ树并做boostrap检验
今天的推文内容主要参考 https://www.rpubs.com/michelleprem/683962 https://fuzzyatelin.github.io/bioanth-stats/module-24/module-24.html 首先是读入数据 今天推文用到的示例数据是参考链接2中提供的usflu.fasta,fasta文件已经比对好,R语言里读入fasta格式的数据可以使用adegenet包中的fasta2DNAbin函数 #install.packages("adegenet") li
用户7010445
2021/01/20
1.7K0
R语言读入比对好的fasta文件然后做NJ树并做boostrap检验
R语言ggtree按照指定的节点旋转树
http://yulab-smu.top/treedata-book/index.html
用户7010445
2021/01/20
1.9K0
R语言ggtree按照指定的节点旋转树
推荐阅读
相关推荐
ggtree-给你的进化树盛世美颜
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验