绘制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。
已知交集数量绘制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 )
除此之外,也可以使用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)
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!