2014-11-24 41 views
1

我想繪製這樣的圖像,在堆疊的矩形內部有一些基礎圖形。在grid.layout中使用grid.layout與grid包:繪製順序的奇怪影響

enter image description here

我有一個繪圖功能,以產生與堆積圖(此矩形)的地塊:

stackedplot <- function(main=""){ 

    top.vp <- viewport(
    layout=grid.layout(5, 2, 
         widths=unit(c(2, 1), c("lines", "null")), 
         heights=unit(c(3, 1, 1, 1, 5), 
            c("lines", "null", "null", "null", "lines")))) 
    p1 <- viewport(layout.pos.col=2, layout.pos.row=2, name="plot1", 
       default.units="native") 
    p2 <- viewport(layout.pos.col=2, layout.pos.row=3, name="plot2", 
       default.units="native") 
    p3 <- viewport(layout.pos.col=2, layout.pos.row=4, name="plot3", 
       default.units="native") 
    xaxis <- viewport(layout.pos.col=2, layout.pos.row=5, name="xaxis") 
    label1 <- viewport(layout.pos.col=1, layout.pos.row=2, name="label1") 
    label2 <- viewport(layout.pos.col=1, layout.pos.row=3, name="label2") 
    label3 <- viewport(layout.pos.col=1, layout.pos.row=4, name="label3") 
    title <- viewport(layout.pos.col=2, layout.pos.row=1, name="title") 

    splot <- vpTree(top.vp, vpList(p1,p2,p3,xaxis,label1,label2,label3,title)) 
    pushViewport(splot) 

    seekViewport("plot1") 
    # par(plt=gridPLT()) # Needed for plotting base graphics, but not here 
    grid.rect(width=unit(0.9, "npc")) # This to be replaced with a base graphics plot in the final version 

    seekViewport("plot2") 
    # par(plt=gridPLT()) 
    grid.rect(width=unit(0.9, "npc")) 

    seekViewport("plot3") 
    # par(plt=gridPLT()) 
    grid.rect(width=unit(0.9, "npc")) 

    seekViewport("xaxis") 
    grid.text("X label", y = unit(3, "lines")) 

    seekViewport("label1") 
    grid.text("1", x = unit(2, "lines"), rot=90) 
    seekViewport("label2") 
    grid.text("2", x = unit(2, "lines"), rot=90) 
    seekViewport("label3") 
    grid.text("3", x = unit(2, "lines"), rot=90) 

    seekViewport("title") 
    grid.text(main, y = unit(1, "lines"), gp = gpar(fontsize = 20)) 
} 

創建具有四個堆疊地塊一個2x2格我嘗試使用下面的代碼:

grid.newpage() 
multitop.vp <- viewport(layout=grid.layout(2,2)) 
pl1 <- viewport(layout.pos.col=1, layout.pos.row=1, name="A") 
pl2 <- viewport(layout.pos.col=1, layout.pos.row=2, name="B") 
pl3 <- viewport(layout.pos.col=2, layout.pos.row=1, name="C") 
pl4 <- viewport(layout.pos.col=2, layout.pos.row=2, name="D") 
vpall <- vpTree(multitop.vp, vpList(pl1,pl2,pl3,pl4)) 
pushViewport(vpall) 
seekViewport("A") 
stackedplot(main="A") 
seekViewport("B") 
stackedplot(main="B") 
seekViewport("C") 
stackedplot(main="C") 
seekViewport("D") 
stackedplot(main="D") 

這不起作用,因爲所有的圖都繪製在網格的同一個單元格中。

enter image description here

但是,如果我以相反的順序繪製出來,我得到了我想要的圖形(圖1)。

seekViewport("D") 
stackedplot(main="D") 
seekViewport("C") 
stackedplot(main="C") 
seekViewport("B") 
stackedplot(main="B") 
seekViewport("A") 
stackedplot(main="A") 

