Параллельная диаграмма Венна с использованием Vennerable

Я пытаюсь поместить две диаграммы Венна в один график, т.е. я использую 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 страницы, каждая из которых имеет одну диаграмму Венна.

Как разместить две диаграммы на одной странице (т.е. рядом)?


person alittleboy    schedule 09.03.2013    source источник
comment
Vennerable, похоже, использует сеточную графику вместо базовой графики R, поэтому par (mfrow = c (1,2)) не будет работать.   -  person Jouni Helske    schedule 09.03.2013
comment
@Hemmo: спасибо! Итак, как я могу создавать параллельные графики в среде сетки?   -  person alittleboy    schedule 09.03.2013
comment
Я пытался построить их, используя стандартные методы grid, и похоже, что plot(VennCompare) не отвечает на методы порта просмотра.   -  person Bryan Hanson    schedule 09.03.2013
comment
@BryanHanson: это именно то, что я получил только что ... он не работает, если я передаю p1 = plot (VennCompare) ...   -  person alittleboy    schedule 09.03.2013
comment
Я думаю, вам, возможно, придется связаться с сопровождающим пакета. Им нужно добавить поддержку аргумента области просмотра, и, похоже, в их методе есть эквивалент новой страницы.   -  person Bryan Hanson    schedule 09.03.2013


Ответы (3)


Как уже обсуждалось в комментариях, 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, вы, вероятно, сможете получить более хорошие результаты.

person Jouni Helske    schedule 09.03.2013
comment
@Hemmo: спасибо, чувак! это работает очень хорошо: я немного изменил ваши параметры, чтобы получить параллельные графики 1 на 2 :) - person alittleboy; 10.03.2013

Я не смог установить этот пакет, но здесь может помочь трюк - использовать grid.grab для захвата рисунка в гроб, который можно разместить в другом месте,

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) 
person baptiste    schedule 09.03.2013
comment
Это работает, но вам не нужны детали pushViewport и popViewport, по крайней мере, для меня, использующего Vennerable 3.1.0.9000. Выполнение grid.grabExpr и использование grid.arrange отлично работало непосредственно с функцией plot. Спасибо! - person Gungor Budak; 19.08.2019

Попробуй это:

v <- Venn(n=2)
plot(v)
grid.text("Title", vp = viewport(x=0.5, y=.9, w=unit(1, "npc"), h=unit(1, "npc")))
person Sébastien Brodeur    schedule 13.02.2014