如何用R生成与tibble表数值一致的维恩图?
匹配精神障碍共患数据的维恩图实现方案
保留生成tibble表的可复现代码
library(tibble) # 生成包含仅患、共患人数的tibble表(总样本量N=490) cmd_data <- tibble( group = c("仅PTSD", "仅ANX", "仅DEP", "PTSD+ANX", "PTSD+DEP", "ANX+DEP", "PTSD+ANX+DEP", "无任何障碍"), count = c(35, 42, 28, 15, 12, 18, 8, 332) ) cmd_data
核心问题:维恩图的输入逻辑误解
大部分维恩图包(包括VennDiagram、ggVennDiagram)默认需要个体层面的障碍归属数据(即哪些样本属于哪个障碍集合),而非直接输入分组汇总的计数。如果你直接把"仅患""共患"的数值喂给包,包会自行计算交集,无法匹配你预设的汇总结果——这是最常见的误解点。
以下是两种直接匹配你tibble数据的实现方法:
方法1:使用ggVennDiagram包
先基于汇总数据生成个体集合,再传入包绘制:
library(ggVennDiagram) # 从汇总数据构建各障碍对应的个体ID集合(用序号代替实际ID) ptsd_ids <- c(1:35, 36:50, 51:62, 63:70) # 仅PTSD(35)+PTSD+ANX(15)+PTSD+DEP(12)+三者共患(8) anx_ids <- c(71:112, 36:50, 113:130, 63:70) # 仅ANX(42)+PTSD+ANX(15)+ANX+DEP(18)+三者共患(8) dep_ids <- c(131:158, 51:62, 113:130, 63:70) # 仅DEP(28)+PTSD+DEP(12)+ANX+DEP(18)+三者共患(8) # 整理成列表格式 cmd_sets <- list( PTSD = ptsd_ids, ANX = anx_ids, DEP = dep_ids ) # 绘制维恩图,自动匹配各区域计数 ggVennDiagram(cmd_sets) + scale_fill_gradient(low = "white", high = "#4292c6") + labs(title = "三种精神障碍共患情况")
方法2:使用VennDiagram包(直接指定区域计数)
部分版本的VennDiagram支持直接传入预计算的区域计数,无需构建个体集合:
library(VennDiagram) library(grid) # 提取维恩图各区域的计数,顺序严格为:仅PTSD、仅ANX、PTSD+ANX、仅DEP、PTSD+DEP、ANX+DEP、三者共患 region_counts <- c(35, 42, 15, 28, 12, 18, 8) # 绘制维恩图 venn_plot <- venn.diagram( x = list(PTSD = NULL, ANX = NULL, DEP = NULL), filename = NULL, # 不保存到文件,直接在绘图窗口展示 fill = c("#e41a1c", "#377eb8", "#4daf4a"), alpha = 0.5, cat.cex = 1.2, cex = 1.5, main = "三种精神障碍共患分布", count = region_counts # 直接传入预计算的区域计数 ) grid.draw(venn_plot)
额外说明
- 维恩图仅展示至少患有一种障碍的人群(你的数据中是490-332=158人),"无任何障碍"的样本不会出现在图内,可在图旁标注补充说明。
- 若你的原始数据是个体层面的二进制矩阵(每行一个样本,列是PTSD/ANX/DEP的0/1状态),可直接传入包,无需手动构建集合,包会自动计算各区域计数。
内容的提问来源于stack exchange,提问作者pdeli
相关产品推荐
相关产品推荐

