首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向venn图添加图例

向venn图添加图例
EN

Stack Overflow用户
提问于 2017-04-10 13:14:05
回答 3查看 3K关注 0票数 2

我正在使用库VennDiagram来绘制venn图。但此函数没有添加图例的功能,集合名称显示在或接近集合本身。

代码语言:javascript
复制
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函数,我发现最终绘制的对象是grob.list,它是一个gList对象,它使用grid.draw()绘制。

代码语言:javascript
复制
png(filename = filename, height = height, width = width, 
    units = units, res = resolution)
grid.draw(grob.list)
dev.off()

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

代码语言:javascript
复制
cols <- c("#80b1d3","#b3de69")
lg <- legendGrob(labels=category.names, pch=rep(19,length(category.names)),
                 gp=gpar(col=cols, fill="gray"),byrow=TRUE)

绘制对象lg

代码语言:javascript
复制
png(filename = filename, height = height, width = width, 
    units = units, res = resolution)
grid.draw(lg)
dev.off()

为了得到一个传奇

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

或者格格洛特风格

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-10 14:09:23

如果您想继续使用VennDiagram包并在途中学习一些grid

准备图表和图例

代码语言:javascript
复制
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)

将图表转换为gTree

(如果有人知道的话,我很想找到更好的方法)

代码语言:javascript
复制
library(gridExtra)

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

并排绘制两个gTree

代码语言:javascript
复制
gridExtra::grid.arrange(g, lg, ncol = 2, widths = c(4,1))

或者一个在另一个上面

代码语言:javascript
复制
grid.arrange(g, lg, nrow = 2, heights = c(4,1))

票数 1
EN

Stack Overflow用户

发布于 2017-04-10 14:00:54

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

代码语言:javascript
复制
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,您可以定义图例位置和外观。

票数 3
EN

Stack Overflow用户

发布于 2017-04-10 16:20:19

我也找到了一个解决方案,但是venn图区域不是方宽比。传说没有理想的间隔。

代码语言:javascript
复制
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()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43324180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档