颜林林的个人网站

轻松上手用R语言绘制漂亮的维恩图

2021-01-16 23:11

相信各位跟我一样,都曾遇到过这种情况:手上有几组数据,想快速画个维恩图出来,贴到报告中,于是上网搜索,找到一大堆工具,好不容易从中选出一个,学会其用法,也把数据成功转成所需格式,画出图来,却发现还得手动调整各种配色,然后,大半天就过去了……

几次折腾之后,我终于决定自己写一个R包,来快速且方便地绘制维恩图。因为是基于ggplot2实现,所以索性取名ggvenn。最近,我把这个R包成功提交到了CRAN上,安装使用起来就更方便了。

下面就直接进入正题,介绍如何快速上手使用ggvenn。

1、安装

首先是安装:

install.packages(“ggvenn”) 安装完成后,将其载入,就可以开始绘制维恩图了:

library(ggvenn) 2、基本用法

ggvenn支持两种类型的数据作为输入,一种是list类型(每个集合以向量形式保存在list中):

a <- list(Set 1 = c(“apple”, “pear”, “peach”), Set 2 = c(“apple”, “lemon”)) ggvenn(a) Image

另一种是data.frame类型(每个集合以logical列的形式,记录该集合中是否存在某元素):

d <- data.frame(name = c(“apple”, “pear”, “lemon”, “peach”), A = c(TRUE, TRUE, FALSE, TRUE), B = c(TRUE, FALSE, TRUE, TRUE)) ggvenn(d) Image

上面展示的两种情况,ggvenn都会自动选取list中的前2-4个元素(或data.frame中的前2-4列logical类型列),作为需要展示的集合,绘制维恩图。

如果需要展示的集合,并不排在list或data.frame的前面,或者需要手动控制集合的先后顺序,可以使用第二个参数来具体指定:

a <- list(dummy = NA, A = 1:9, B = 7:11, dummy2 = “”, C = seq(2,10,2), D = seq(3,12,3)) ggvenn(a, c(“A”, “B”, “C”, “D”)) Image

掌握上述方法,基本可以应对大多数常见情况了。

3、ggplot2方式用法

在ggvenn包中,扩展了ggplot2,提供了geom_venn(),可以在aes()指定A、B、C和D(其中C和D可选),来指定集合信息所在列。

对于这种用法,甚至可以直接向A、B、C和D指定logical运算结果,如:

d <- data.frame(value = 1:9) ggplot(d) + geom_venn(aes(A = (value > 5), B = (value %% 2 == 0), C = (value >= 3 & value <= 6))) + coord_fixed() + theme_void() Image

4、其他参数

此外,为了帮助用户进一步调整维恩图的展示细节,ggvenn提供了如下参数:

参数 用途 缺省值 fill_color 填充色 c(“blue”, “yellow”, “green”, “red”) fill_alpha 填充透明度 0.5 stroke_color 线条颜色 “black” stroke_alpha 线条透明度 1 stroke_size 线条粗细 1 stroke_linetype 线条类型 “solid” set_name_color 集合名字体颜色 “black” set_name_size 集合名字体大小 6 text_color 文字字体颜色 “black” text_size 文字字体大小 4 show_elements 是否显示集合内容 FALSE label_sep 显示集合内容时所用分隔字符 “,” show_percentage 是否显示百分比 TRUE digits 百分比的小数位数 1 上述参数来自当前版本(v0.1.8),后续若有更新,请参考R包的帮助信息。具体可以使用如下命令查看:

library(help = ggvenn) ?ggvenn ?geom_venn 5、关于ggvenn实现

开发ggvenn包,我最初的主要目的,是为了方便自己使用,使能应付最常见的list和data.frame数据类型,而无需来回做各种格式转化。同时,其形状和缺省配色参考了在线工具Venny,一般不需要做更多调整,结果图片看起来就挺漂亮的。当然,ggvenn在实现上也有一些不足,比如:

展示方式固定;

只支持2-4种集合;

图形面积大小始终都相同。

之所以这样,除了为简化实现外,主要是考虑:在统计图中,通常要展示数量的相对大小关系,首选都会使用图形元素的位置或长度(如散点图和柱状图),而不是面积,因为后者容易引起误解(比如面积相差两倍的图形,其边长并不是相差两倍的关系)。

至于超过4个的集合数,则推荐改用UpSet图的展示形式了。

6、后记

除了ggvenn,网上确实也有不少绘制维恩图的R包,很可能由于我调研不够充分,忽略了其他好用的同类R包(比如高老师的ggVennDiagram),而重新发明了轮子。不过既然已经写了,也就不妨发布出来,万一不同用户有各自不同的偏好选择呢。

最后,如果大家喜欢,也欢迎提出意见和建议,可以在GitHub上给我提issue或PR:https://github.com/yanlinlin82/ggvenn/issues(可点击文末“查看原文”打开此链接)

--- END ---

注:本文首发表于“不靠谱颜论”公众号,并同步至本站。