[不靠谱颜论] 轻松上手用R语言绘制漂亮的维恩图
导言: 给大家介绍一个超易用的绘制维恩图的R包:ggvenn(基于ggplot2)
相信各位跟我一样,都曾遇到过这种情况:手上有几组数据,想快速画个维恩图出来,贴到报告中,于是上网搜索,找到一大堆工具,好不容易从中选出一个,学会其用法,也把数据成功转成所需格式,画出图来,却发现还得手动调整各种配色,然后,大半天就过去了……
几次折腾之后,我终于决定自己写一个 R 包,来快速且方便地绘制维恩图。因为是基于ggplot2
实现,所以索性取名ggvenn
。最近,我把这个R包成功提交到了 CRAN 上,安装使用起来就更方便了。
下面就直接进入正题,介绍如何快速上手使用ggvenn
。
1、安装
首先是安装:
|
|
安装完成后,将其载入,就可以开始绘制维恩图了:
|
|
2、基本用法
ggvenn
支持两种类型的数据作为输入,一种是list
类型(每个集合以向量形式保存在list
中):
|
|
另一种是data.frame
类型(每个集合以logical
列的形式,记录该集合中是否存在某元素):
|
|
上面展示的两种情况,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()
指定A
、B
、C
和D
(其中C
和D
可选),来指定集合信息所在列。
对于这种用法,甚至可以直接向A
、B
、C
和D
指定logical
运算结果,如:
|
|
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 包的帮助信息。具体可以使用如下命令查看:
|
|
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
注:本文发表于“不靠谱颜论”公众号,并同步至本站。