将图例添加到维恩图

时间:2017-04-10 13:14:06

标签: r r-grid

我使用库VennDiagram绘制维恩图。但是此功能没有添加图例的功能,并且设置名称显示在集合本身上或附近。

library(VennDiagram)
x <- list(c(1,2,3,4,5),c(4,5,6,7,8,9,10))
venn.diagram(x,filename="test.png",fill=c("#80b1d3","#b3de69"),
             category.names=c("A","B"),height=500,width=500,res=150)

venn-diagram

对于许多套装,过度绘制名称是一个问题,我希望有一个传奇。该功能建立在网格图形上,我不知道网格绘图是如何工作的。但是,无论如何,我试图添加一个传奇。

查看venn.diagram函数,我发现最终绘制的对象是grob.list,它是一个gList对象,使用grid.draw()绘制。

png(filename = filename, height = height, width = width, 
    units = units, res = resolution)
grid.draw(grob.list)
dev.off()

我发现我可以通过使用以下代码修改venn.diagram函数来创建图例。

cols <- c("#80b1d3","#b3de69")
lg <- legendGrob(labels=category.names, pch=rep(19,length(category.names)),
                 gp=gpar(col=cols, fill="gray"),byrow=TRUE)

绘制对象lg

png(filename = filename, height = height, width = width, 
    units = units, res = resolution)
grid.draw(lg)
dev.off()

获取传奇

legend

如何以可用的方式将维恩图(gList)和图例(gTree,grob)放在一起?我希望得到像基本情节风格的东西:

plot-with-legend

或ggplot风格

plit-with-legend

3 个答案:

答案 0 :(得分:1)

如果您允许使用VennDiagram以外的其他软件包,我建议使用eulerr软件包以下代码:

library(eulerr)

vd <- euler(c(A = 5, B = 3, "A&B" = 2))
plot(vd, counts = TRUE,lwd = 2,
     fill=c("#80b1d3","#b3de69"),
     opacity = .7,
     key = list( space= "right", columns=1))

使用key定义图例位置和外观。

enter image description here

答案 1 :(得分:1)

如果您想继续使用grid套餐并在途中了解一点library(VennDiagram) x <- list(c(1,2,3,4,5),c(4,5,6,7,8,9,10)) diag <- venn.diagram(x,NULL,fill=c("#80b1d3","#b3de69"), category.names=c("A","B"),height=500,width=500,res=150) cols <- c("#80b1d3","#b3de69") lg <- legendGrob(labels=c("A","B"), pch=rep(19,length(c("A","B"))), gp=gpar(col=cols, fill="gray"), byrow=TRUE)

准备图表和图例

library(gridExtra)

g <- gTree(children = gList(diag))

将图表转换为gTree

(如果有人知道,我很乐意找到更好的方式)

gTree

并排绘制两个gridExtra::grid.arrange(g, lg, ncol = 2, widths = c(4,1))

grid.arrange(g, lg, nrow = 2, heights = c(4,1))

或者一个在另一个之上

{{1}}

答案 2 :(得分:1)

我也找到了解决方案,但维恩图区域不是方形纵横比。并且这个传说没有理想的间隔。

library(gridGraphics)

png("test.png",height=600,width=600)
grab_grob <- function(){grid.echo();grid.grab()}
grid.draw(diag)
g <- grab_grob()
grid.arrange(g,lg,ncol=2,widths=grid::unit(c(0.7,0.3),"npc"))
dev.off()

plot