You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:37:23