如何使用R从含多组交集计数的表格绘制韦恩图?
用R基于预计算的交集计数绘制四组韦恩图
你遇到的这个问题确实挺常见的——像limma、VennDiagram这类包通常需要原始元素列表或者各个唯一区域的计数(比如只属于A的元素数),而不是直接给的交集大小。不过别担心,我们有更合适的工具,下面给你两种可行的方案:
方案一:用eulerr包直接处理交集计数(推荐)
eulerr包专门支持通过预定义的交集/并集计数来生成韦恩图,不需要手动拆分区域。步骤如下:
- 安装并加载包:
install.packages("eulerr") library(eulerr)
- 把你的计数整理成命名向量,注意集合之间用
&连接:
# 对应你给出的计数表 venn_counts <- c( "A" = 8, "B" = 8, "C" = 9, "D" = 7, "A&B" = 5, "A&C" = 5, "A&D" = 3, "B&C" = 6, "B&D" = 4, "C&D" = 4, "A&B&C" = 4, "A&B&D" = 2, "A&C&D" = 2, "B&C&D" = 3, "A&B&C&D" = 2 )
- 生成韦恩图模型并绘图:
这里关键是设置input = "intersection",告诉函数我们传入的是各个交集的大小:
# 拟合韦恩图模型 venn_model <- euler(venn_counts, input = "intersection") # 自定义样式绘制 plot(venn_model, fills = list(fill = c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3"), alpha = 0.5), labels = list(font = 4), # 斜体标注组名 quantities = list(font = 2)) # 加粗显示区域计数
运行后就能得到符合你需求的四组韦恩图,eulerr会自动帮你计算各个唯一区域的元素数。
方案二:手动计算唯一区域计数,用VennDiagram绘制
如果你更习惯用VennDiagram,可以通过容斥原理手动计算每个唯一区域的数量(比如只属于A、属于A+B但不属于C/D等),再传入函数:
- 先计算所有唯一区域的数值:
- 只属于A:
8 - (5+5+3 -4-2-2 +2) = 1 - 只属于B:
8 - (5+6+4 -4-2-3 +2) = 0 - 只属于C:
9 - (5+6+4 -4-2-3 +2) = 1 - 只属于D:
7 - (3+4+4 -2-2-3 +2) = 1 - 属于A&B但不属于C/D:
5 -4-2 +2 =1 - 属于A&C但不属于B&D:
5 -4-2 +2 =1 - 属于A&D但不属于B&C:
3 -2-2 +2 =1 - 属于B&C但不属于A&D:
6 -4-3 +2 =1 - 属于B&D但不属于A&C:
4 -2-3 +2 =1 - 属于C&D但不属于A&B:
4 -2-3 +2 =1 - 属于A&B&C但不属于D:
4 -2 =2 - 属于A&B&D但不属于C:
2 -2 =0 - 属于A&C&D但不属于B:
2 -2 =0 - 属于B&C&D但不属于A:
3 -2 =1 - 四者交集:
2
- 用
VennDiagram绘制:
install.packages("VennDiagram") library(VennDiagram) venn.diagram( x = list( A = 1, B = 0, C = 1, D = 1, "A&B" = 1, "A&C" = 1, "A&D" = 1, "B&C" = 1, "B&D" = 1, "C&D" = 1, "A&B&C" = 2, "A&B&D" = 0, "A&C&D" = 0, "B&C&D" = 1, "A&B&C&D" = 2 ), filename = "four_set_venn.png", # 输出图片路径 fill = c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3"), alpha = 0.5, label.col = "black", fontface = "bold", cat.col = c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3"), cat.fontface = "bold" )
这种方法需要手动计算,容易出错,所以更推荐方案一。
内容的提问来源于stack exchange,提问作者Miguel




