基于ggtreeExtra的环形进化树(circos plot)图片绘制
探索了ggtreeExtra这个R包,学习如何用其绘制环形进化树。
一、背景
是这样的。
最近想要绘制一些环形的图表(比方说下图,来自 DOI: 10.1126/sciadv.adq5038)。

这种图片有个专门的名字,叫做circos plot,顾名思义就是把数据拼成一系列的圆环,看起来直观也好看。
有一个用perl开发的专业软件叫做 circos.ca ,可以绘制这种图(如下图),笔者曾在大三的时候用过这个软件,它很专业,几乎所有的图表类型都可以画,而且样式多样,可以调得很美观。但说实话,这个软件太难用了,需要编写晦涩难懂的配置文件,并且渲染速度也很慢,因此这里不考虑。

另一个软件是ggtree,这是一个基于ggplot2的R包,可以绘制进化树,在往期博客中我们介绍过(见《使用ggtree绘制系统发育树》)。在这一次的学习和探索中,我发现ggtree还有一个Extra版本,可以绘制更为高端的图像,可以实现论文中的那种专业图片的效果。下面是探索记录
二、安装
主要需要用到的R包有下面这几个:
- ape:进化树读取与处理
- ggplot2:绘图的底层库
- ggtree:绘制进化树
- ggtreeExtra:绘制进化树外圈的circos plot
如果有conda,强烈建议使用conda安装上述R包(安装方法是去 anaconda.org 搜索包名,然后使用对应的指令进行安装,如下图)。
如果没有conda,那么需要借助 install.packages() 和 BiocManager::install() 进行安装。其中,ape、ggplot2托管在CRAN上,使用 install.packages() 即可安装;ggtree和ggtreeExtra托管在bioconductor上,需要使用 BiocManager::install() 进行安装。


三、使用(代码示例)
下面是一个例子,在例子中展示了我们是如何一步一步绘制出带有进化树信息的circos plot的。
1 |
|
我们可以注意到,代码中分了多个步骤,依次绘制了p1到p5。ggplot2的绘图语法是一种声明式的语法,允许用户使用“+”(加号)在一个绘图对象上增加新的东西,因此我们可以在每一个步骤中增加圆环的数量,层层递进。
在上述代码中, geom_fruit() 这个函数是其中最为关键的函数,其名称很形象(绘制一颗环形进化树外圈数据的过程,就像在一棵树上挂果实一样),通过 mapping 参数可以指定如何对齐进化树的树枝以及对应的数据点。举一个例子, mapping=aes(y=ID, x=Type2) ,这里就是说使用数据里面的ID这一列去对齐进化树的树枝,而 x=Type2 是需要可视化的数据。
下面是p1到p5的全部内容:

四、讨论
相比于基于perl编程语言的 circos.ca ,ggtreeExtra的性能要好许多,并且借助ggplot2强大的图形库与调色板功能,可以绘制出非常好看的图像,因此这个包是绘制环形进化树统计图的非常好的选择。
实际使用中,我们可以把数据存储为nwk格式(进化树)和csv(需要可视化的外层数据),只要进化树的叶子节点的ID能够与数据中的记录ID(用mapping参数指定的那个)一一对应起来即可。这里面需要留意的问题是,在一些数据源中,物种名称的属名与种加词(Genus and species name)是使用空格字符相连接的(比方说, “Homo sapiens” ) ,另一些数据源中则以下划线相连(如 “Homo_sapiens” ),这种不同之处会导致mapping的时候对应不上,需要预先转换——所以我们在绘图前需要检查数据。
总的来说,这是一个很好的工具,强烈推荐有需要的朋友试用。