如何基于R语言dataframe绘制四集合韦恩图(Venn Diagram)
四集合韦恩图绘制方案
你提供的df1构造代码中Event4向量长度为5,和其他列长度不匹配,补全Jorge对应的0值即可正常运行。
核心逻辑
韦恩图的计数规则为:每个区域的数字代表「仅属于该区域对应事件组合、不属于其余事件」的样本量,只要将每个事件对应的样本名称整理为列表传入绘图函数,即可得到完全符合预期的结果。
方案1:ggvenn包(ggplot2风格,适配ggplot2图层语法)
- 加载依赖、构造正确数据集
library(ggvenn) # 构造正确格式的df1 Name <- c("Amanda", "Emily", "George", "Baker", "Lee", "Jorge") Event1 <- c(1,0,1,0,1,0) Event2 <- c(1,0,0,0,1,1) Event3 <- c(1,1,0,1,1,0) Event4 <- c(1,1,0,0,1,0) df1 <- data.frame(Name, Event1, Event2, Event3, Event4)
- 整理绘图输入格式(列表格式兼容性最好,不会出现计数错误)
venn_setlist <- list( Event1 = df1$Name[df1$Event1 == 1], Event2 = df1$Name[df1$Event2 == 1], Event3 = df1$Name[df1$Event3 == 1], Event4 = df1$Name[df1$Event4 == 1] )
- 绘图
ggvenn( data = venn_setlist, fill_color = c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3"), stroke_size = 0.5, set_name_size = 4, text_size = 3 )
计数校验(和原始数据完全匹配):
- 四事件共同交集:Amanda、Lee,共2个
- 仅Event3独有:Baker,共1个
- Event3与Event4双交集(不含其余事件):Emily,共1个
- 仅Event1独有:George,共1个
- 仅Event2独有:Jorge,共1个
- 其余双事件、三事件交集区域样本量为0
方案2:VennDiagram包(基础绘图体系,支持直接导出高清矢量图)
library(VennDiagram) library(grid) # 复用上面构造好的venn_setlist venn_p <- venn.diagram( x = venn_setlist, filename = NULL, fill = c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3"), alpha = 0.5, cex = 1.2, cat.cex = 1.2, margin = 0.1 ) grid.newpage() grid.draw(venn_p)
之前绘图失败的常见原因:一是数据构造阶段Event4向量长度不足,导致值错位、数据框生成报错;二是直接传入包含Name列的完整数据框,函数误将非事件列纳入集合计算,或0/1值未正确映射样本导致计数错误。
内容的提问来源于stack exchange,提问作者dkcongo
相关产品推荐
相关产品推荐

