4

我试图将两个维恩图放在一个图中,即我在一开始就使用 par(mfrow=c(1,2)) 。但是,当我使用包Venn()中的函数时Vennerable

VennCompare = Venn(SetNames = c("A", "B", "C"), Weight = c(0, 38, 1, 0, 1, 80, 0, 14))
pdf(file="Venn.pdf", width=12, height=6)
par(mfrow=c(1,2))
plot(VennCompare, doWeights=FALSE)
plot(VennCompare, doWeights=TRUE, show = list(SetLabels = TRUE, Faces = FALSE))
dev.off()

生成的 pdf 文件包含 2 页,每页都有一个维恩图。

如何将这两个图表放在一个页面中(即并排)?

4

3 回答 3

4

正如评论中已经讨论的那样,Vennerable 使用网格图形并修复了包函数内的网格参数。你可能应该向包维护者询问他们是否可以在他们的包中添加这种功能,但与此同时,我为你提供了一个 Sketchof 一个黑客,它允许你做你想做的事:

第一个命令允许您编辑调用的函数,该函数makevp.eqsc似乎包含网格定义:

trace("makevp.eqsc",edit=TRUE) 

原始代码如下所示:

function (xrange, yrange) 
{
    pushViewport(plotViewport(name = "Vennmar", c(1, 1, 1, 1)))
    pushViewport(viewport(name = "Vennlay", layout = grid.layout(1, 
        1, widths = diff(xrange), heights = diff(yrange), respect = TRUE)))
    pushViewport(viewport(name = "Vennvp", layout.pos.row = 1, 
        layout.pos.col = 1, xscale = xrange, yscale = yrange))
}

最相关的部分是grid.layout,它告诉您要绘制什么样的网格。layout.pos.row 和 layout.pos.col 也很重要,它们告诉我们在哪个位置绘制。例如像这样更改代码:

function (xrange, yrange) 
{
    pushViewport(plotViewport(name = "Vennmar", c(1, 1, 1, 1)))
    pushViewport(viewport(name = "Vennlay", layout = grid.layout(2, 
        1, widths = diff(xrange), heights = diff(yrange), respect = TRUE)))
    pushViewport(viewport(name = "Vennvp", layout.pos.row = number, 
        layout.pos.col = 1, xscale = xrange, yscale = yrange))
} 

现在您将得到两个堆叠图,如下所示:

number<-1 #change the argument inside of makevp.eqsc
plot(VennCompare, doWeights=FALSE)
number<-2
plot(VennCompare, doWeights=TRUE, 
  show = list(SetLabels = TRUE, Faces = FALSE),add=TRUE) #note add=TRUE

这看起来不太好,但是通过修改makevp.eqsc您可能会获得更好的结果。

于 2013-03-09T20:09:52.143 回答
3

我无法安装该软件包,但在这里可能有帮助的一个技巧是使用 grid.grab 将绘图捕获到可以放置在其他地方的 grob 中,

library(grid)

myplot <- function(){

  pushViewport(viewport(x=0.5,width=1, just=0.5))
  grid.rect(gp=gpar(fill=grey(runif(1, 0.2, 0.8))))
  grid.points()
  popViewport()

}

p1 <- grid.grabExpr(myplot())
p2 <- grid.grabExpr(myplot())

library(gridExtra)

grid.arrange(p1, p2, ncol=2) 
于 2013-03-09T20:37:41.067 回答
0

试试这个:

v <- Venn(n=2)
plot(v)
grid.text("Title", vp = viewport(x=0.5, y=.9, w=unit(1, "npc"), h=unit(1, "npc")))
于 2014-02-13T05:24:59.590 回答