show.circle<-function(x,y,radius,border=NULL,col=NA) {
 angles<-seq(0,2*pi,by=0.04*pi)
 xpos<-cos(angles)*radius+x
 ypos<-sin(angles)*radius+y
 polygon(xpos,ypos)
}
 
venn4<-function(vo,mar=rep(1,4)) {
 dimvo<-dim(vo)
 if(dimvo[2] != 4)
  stop("Usage: venn4(vo,mar=rep(1,4))/n/twhere vo has 4 columns")
 plot(0,0,type="n",xlim=c(-2,2),ylim=c(-2,2),xlab="",ylab="",axes=FALSE)
 par(mar=mar)
 show.circle(-0.5,0.5,1.5)
 show.circle(0.5,0.5,1.5)
 show.circle(-0.5,-0.5,1.5)
 show.circle(0.5,-0.5,1.5)
 outside<-sum(apply(vo,1,sum) == 0)
 text(-1.2,1.4,"A")
 text(1.2,1.4,"B")
 text(-1.2,-1.1,"C")
 text(1.2,-1.1,"D")
 text(0,1.4,"AB")
 text(-1.3,0.15,"AC")
 text(1.2,0.15,"BD")
 text(0,-1.1,"CD")
 text(-0.6,0.9,"ABC")
 text(0.6,0.9,"ABD")
 text(-0.83,-0.5,"ACD")
 text(0.83,-0.5,"BCD")
 text(0,0.1,"ABCD")
 par(xpd=TRUE,cex=1.5)
 text(0,-2.4,outside)
 onlyone<-apply(vo,1,sum) == 1
 A<-sum(onlyone & vo[,1])
 text(-1.2,1.1,A)
 B<-sum(onlyone & vo[,2])
 text(1.2,1.1,B)
 C<-sum(onlyone & vo[,3])
 text(-1.2,-1.4,C)
 D<-sum(onlyone & vo[,4])
 text(1.2,-1.4,D)
 onlytwo<-apply(vo,1,sum) == 2
 AB<-sum(onlytwo & vo[,1] & vo[,2])
 text(0,1.1,AB)
 AC<-sum(onlytwo & vo[,1] & vo[,3])
 text(-1.3,-0.15,AC)
 BD<-sum(onlytwo & vo[,2] & vo[,4])
 text(1.2,-0.15,BD)
 CD<-sum(onlytwo & vo[,3] & vo[,4])
 text(0,-1.4,CD)
 onlythree<-apply(vo,1,sum) == 3
 ABC<-sum(onlythree & vo[,1] & vo[,2] & vo[,3])
 text(-0.74,0.65,ABC)
 ABD<-sum(onlythree & vo[,1] & vo[,2] & vo[,4])
 text(0.74,0.65,ABD)
 ACD<-sum(onlythree & vo[,1] & vo[,3] & vo[,4])
 text(-0.7,-0.75,ACD)
 BCD<-sum(onlythree & vo[,2] & vo[,3] & vo[,4])
 text(0.7,-0.75,BCD)
 ABCD<-sum(apply(vo,1,sum) == 4)
 text(0,-0.2,ABCD)
 par(mar=c(5,4,4,2)+0.1,xpd=FALSE,cex=1)
}