向维恩图添加图例
Adding legend to venn diagram
我正在使用库 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 函数,我发现最终绘制的对象是 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()
获得图例
如何以可用的方式将维恩图 (gList) 和图例 (gTree,grob) 放在一起?我希望得到类似基本情节风格的东西:
或 ggplot 样式
如果允许您使用 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
定义图例位置和外观。
如果您想继续使用 VennDiagram
包并在途中学习一点 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)
将图表转换为 gTree
(如果有人知道,我很乐意找到更好的方法)
library(gridExtra)
g <- gTree(children = gList(diag))
并排绘制两个 gTree
s
gridExtra::grid.arrange(g, lg, ncol = 2, widths = c(4,1))
或一个在另一个之上
grid.arrange(g, lg, nrow = 2, heights = c(4,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()
我正在使用库 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 函数,我发现最终绘制的对象是 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()
获得图例
如何以可用的方式将维恩图 (gList) 和图例 (gTree,grob) 放在一起?我希望得到类似基本情节风格的东西:
或 ggplot 样式
如果允许您使用 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
定义图例位置和外观。
如果您想继续使用 VennDiagram
包并在途中学习一点 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)
将图表转换为 gTree
(如果有人知道,我很乐意找到更好的方法)
library(gridExtra)
g <- gTree(children = gList(diag))
并排绘制两个 gTree
s
gridExtra::grid.arrange(g, lg, ncol = 2, widths = c(4,1))
或一个在另一个之上
grid.arrange(g, lg, nrow = 2, heights = c(4,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()