You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用R从含多组交集计数的表格绘制韦恩图?

用R基于预计算的交集计数绘制四组韦恩图

你遇到的这个问题确实挺常见的——像limmaVennDiagram这类包通常需要原始元素列表或者各个唯一区域的计数(比如只属于A的元素数),而不是直接给的交集大小。不过别担心,我们有更合适的工具,下面给你两种可行的方案:

方案一:用eulerr包直接处理交集计数(推荐)

eulerr包专门支持通过预定义的交集/并集计数来生成韦恩图,不需要手动拆分区域。步骤如下:

  1. 安装并加载包:
install.packages("eulerr")
library(eulerr)
  1. 把你的计数整理成命名向量,注意集合之间用&连接:
# 对应你给出的计数表
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
)
  1. 生成韦恩图模型并绘图:
    这里关键是设置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等),再传入函数:

  1. 先计算所有唯一区域的数值:
  • 只属于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
  1. 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

火山引擎 最新活动