颜林林的个人网站

Linlin Yan's Personal Website

[不靠谱颜论] 轻松上手用R语言绘制漂亮的维恩图

2021-01-16 23:10

导言: 给大家介绍一个超易用的绘制维恩图的R包:ggvenn(基于ggplot2)


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

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

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

1、安装

首先是安装:

1
install.packages("ggvenn")

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

1
library(ggvenn)

2、基本用法

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

1
2
3
a <- list(`Set 1` = c("apple", "pear", "peach"),
          `Set 2` = c("apple", "lemon"))
ggvenn(a)

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

1
2
3
4
d <- data.frame(name = c("apple", "pear", "lemon", "peach"),
                A = c(TRUE, TRUE, FALSE, TRUE),
                B = c(TRUE, FALSE, TRUE, TRUE))
ggvenn(d)

上面展示的两种情况,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”))

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

3、ggplot2 方式用法

ggvenn包中,扩展了ggplot2,提供了geom_venn(),可以在aes()指定ABCD(其中CD可选),来指定集合信息所在列。

对于这种用法,甚至可以直接向ABCD指定logical运算结果,如:

1
2
3
4
5
6
7
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()

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

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

5、关于 ggvenn 实现

开发ggvenn包,我最初的主要目的,是为了方便自己使用,使能应付最常见的listdata.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 ---

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