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

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

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

1、安装

首先是安装:

r
1install.packages("ggvenn")

安装完成后,将其载入,就可以开始绘制维恩图了:

r
1library(ggvenn)

2、基本用法

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

r
1a <- list(`Set 1` = c("apple", "pear", "peach"),
2          `Set 2` = c("apple", "lemon"))
3ggvenn(a)
list 类型输入的维恩图

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

r
1d <- data.frame(name = c("apple", "pear", "lemon", "peach"),
2                A = c(TRUE, TRUE, FALSE, TRUE),
3                B = c(TRUE, FALSE, TRUE, TRUE))
4ggvenn(d)
data.frame 类型输入的维恩图

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

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

r
1a <- list(dummy = NA, A = 1:9, B = 7:11,
2          dummy2 = "", C = seq(2,10,2), D = seq(3,12,3))
3ggvenn(a, c("A", "B", "C", "D"))
指定集合顺序后的维恩图

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

3、ggplot2方式用法

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

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

r
1d <- data.frame(value = 1:9)
2ggplot(d) +
3  geom_venn(aes(A = (value > 5),
4                B = (value %% 2 == 0),
5                C = (value >= 3 & value <= 6))) +
6  coord_fixed() +
7  theme_void()
geom_venn() 绘制的维恩图

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包的帮助信息。具体可以使用如下命令查看:

r
1library(help = ggvenn)
2?ggvenn
3?geom_venn

5、关于ggvenn实现

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

  1. 展示方式固定;
  2. 只支持2-4种集合;
  3. 图形面积大小始终都相同。

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

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

6、后记

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

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

--- END ---

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