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
与组的交叉区域b
,和组的圆内b
是群体的圈子b.1
和b.2
.
其主要思想是绘制一个三重维恩与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)