已知集合交集数量绘制韦恩图

大部分R包无法直接根据已知的交集数量绘制 Venn 图,必须依赖提供的集合元素列表进行计算,但是少部分R包可以,比如VennDiagram包

绘制venn图的R包包括 VennDiagram、ggVennDiagram 和 eulerr,每个包都有其独特的优势和适用场景,但是其中很多包在处理大量数据的时候都存在一个显著的问题,那就是出图的速度很慢,主要原因是R包计算交集的时间复杂度高:对于 n 个集合,如果每个集合有 m 个元素,算法需要遍历所有元素并检查它们属于哪些交集组合,近似为 O(m * 2^n),当 n 或 m 较大时,计算量呈指数级增长。因此,当每个集合中的元素过多时(比如几十万个基因),最佳的方式就是预先计算出每个集合间交集的数量,也就是不让R包去进行这个计算过程,直接根据结果绘图。大部分R包无法直接根据已知的交集数量绘制 Venn 图,必须依赖提供的集合元素列表进行计算,但是少部分R包可以,比如VennDiagram包,VennDiagram还给我们提供了另外几个函数:绘制两个集合的韦恩图的dra w.pairwise.venn,三个集合的draw.triple.venn,四个、五个集合的draw.quad.venn、draw.quintuple.venn。

attachments-2025-03-1yuWSBey67c949223d630.png已知交集数量绘制venn

已知集合之间的交集元素数量,假设有四个集合,可以使用VennDiagram包的draw.quad.venn等函数绘制venn图(这里我们用四个集合举例,其他的函数用法相似):

#加载包
library(VennDiagram)
#绘图
draw.quad.venn(area1=13886524, area2=13149670, area3=10431375, area4=4570238, n12=8593, n13=37496, n14=5542, n23=1242, n24=800043,
  n34=1011, n123=89, n124=953, n134=36, n234=81, n1234=28, #area1为集合1,n12为集合1和集合2的交集元素数量,以此类推
  category =c("A","B","C","D"), #指定集合名称
  filename = NULL,
  col =rep("black", 4),  
  fill = c("cornflowerblue", "green", "yellow", "darkorchid1"),
  alpha = 0.50,
  label.col = c("orange", "white", "darkorchid4", "white",
                "white", "white", "white", "white", "darkblue", "white", 
                "white", "white", "white", "darkgreen", "white"),
  cex = 1.5,
  fontfamily = "serif",
  fontface = "bold",
  cat.col = c("darkblue", "darkgreen", "orange", "darkorchid4"),
  cat.cex = 1.5,
  cat.pos = 0,
  cat.dist = 0.07,
  cat.fontfamily = "serif",
  rotation.degree = 270,
  margin = 0.2
)

attachments-2025-03-D39SwRaK67c94a5c183d4.png

除此之外,也可以使用eulerr包,eulerr包的优势在于可以用面积大小代表元素数量(比较适合3个集合的venn图,绘制4个集合可能会有bug):

# 加载eulerr包  
library(eulerr)  

# 定义集合的大小和交集的数量  
# 假设集合A、B、C的大小分别为:  
size_A <- 10   # 仅A的元素数  
size_B <- 15   # 仅B的元素数  
size_C <- 20   # 仅C的元素数  

# 任意两个集合交集的数量  
intersect_AB <- 5  # A和B的交集  
intersect_AC <- 3  # A和C的交集  
intersect_BC <- 7  # B和C的交集  

# 所有集合的总交集元素数(假设有一个三集合交集的元素数)  
intersect_ABC <- 2  # A、B和C的交集  

# 使用eulerr绘制韦恩图  
venn_data <- euler(c(  
  "A" = size_A,  
  "B" = size_B,  
  "C" = size_C,  
  "A&B" = intersect_AB,  
  "A&C" = intersect_AC,  
  "B&C" = intersect_BC,  
  "A&B&C" = intersect_ABC  
))  

# 绘制韦恩图  
plot(venn_data,quantities =TRUE)

attachments-2025-03-TUZ8NG4C67c94ad608420.png


  • 发表于 2天前
  • 阅读 ( 36 )
  • 分类:R

0 条评论

请先 登录 后评论
每天学习一点点
每天学习一点点

54 篇文章

作家榜 »

  1. omicsgene 712 文章
  2. 安生水 353 文章
  3. Daitoue 167 文章
  4. 生物女学霸 120 文章
  5. xun 84 文章
  6. rzx 81 文章
  7. 红橙子 78 文章
  8. CORNERSTONE 72 文章