ggVennDiagram
是一个用于绘制 Venn 图的 R 语言软件包。最初,我只是在需要画 Venn
图的时候,发现没有一件趁手的工具,而最终不得不写了一个给自己用的工具。随后,
抱着试一试的态度发布到了 GitHub 和 CRAN 上面。结果引起了用户持续的关注和好评,
截止今日已经获得了超过 100 个小星星。
在 CRAN 上面也已经被累计下载了 2 万多次了。
考虑到原来的设计和代码是十分粗糙的,所以我在 1.0 版本的时候,完全重构了 ggVennDiagram
1。
为此,系统调研了 R 环境中可用的 Venn 图绘制工具,博取众家之长,并增强了自己原有的特色和优势。
重生后的 ggVennDiagram
用起来更加方便,功能也更加强大,同时以后的扩展性也会非常好。
下面是一些使用的示例:
先生成一个示例数据:
genes <- paste0("gene",1:1000)
set.seed(20210502)
gene_list <- list(A = sample(genes,100),
B = sample(genes,200),
C = sample(genes,300),
D = sample(genes,200))
library(ggVennDiagram)
设置集合标签的内容,颜色和大小
标签图层在最上面,不会被填充遮盖。但是如果是非常长的标签,可能会显示不完整。
此时只需要应用一个 ggplot2
函数即可。
ggVennDiagram(gene_list,
category.names = c("a very long name","short name","name","another name"),
set_color = c("red1","red2","red3","red4"),
set_size = 6) +
scale_x_continuous(expand = expansion(mult = .2))
显示区域中的成员
我们使用 plotly
对区域成员进行了可视化,现在鼠标悬停即可以查看区域成员。
同时,也支持将成员打印出来。
ggVennDiagram(gene_list, show_intersect = TRUE)
## Warning: Ignoring unknown aesthetics: text
设定区域标签的内容、颜色和大小
ggVennDiagram(gene_list, label = "count", label_color = "blue", label_size = 4)
ggVennDiagram(gene_list, label = "both", label_percent_digit = 1, label_size = 3)
设定椭圆的边
ggVennDiagram(gene_list, edge_lty = "dashed", edge_size = 1)
换一个配色
填充色映射到不同的区域中。
ggVennDiagram(gene_list) + scale_fill_distiller(palette = "RdBu")
线条颜色映射到不同的集合上。
ggVennDiagram(gene_list) + scale_color_brewer(palette = "Set1")
更多维度的 Venn 图
通过导入另一个 R 包 venn
中的数据集,将 5-7 维度的 Venn 图画法移植了过来。
genes <- paste0("gene",1:1000)
set.seed(20210507)
x <- list(A = sample(genes,100),
B = sample(genes,150),
C = sample(genes,200),
D = sample(genes,250),
E = sample(genes,300),
F = sample(genes,350),
G = sample(genes,400))
由于是用的不规则多边形,所以这些 Venn 图可能辨别起来会比较费劲,但是乍看上去还是蛮漂亮的。
ggVennDiagram(x, label = "none", edge_size = 2) + scale_fill_distiller(palette = "RdBu")
ggVennDiagram(x[1:6], label = "none", edge_size = 2) + scale_fill_distiller(palette = "RdBu")
ggVennDiagram(x[1:5], label = "none", edge_size = 2) + scale_fill_distiller(palette = "RdBu")
自由定制
ggVennDiagram
将 Venn 图分为了 3 个部分,集合的标签,集合的边缘,集合的交叉,
分别称为 setLabel
,setEdge
和 region
。我们所做的主要工作是将繁琐的集合间计算
过程包装了起来(包括多边形区域的坐标及其对应成员的统计),并将计算的结果返回,
然后使用 ggplot
画图。
venn <- Venn(gene_list)
data <- process_data(venn)
ggplot() +
# 1. region count layer
geom_sf(aes(fill = count), data = venn_region(data)) +
# 2. set edge layer
geom_sf(aes(color = id), data = venn_setedge(data), show.legend = FALSE) +
# 3. set label layer
geom_sf_text(aes(label = name), data = venn_setlabel(data)) +
# 4. region label layer
geom_sf_label(aes(label = count), data = venn_region(data)) +
theme_void()
对于熟悉 ggplot
作图的用户来说,他完全可以任意定制作图的格式。
ggplot() +
# change mapping of color filling
geom_sf(aes(fill = id), data = venn_region(data), show.legend = FALSE) +
# adjust edge size and color
geom_sf(color="grey", size = 3, data = venn_setedge(data), show.legend = FALSE) +
# show set label in bold
geom_sf_text(aes(label = name), fontface = "bold", data = venn_setlabel(data)) +
# add a alternative region name
geom_sf_label(aes(label = name), data = venn_region(data), alpha = 0.5) +
theme_void()
新的 ggVennDiagram
更好用,更优雅。每一个绘制 Venn 图的朋友可能都会用得上。
同时也是为了能够作为一篇文章发表。↩︎