之前我发表读书笔记《主成分分析

这可能是你见过最好看的PCA图了,有人在「宏基因组」群里问有没有什么包可以画?像这种提问,我以前是吐槽过的,请猛击《如何画类似MEME的注释序列》,当然说什么都没用,大家就是喜欢凡事问有包吗?因为包治百病嘛,不信你送个包给你女票试试!

jimmy回答说ggbiplot可以画差不多的,于是「宏基因组」公众号立刻就出来一篇《ggbiplot-最好看的PCA作图:样品PCA散点+分组椭圆+变量贡献与相关》,后面又有人提问,能不能加两个置信区间?@Chenhao童鞋就给出了解决方案,并且写了篇博客文介绍.

他的作图是基于ggord包,只能应用于LDA,于是「宏基因组」公众号又跟进发一篇《比PCA更好用的监督排序—LDA分析、作图及添加置信-ggord》,你会发现他们介绍同一类型的作图,一会这个包,一会那个包,一会某包有A功能,某包又有B功能,我就不说什么了。

当时@Chenhao童鞋在群里AT了我,希望我能帮忙写个图层,当时正在过圣诞节,两天之后,我回到学校,立刻就写出来一个图层。并且在群里跟大家展示了:

然而「宏基因组」公众号的文章在我展示了图层之后,他们竟然完全无视,真的是因缺思丁了,根本就没有想过要给粉丝提供全面的信息,根本就没有想过要给粉丝提供易用的工具。

我们先来看看我写的图层是什么样子的,这个geom_ord_ellipse图层打包在yyplot里,还不知道yyplot的话,请看下面链接的几篇文章:

首先我们应用一个ordination方法,这里就以lda为例,这类的方法很多,比如大家熟悉的PCA,还有PCoA, CCA, DCA, NMDS等。

library(MASS)
ord <- lda(Species ~ ., iris, prior = rep(1, 3)/3)

然后用ggord出图:

## devtools::install_github('fawda123/ggord')
library(ggord)
p <- ggord(ord, iris$Species)
p

我们使用geom_ord_ellipse这个图层呢,随便你加置信区间,想加几个就加几个:

library(yyplot)
p + geom_ord_ellipse(ellipse_pro = .96, color='firebrick', size=1, lty=3) +
     geom_ord_ellipse(ellipse_pro = .99, lty=2) 

这个图层起码有以下优点:

  • 没有显式的数据操作,直接+图层且参数简化了
  • 支持ggord所支持的所有ordination plot

@Chenhao童鞋的代码只针对LDA,而不支持其它的ordination plot,而我这个图层,是支持的,比如你把上面的代码中ord换成是PCA的结果:

ord <- prcomp(iris[, -5])

然后后面的代码完全套用,你可以画出来基于PCA的ordination plot,同样也加了三个置信区间。

话说不管是ggbiplot或者是ggord,虽然是gg打头的,号称支持图形语法,在我看来都是扯j8蛋,有太多的所谓支持图形语法的包都是这一类型,他们所谓的支持,只不过是用ggplot2画的图,你可以用theme和scale改点小细节而已,当然不是所有细节都能够通过theme来改的,比如《一次解决ggplot2所有字体》里说的,就只能通过grid来实现。然而这些都不是ggplot2的精髓,ggplot2强大之处在于提供积木,让你自己搭图,好处之一自由组合,好处之二参数简单。比如你画个图,有一个图层是线条,一个图层是柱子,你包装在函数里,想让人可以改颜色,你是否就需要color.line, color.bar两个参数了?如果你的图复杂点,有几个图层,那么你的参数列表比那裹脚布还臭还长。

当年看到phyloseq说他们实现了基于ggplot的进化树可视化,支持图形语法,我就想用它,结果一看,图形语法个鬼啊,一个函数,一堆参数,好多细节还在函数里写死,于是我写ggtree,一个真正支持图形语法的进化树可视化工具。所以大家要小心各种基于ggplot的包,很多人会用ggplot,然而能写图层的人实在太少,以至于大量的gg打头的包都只是一些封闭函数而已。这里并不是我会写图层,我就要吐槽别人,请不要误解,我写这些是要帮大家拨开迷雾看清真相而已。很多ggplot2的粉丝会追求各种所谓ggplot2出图,会为各种gg包欢呼,然而很多只是一张皮,而很多人也没有意识到。

像ggord这个包,它默认就出了个95%的置信区间,但由于它的代码在函数里,而没有独立的图层,你想加额外的置信区间,它就不支持了。试想一下,它的代码里可以计算95%的置信区间,可以画出来,难道要画多一两个圈有多困难吗?并没有!这是设计的问题,也可能是因为不会写图层,限制了他们的眼界。如果我要来写ordination plot,绝对可以干翻ggbiplot和ggord等一系列包。这里我并不完全否认这些包,画图的功夫不一定就是画图,它还包括一系列的前戏,主要是数据处理,它可能需要一些专业知识,像ordination plot不就是画散点,画圈这些,谁不会?但很多人不会,因为不清楚怎么处理分析结果。所以我的观点是要么你卖了处理数据的专业知识,要么你卖了画图的专业知识,如果你能两者都卖了,那就是个牛逼的产品,能够卖一个的,也是个好产品,像ggbiplot或ggord,就算是卖处理数据的,虽然在出图方面有很大的提升空间,但依然我认为是好产品,有其存在的空间和粉丝。

但有些包,既不需要专业知识来处理数据,也没有画图的专业可以卖,美其名曰:给用户提供捷径。比如我吐槽过某人的一步出图:《听说你也在画dotplot,但是我不服!》。

「宏基因组」公众号最近的《一条命令轻松绘制CNS顶级配图-ggpubr》,也是属于此类。他们到处推销,你若以为ggpubr有多好,你就掉坑里了,所谓CNS无非吸引眼球,到处推销,推销的可不是ggpubr,而是他们的公众号,看不出这一点,那也没办法,毕竟无脑群众太多。为什么说ggpubr不好,因为图都是简单的图,只是两到三个简单的ggplot2图层拼一下而已,而所谓的gg,正如我前面说的,既没有处理数据的前戏,又没有ggplot2画图自由组合与参数简单的正餐,有的只是很多所谓支持图形语法的遮羞布,可以有theme的后戏。ggplot2还可以用grid做后后戏呢,你看这是卖点吗?从来不是!像ggpubr这些包的存在就是制造混乱,徒增学习成本。

要对ggplot2有清楚的认识,最好的资料必须是我的课程直播,不管是初学还是中级,都为你进阶指明方向,深化你的理解,为你拨开迷雾,避免掉坑。