2012-06-17 35 views
1

我有兩個格子圖。我需要將一個位置放在另一個之上,我需要在它們之間有0.5英寸的垂直空間。我的想法是使用grid.layout來指定三行佈局,中間行的高度正好是0.5英寸。然後我可以打印一張圖到最上一行,其他圖打印到最下一行。用grid.layout繪製陰謀的確切位置

它幾乎工作。問題是,我不能讓中間一行是恰好0.5" 高這裏有一個小例子:

pdf(file='example.pdf', height=12) 

# Create layout and viewports 
masterLayout <- grid.layout(
    nrow = 3, 
    ncol = 1, 
    heights = unit(c(1, .5, 1), c("null", "inches", "null")), 
    respect = matrix(c(0, 1, 0))) 
vp1 <- viewport(layout.pos.row=1, just=c("center", "bottom")) 
vp2 <- viewport(layout.pos.row=3, just=c("center", "top"))  

# Create plots 
plot1 <- xyplot(1 ~ 1, panel = function() grid.rect(gp=gpar(fill="black"))) 
plot2 <- xyplot(1 ~ 1, panel = function() grid.rect(gp=gpar(fill="red")))  

# Push viewports and print plots 
pushViewport(viewport(layout = masterLayout)) 
pushViewport(vp1) 
print(plot1, newpage = FALSE) 
upViewport() 
pushViewport(vp2) 
print(plot2, newpage = FALSE) 

dev.off() 

我試過這個例子很多變化,但我一直沒能將地塊之間的距離固定在.5「。有沒有辦法做到這一點?

更新: baptiste下面的答案很好。參見Deepayan Sarkar在https://stat.ethz.ch/pipermail/r-help/2012-June/316178.html的回答。

回答

1

試試這個:

library(lattice) 
# Create layout and viewports 
masterLayout <- grid.layout(
    nrow = 3, 
    ncol = 1, 
    heights = unit(c(1, .5, 1), c("null", "inches", "null")), 
    respect = matrix(c(0, 1, 0))) 
vp1 <- viewport(layout.pos.row=1, name="vp1") 
vp2 <- viewport(layout.pos.row=3, name="vp2")  
vp3 <- viewport(layout.pos.row=2, name="spacer")  

theme.novpadding <- 
    list(layout.heights = 
     list(top.padding = 0, 
     main.key.padding = 0, 
     key.axis.padding = 0, 
     axis.xlab.padding = 0, 
     xlab.key.padding = 0, 
     key.sub.padding = 0, 
     bottom.padding = 0), 
     layout.widths = 
     list(left.padding = 0, 
     key.ylab.padding = 0, 
     ylab.axis.padding = 0, 
     axis.key.padding = 0, 
     right.padding = 0)) 

# Create plots 
plot1 <- xyplot(1 ~ 1, panel = function() grid.rect(gp=gpar(fill="black")), 
    scales=list(axs='i',draw=FALSE), 
    xlab=NULL,ylab=NULL,par.settings = theme.novpadding) 
plot2 <- xyplot(1 ~ 1, panel = function() grid.rect(gp=gpar(fill="red")), 
    scales=list(axs='i',draw=FALSE), 
    xlab=NULL,ylab=NULL,par.settings = theme.novpadding)  

grid.newpage() 
pushViewport(vpTree(viewport(layout = masterLayout,name="master"), vpList(vp1, vp2, vp3))) 
seekViewport("master") 
print(plot1, draw.in = "vp1") 
print(plot2, draw.in = "vp2") 
seekViewport("spacer") 
grid.rect() 

enter image description here

+0

非常感謝你。我試過你的代碼,它工作。但是我注意到它只在沒有指定panel.height時才起作用。例如,如果我只將print(plot1,draw.in =「vp1」)更改爲'print(plot1,draw.in =「vp1」,panel.height = list(x = 1,units =「in」 )'',矩形之間的空間突然佔據超過.5「。問題是plot1(即頂部矩形)沒有繪製在vp1的底部。有沒有辦法讓示例在面板工作。高度是指定爲一個還是兩個地塊? – user697473

+0

不幸的是,我不使用格子足以知道這個副作用,它似乎用視口做了些有趣的事情,如果我是,我會問Deepayan S.你。 – baptiste

+0

再次感謝。我發送了一條消息給r-help;如果我收到回覆,我會在這裏發佈一個鏈接。 – user697473