0%

R语言绘制韦恩图和upset图

本文总结一下:韦恩图、upset图。

1. 韦恩图

1.1 ggvenn

利用ggvenn绘制韦恩图,ggvenn的输入是一个list。

1
2
3
library(ggvenn)

a <- list(A=c(1,2,3,5,7),B=c(2,3,4,1,6),C=c(2,3,7,6,8),D=c(1,2,5,6,3))

ggvenn默认将所有的set都绘制韦恩图,也可以通过set名字指定数据集绘制韦恩图。

1
ggvenn(a)

alt 图标

1
ggvenn(a,c("A","B"))

alt 图标

1
ggvenn(a,c("A","B","C"))

alt 图标
美化一下:

1
2
3
4
5
6
list(A=a[[1]],B=a[[2]],C=a[[3]],D=a[[4]]) %>% 
ggvenn(show_percentage = T,show_elements = F,label_sep = ",",
digits = 1,stroke_color = "white",
fill_color = c("#E41A1C", "#1E90FF",
"#FF8C00","#4DAF4A"),
set_name_color = c("#E41A1C", "#1E90FF","#FF8C00","#4DAF4A"))

alt 图标

1.2 VennDiagram

利用VennDiagram包绘制韦恩图,会保存到文件里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
venn.plot <- venn.diagram(
x = list(A=c(1,2,3,5,7),B=c(2,3,4,1,6),C=c(2,3,7,6,8),D=c(1,2,5,6,3)),
filename = "Venn.png", imagetype = "png",
lwd = 3, lty="dotted",
fill = c("#E41A1C", "#1E90FF","#FF8C00","#4DAF4A"),
alpha = 0.6,
label.col = "white",
cex = 1.5,
fontfamily = "serif",
fontface = "bold",
cat.col = c("#E41A1C", "#1E90FF","#FF8C00","#4DAF4A"),
cat.cex = 2,
cat.fontfamily = "serif",
cat.fontface = "bold",
margin = 0.05)

alt 图标

1.3 VennDiagram提取交集元素

VennDiagram包中的函数get.venn.partitions()可以实现这个功能:

1
2
3
4
5
venn_list <- list(A=c(1,2,3,5,7),B=c(2,3,4,1,6),C=c(2,3,7,6,8),D=c(1,2,5,6,3))

inter <- get.venn.partitions(venn_list)
for (i in 1:nrow(inter)) inter[i,'values'] <- paste(inter[[i,'..values..']], collapse = ', ')
write.table(inter[-c(5, 6)], 'venn4_inter.txt', row.names = FALSE, sep = '\t', quote = FALSE)

venn4_inter.txt结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A       B       C       D       ..count..       values
TRUE TRUE TRUE TRUE 2 2, 3
FALSE TRUE TRUE TRUE 1 6
TRUE FALSE TRUE TRUE 0
FALSE FALSE TRUE TRUE 0
TRUE TRUE FALSE TRUE 1 1
FALSE TRUE FALSE TRUE 0
TRUE FALSE FALSE TRUE 1 5
FALSE FALSE FALSE TRUE 0
TRUE TRUE TRUE FALSE 0
FALSE TRUE TRUE FALSE 0
TRUE FALSE TRUE FALSE 1 7
FALSE FALSE TRUE FALSE 1 8
TRUE TRUE FALSE FALSE 0
FALSE TRUE FALSE FALSE 1 4
TRUE FALSE FALSE FALSE 0

2. upset图

UpSetR 提供了两个转换函数 fromList 和 fromExpression 用于格式化数据。

1
2
3
venn_list <- list(A=c(1,2,3,5,7,9,10),B=c(2,3,4,1,6),C=c(2,3,7,8),D=c(1,2,5,6,3,5,8,10,14,15))

upset(fromList(venn_list))

等价于:

1
2
b <- fromList(venn_list)
upset(b)

alt 图标

order.by默认升序排列,降序排列加decreasing=FALSE:

1
upset(fromList(venn_list), order.by = "freq")

alt 图标

1
upset(fromList(venn_list), order.by = "freq",descreasing = FALSE)

alt 图标

绘制部分集合:

1
upset(fromList(venn_list), nsets=2, order.by = "freq")

alt 图标

美化:

1
2
3
4
5
6
7
upset(fromList(venn_list), nsets = 6, 
number.angles = 30, # 柱子上方数字倾斜角度
point.size = 3.5, # 点的大小
line.size = 2, # 线的大小
mainbar.y.label = "Intersections",
sets.x.label = "set",
text.scale = c(1.3, 1.3, 1, 1, 2, 1))

text.scale 参数值的顺序为:

  • 柱状图的轴标签和刻度
  • 条形图的轴标签和刻度
  • 集合名称
  • 柱子上方表示交集大小的数值

alt 图标

参考资料:

  1. https://zhuanlan.zhihu.com/p/370210775