这是去年「知识星球」里的提问,「知识星球」相当于是众筹我一年的时间,向我提问,请谨慎入坑。

我当时就写了一个函数ggvenn,这个函数其实包装了venneuler,但由于venneuler依赖rJava,而很多小伙伴不会装rJava,而因此装不了yyplot,所以我去掉了这个依赖,但如果你想要用ggvenn这个函数,请自行安装rJavavenneuler。其实还有另外一个包,VennDiagram,它的输出是gList,所以可以直接封装为ggplot2图层,然而对于画venn plot,我并没有太多的兴趣,《CS6: ChIPseeker的可视化方法(中秋节的视觉饕餮)》一文中介绍的upset plot,可能更好一些。

要使用ggvenn是非常简单的,你只要给定一个matrix,这个matrix每一个column代表一个分组,数字0代表没有overlap,而非0代表overlap,数字的大小可以当做是overlap的加权。当然还支持别形式的输入,具体可以参考venneuler的文档。

set.seed(2017-11-08)
x <- matrix(sample(0:4, 40, TRUE, c(.5, .1, .1, .1, .1)), ncol=4)
colnames(x) <- LETTERS[1:4]
yyplot::ggvenn(x)

如果你跑上面的代码,你可以看到下面的图:

变成ggplot2出图的好处,我想不用多说,你可以用ggplot2的主题系列做点后戏,还可以用grid做后后戏,比如《一次解决ggplot2所有字体》,然后你可以用cowplot拼图,用ggimage图上嵌图,《ggimage:ggplot2中愉快地使用图片》,比如此处可以预告一下,我们可以把这个维恩图嵌在UpSet图中,正如我在《CS6: ChIPseeker的可视化方法(中秋节的视觉饕餮)》中嵌入一个vennpie一样。现在有ggimage,这些活都只是一句代码的事情。

一点都不YY的yyplot

知识星球解答范例