浅谈生态学领域科研图表绘制的方向和未来
摘要
统计和绘图之间界限越来越模糊;
组合图形是趋势;
示意图或者照片图像和图表逐渐结合;
R语言继续发光发热。ggplot是核心。
写在前面
在近年来,随着作图工具发展,我们越来越自由,更加可以随心所欲出图。ggplot的出现让图形的绘制更加简单。人们更加追求组合图形的绘制。尤其是大文章,对组合图形的热度不减。
科研图表复杂度提高和色彩运用更加注重美学特征,这已经相当明显了,之后会有一篇帖子专门论述这两个特征。今天我们来谈谈以上的三个特征。那就是组合图表热。其实我们仔细思考,之前的双坐标图形就是一种简单的组合图表,到现在普遍的箱线图和散点图的结合图表:可用于展示样本总体和细节,到异曲同工小提琴图和散点。当然随着这些基本的组合图形逐渐满足不了人们的需求,比价复杂的组合图形出现,用于展示基本数据的统计。不如ggpubr等一些包吧:这些图形足够让我们浮想联翩,但是实际上表达的含义却不够,然而ggpubr将这些图层都封装起来了,很漂亮的图形,但是到目前我还没发现有一些发散性的应用。这个包有点伪ggplot的意思,同时设置大量的参数,如果开发者得以改进的话就太好了。(下面附着出图代码,大家就可以看到这一回事)
ggscatterhist =function(data, x, y, group =NULL, color ="black", fill =NA, palette =NULL, shape =19, size =2, linetype ="solid", bins =30, margin.plot =c("density","histogram","boxplot"), margin.params =list(), margin.ggtheme =theme_void(), margin.space =FALSE, main.plot.size =2, margin.plot.size =1, title =NULL, xlab =NULL, ylab =NULL, legend ="top", ggtheme =theme_pubr(),...)
library(ggpubr)# Grouped Scatter plot with marginal density plotsggscatterhist( iris, x ="Sepal.Length", y ="Sepal.Width", color ="Species", size =3, alpha =0.6, palette =c("#00AFBB","#E7B800","#FC4E07"), margin.params =list(fill ="Species", color ="black", size =0.2))# Use box plot as marginal plotsggscatterhist( iris, x ="Sepal.Length", y ="Sepal.Width", color ="Species", size =3, alpha =0.6, palette =c("#00AFBB","#E7B800","#FC4E07"), margin.plot ="boxplot", ggtheme =theme_bw())library(ggpubr)# Data preparationhousetasks <- read.delim( system.file("demo-data/housetasks.txt",package="ggpubr"), row.names =1)head(housetasks,4)# Visualizationggballoonplot(housetasks, fill ="value")+scale_fill_viridis_c(option ="C")
逐渐
慢慢的组合图表就这样开始了:并不是说之前没有啊,下面你们会看到基于base的组合图表,是相当强大的,只是热度没有现在这么高而已。Y叔的ggtree提供了facet_plot函数,用于进化树同各种图表的组合,最近的版本还支持了聚类对象,因此,样本距离和这使得gtree运用起来也就多一些。
引子
前一段时间在微生信生物群中讨论过好多优秀的可视化图表,甚至有些图表目前无法通过R语言实现。这里我将这些优秀的图表展示给大家。也借着这些图形谈一谈未来的论文图表。
组合图形一
这张图形是明显的Graphlan绘制的,但是就这上面一个个的柱状图是没有办法在同一个坐标标度中实现的,所以目前绝对只能组合图形。基于graphlan绘制的进化树很漂亮,但是调参数确实是巨大的问题,由于目前还很少有工具可以替代graphlan,所以我们还是经常使用这个工具,目前,R语言中ggtree的设计理念似乎可以解决这个问题,但是两年前我就问过Y叔了,至今外环绘制只有热图。其实可以绘制热图,就可以绘制其他元素,例如各种形状,这样下来设置比graphlan的外环内容更加丰富,毕竟基于ggplot许多开发者构造了多种图层元素,足以干掉graphlan。
最近ggtree的相关工作者有考虑到graphlan,比如microiomeviz包,就提供了将物种分类树构造成ggtree对象,并且提供类似graphlan输出的图形样式,正在做,但是还不够,最起码对于扩增子数据不是很好的兼容,例如:我们使用扩增子注释数据很容易得到graphlan建树文件,但是由于对未注释物种的处理方式不同,所以我们使用microiomeviz包来处理扩增子注释数据是不容易的。但这是一个很好的开端。
组合图形二
这张图表出现在2015年的science,目前已经可以通过ggcor包进行实现了。下面这几张图形式是早期的样式,依靠ggplot的出图,完全兼容,并在昨天(2020年3月12日)完成了对代码的最终改造。这是组合图表的的有益尝试。在2015年,当时并没有成熟的工具来绘制这个图表,我们不知道作者是如何绘制的,但是大概率是手动组合,但却提供了创新的思路,让我们可以用于开发。
组合图形三
这张图片的难点是热图同相关图形结合,并且将类似于进化树的标签加到图形中,按照某种规定在热图上标记方框,是否可以通过R 语言实现呢,显然ggplot目前还不行。标记方框可以使用聚类算法,或者指定等来构造,似乎目前ggcor可以做一部分,但是目前还不够完善。右侧物种分类信息本来是很难添加的,但是经过思考和实践,microbiomeViz结合ggtree可以完成这个物种分类信息的添加,想必会更好看。
组合图形四
堆叠柱状图如何展示极高丰度的指标和极低丰度的指标,这篇CHM给出了自己的方案。首先是将柱状图按照丰度排布丰度块,低丰度的将坐标轴拉长展示,而却还加进去了坐标截断,ggplot对断轴支持度不够,所以实现起来还是有一定难度的。这个方案应该可以通过R语言facet实现,但是ggplot天生对截断纵坐标图形支持不够,这是短板,所以实现以下功能还是有一定难度的。
组合图形五
18年发表与microbiome的扩增子加代谢物组的工作,热图实际上从来就没有热过,冷艳的表达更加深入人心,这样的图形结合左侧的分类箱线图,通过作图实现还是相当困难,主要是实现多对一排列。这张图形看上去是组合起来的,相比于上面的图形,似乎没有足够的亮点,但是让我思考了了一个在热图上聚类的方法,其实挺不需要添加图层来标记,我们将热图按照聚类等数据将热图分隔开来,只需指定分组即可得到类似的效果。
组合图形六
复杂热图,目前ggplot对这种复杂图形的支持不够,base下的plot可以实现许多复杂的组合图形,比如下面的这张:可通过ComplexHeatmap包实现。这是目前使用的人很少罢了。base对于组合图形的支持很好,base非常强大,例如我们目前很火热的upset图形就是使用base出图的,但是逐渐有了gg版本的upset。
组合图形七
这张图形结合热图和气泡图,两者可以通过连线进行组合。
最近几年网络,尤其是漂亮的网络在高水平SCI上层出不穷,目前经典的可视化方式就是gephi的圆心,并结合计算量很大的layout得到比较好的成图。cytoscape可以根据不同模块等分类进行分开展示网络,这是其特色,R语言对于网络图可视化显得不足,但是确实在发展目前ggraph包开发,sne包,tidyverse等包都可以使用ggplot出图,这是网络可视化发展的第一步,很欣喜看到这种变化,但是到达到gephi和cytoscape的效果是要困难不少。
组合图形八
这是15年发表在Mbio上的一篇文章:The Soil Microbiome Influences Grapevine-Associated Microbiota,使用了如图所示的网络图,按照葡萄植株的不同位置,将网络变形,这样做是想要突出微生物群落和空间位置之间的关系。
组合图形九:
在19年的焦硕的一篇文章中将微生物和地图整合起来其实和上一张图是一个道理。那这张图你会做吗?
浅谈
网络图同示意图,无论是植物还是地理地图等结合展示可以更加清晰的描述微生物在空间的关系,这似乎是趋势:图形和图像慢慢开始结合,视觉震感程度也更强,表达也更加容易。近年来在R语言中出现gganatogram包,可用于ggpplot绘制示意图,那么现在示意图也可以使用ggplot画,网络图也可以使用ggplot话,两者结合似乎只需一步就好了。这种努力理所当然的。
R语言在组合图表中占据的地位也越来越重要,以ggplot为框架进行图表的组合将会更加深入。
后记
所以在未来论文中,随着研究的不断深入,各种自然现象和发现需要更加复杂的图表进行描述,单个图表往往不能胜任,组合图表将成为未来,其次图像和图形之间没有明显的节点,会更加灵活的运用。