绘制嵌套的维恩图

use*_*545 6 nested r venn-diagram ggplot2

我有数据包含两组的二进制指示器,以及嵌套在前两组之一的更多组.

例如:

set.seed(1)
df <- data.frame(a=rep(0,10),b=rep(0,10),b.1=rep(0,10),b.2=rep(0,10))
df$a[sample(10,5,replace=F)] <- 1
df$b[sample(10,5,replace=F)] <- 1
df$b.1[sample(which(df$b==1),3,replace=F)] <- 1
df$b.2[sample(which(df$b==1),3,replace=F)] <- 1
df <- df[which(rowSums(df)==0),]
Run Code Online (Sandbox Code Playgroud)

a并且b是两个组,b.1并且b.2嵌套在组内b.

我想做的是绘制一个所有群体的维恩图.这意味着b.1并且b.2将被限制在内b,它将相交a.

有没有办法实现这个目标?使用ggplot解决方案会很棒.

尝试R's VennDiagram'仅针对群组b,b.1和b.2甚至不适合我:

library(VennDiagram)
draw.triple.venn(area1=sum(df$b),area2=sum(df$b.1),area3=sum(df$b.2),
                   n12=sum(df$b*df$b.1),n23=sum(df$b.1*df$b.2),n13=sum(df$b*df$b.2),n123=sum(df$b*df$b.1*df$b.2),
                   category=c("b","b1","b2"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

随着Vennerable包裹我接近只画"b"组:

library(Vennerable)
plot(Venn(Sets=list(b=which(df$b==1),b.1=which(df$b.1==1),b.2=which(df$b.2==1))),doEuler=T,doWeight=T)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是当我添加a组时它会搞砸: 在此输入图像描述

因为我真正需要的是一个圆圈组a与组的交叉区域b,和组的圆内b是群体的圈子b.1b.2.

Wei*_*ong 5

其主要思想是绘制一个三重维恩与a,b1,和b2,然后手动叠加为一个椭圆b.

library(VennDiagram)
library(gridExtra)
polygons <- draw.triple.venn(
    area1=sum(df$a),
    area2=sum(df$b.1),
    area3=sum(df$b.2),
    n12=sum(df$a*df$b.1),
    n23=sum(df$b.1*df$b.2),
    n13=sum(df$a*df$b.2),
    n123=sum(df$a*df$b.1*df$b.2),
    category=c("a","b1","b2"),
    margin=.1)
Run Code Online (Sandbox Code Playgroud)

现在我们绘制椭圆并添加标签.这需要相当多的试验和错误才能获得正确的位置,角度和大小.事实上,它并不完美,但它几乎就在那里.

b <- ellipseGrob(
    x=unit(0.562,"npc"),
    y=unit(0.515,"npc"),
    angle=(1.996*pi)/3,
    size=65.5, ar=2, gp=gpar(lwd=2.2))
grid.draw(b)
grid.text("b", x=unit(.9,"npc"), y=unit(.9,"npc"), gp=gpar(fontfamily="serif"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述