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

如何在R语言中绘制包含样本量外圈的三元维恩图?

在R语言中实现三元维恩图加样本总量外圈的方法

问题说明

需要创建一幅被代表样本总量的大圆圈包裹的三元维恩图。此前通过draw.triple.venn模拟出了二元维恩图加外圈的效果,但尝试用draw.quad.venn复刻该逻辑时,得到的是四元叶子状图,而非预期的「三元维恩图被大圆圈完全包裹」的样式。

解决方案

直接用四元维恩图函数无法实现需求,正确思路是先绘制三元维恩图,再手动添加代表样本总量的外圈,以下提供两种可行方法:

方法1:基于VennDiagram + grid包实现

通过VennDiagram绘制三元维恩图,再用grid包的绘图函数添加外圈和标签,精准控制样式:

library(VennDiagram)
library(grid)

# 定义示例数据
count_A <- 100
count_B <- 80
count_C <- 70
count_AB <- 30
count_BC <- 20
count_AC <- 25
count_ABC <- 10
count_sample <- 200

# 绘制核心三元维恩图
grid.newpage()
venn_ABC <- draw.triple.venn(
  area1 = count_A, area2 = count_B, area3 = count_C,
  n12 = count_AB, n23 = count_BC, n13 = count_AC, n123 = count_ABC,
  category = c("A", "B", "C"),
  col = "Purple", fill = c("Red", "Blue", "Orange"), 
  lty = "dashed", print.mode = c('raw', 'percent')
)

# 添加代表样本总量的外圈
venn_center <- unit(0.5, "npc")  # 以绘图区域中心为圆心
outer_radius <- unit(0.6, "npc") # 半径可根据图大小调整
grid.circle(
  x = venn_center, y = venn_center, r = outer_radius,
  gp = gpar(col = "Purple", fill = "Yellow", lty = "dashed", alpha = 0.2)
)

# 添加外圈标签
grid.text("Sample Size", x = venn_center, y = venn_center + outer_radius + unit(0.05, "npc"),
          gp = gpar(fontsize = 12, fontface = "bold"))
grid.text(paste("Total:", count_sample), x = venn_center, y = venn_center - outer_radius - unit(0.05, "npc"),
          gp = gpar(fontsize = 10))

方法2:基于ggVennDiagram + ggplot2实现

适合熟悉ggplot生态的场景,通过annotate快速添加外圈元素:

library(ggVennDiagram)
library(ggplot2)

# 构造集合示例数据
set_A <- sample(1:count_sample, count_A)
set_B <- sample(1:count_sample, count_B)
set_C <- sample(1:count_sample, count_C)
venn_list <- list(A = set_A, B = set_B, C = set_C)

# 绘制三元维恩图并添加外圈
p <- ggVennDiagram(venn_list, fill_color = c("Red", "Blue", "Orange"),
                   stroke_color = "Purple", linetype = "dashed",
                   show_percentage = TRUE) +
  annotate("circle", x = 0, y = 0, radius = 1.2, # 调整半径适配图尺寸
           color = "Purple", fill = "Yellow", linetype = "dashed", alpha = 0.2) +
  annotate("text", x = 0, y = 1.4, label = "Sample Size", size = 4, fontface = "bold") +
  annotate("text", x = 0, y = -1.4, label = paste("Total:", count_sample), size = 3) +
  coord_fixed() # 强制保持圆形比例

print(p)

原方法失败原因

draw.quad.venn是专门绘制四元维恩图的函数,其布局逻辑是四个相互交叠的叶子状集合,而非「三个集合加一个包裹式外圈」的结构,因此无法通过该函数实现预期效果。

内容的提问来源于stack exchange,提问作者mhfren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:34:56