我嘗試了不同的名稱,發現,如果我按顛倒的字母順序繪製,一切工作正常。一旦我嘗試在按名稱字母順序排列名稱的視口中繪圖,其後所有其他繪圖都繪製在同一個單元格中。這是爲什麼發生?

回答

0

經過網格包作者的一些幫助,我現在正在回答我自己的問題,以防其他人有用。

我的代碼創建了視口的層次結構,其中視口plot1和plot2出現多次。在這種情況下使用seekViewport函數會帶來問題。它總是從根開始搜索所請求的視口。然後它下降並找到第一個plot1,這是視口A下方的一個。因此,更好的選擇是使用upViewport和downViewport函數,如下面的代碼所示。

stackedplot <- function(main=""){ 

    top.vp <- viewport(
    layout=grid.layout(5, 2, 
         widths=unit(c(2, 1), c("lines", "null")), 
         heights=unit(c(3, 1, 1, 1, 5), 
            c("lines", "null", "null", "null", "lines")))) 
    p1 <- viewport(layout.pos.col=2, layout.pos.row=2, name="plot1", 
       default.units="native") 
    p2 <- viewport(layout.pos.col=2, layout.pos.row=3, name="plot2", 
       default.units="native") 
    p3 <- viewport(layout.pos.col=2, layout.pos.row=4, name="plot3", 
       default.units="native") 
    xaxis <- viewport(layout.pos.col=2, layout.pos.row=5, name="xaxis") 
    label1 <- viewport(layout.pos.col=1, layout.pos.row=2, name="label1") 
    label2 <- viewport(layout.pos.col=1, layout.pos.row=3, name="label2") 
    label3 <- viewport(layout.pos.col=1, layout.pos.row=4, name="label3") 
    title <- viewport(layout.pos.col=2, layout.pos.row=1, name="title") 

    splot <- vpTree(top.vp, vpList(p1,p2,p3,xaxis,label1,label2,label3,title)) 
    pushViewport(splot) 

    upViewport() 
    downViewport("plot1") 
    grid.rect(width=unit(0.9, "npc"), height=unit(0.9, "npc")) 

    upViewport() 
    downViewport("plot2") 
    grid.rect(width=unit(0.9, "npc"), height=unit(0.9, "npc")) 

    upViewport() 
    downViewport("plot3") 
    grid.rect(width=unit(0.9, "npc"), height=unit(0.9, "npc")) 

    upViewport() 
    downViewport("xaxis") 
    grid.text("X label", y = unit(3, "lines")) 

    upViewport() 
    downViewport("label1") 
    grid.text("1", x = unit(2, "lines"), rot=90) 

    upViewport() 
    downViewport("label2") 
    grid.text("2", x = unit(2, "lines"), rot=90) 

    upViewport() 
    downViewport("label3") 
    grid.text("3", x = unit(2, "lines"), rot=90) 


    upViewport() 
    downViewport("title") 
    grid.text(main, y = unit(1, "lines"), gp = gpar(fontsize = 20)) 

    upViewport(2) 
} 


grid.newpage() 
multitop.vp <- viewport(layout=grid.layout(2,2)) 
pl1 <- viewport(layout.pos.col=1, layout.pos.row=1, name="A") 
pl2 <- viewport(layout.pos.col=1, layout.pos.row=2, name="B") 
pl3 <- viewport(layout.pos.col=2, layout.pos.row=1, name="C") 
pl4 <- viewport(layout.pos.col=2, layout.pos.row=2, name="D") 
vpall <- vpTree(multitop.vp, vpList(pl1,pl2,pl3,pl4)) 
pushViewport(vpall) 
upViewport() 
downViewport("A") 
stackedplot(main="A") 
upViewport() 
downViewport("B") 
stackedplot(main="B") 
upViewport() 
downViewport("C") 
stackedplot(main="C") 
upViewport() 
downViewport("D") 
stackedplot(main="D") 
upViewport(2)