2015-09-07 61 views
3

我試圖創建一個類似的佈局,以寬度不堅持使用grid.layout時

Example layout

但是,不管我設置的佈局一直使用電池板的整個寬度Plot的寬度以用下面的代碼:

masterLayout <- grid.layout(
    nrow = 4, 
    ncol = 1, 
    widths = c(1,0.6,1,1), 
    heights = c(.2,.6,.1,.1)) 

vp1 <- viewport(layout.pos.row=1, name="title") 
vp2 <- viewport(layout.pos.row=2, name="plot") 
vp3 <- viewport(layout.pos.row=3, name="legend") 
vp4 <- viewport(layout.pos.row=4, name="caption") 

pushViewport(vpTree(viewport(layout = masterLayout, name = "master"), 
        vpList(vp1, vp2, vp3, vp4))) 

我如何可以複製使用grid包圖像中的佈局?

回答

2

因此,要解決這個問題的方法之一是推動另一個視口中繪製的情節視

seekViewport("plot") 
pushViewport(viewport(width=unit(0.8, "npc"))) 
... plot ... 
popViewport() 
... continue as usual 

時,但它仍然是奇怪的是,寬度不工作,或者我可能會誤以爲說法?

1

我不確定您是否會發現此方法更優越,但另一種選擇是使用gridExtra包中的grid.arrange。例如:

library(ggplot2) 
library(grid) 
library(gridExtra) 

# Plot 
p1 = ggplot(mtcars, aes(mpg, wt, colour=factor(carb))) + 
    geom_point() + 
    theme(legend.position="bottom") + 
    guides(colour=guide_legend(ncol=6)) + 
    labs(colour="Legend grob takes up full width of plot window") 

# Legend extraction function 
g_legend<-function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend)} 

# Extract legend 
leg = g_legend(p1) 
p1 = p1 + theme(legend.position="none") 


e = nullGrob() # Empty grob 

# Plot layout 
grid.arrange(textGrob("The title grob takes up the full width of the plot window", gp=gpar(fontsize=18)), 
      arrangeGrob(e, p1, e, ncol=3, widths=c(0.2,0.6,0.2)), 
      leg, 
      textGrob("Figure 1. The caption grob also takes up the full width of the plot window"), 
      ncol=1, heights=c(0.05,0.7,0.15,0.1)) 

enter image description here

+0

我不知道爲什麼你在arrangeGrob換個人grobs? – baptiste

+0

可能是因爲談到網格圖形時,我知道只是有危險。但現在,我看到了你的答案,我將在未來做到「正確」的方式! – eipi10

+0

感謝您的編輯@baptiste。 – eipi10

3

grid.layout使得矩形表,所以對於給定的列(行)的所有寬度(相應的高度。)將相等。您在單元格內推送特定尺寸視口的方法可能是最簡單的。

作爲一種替代方法,您可以使用更多列進行佈局,並指定用於特定grob的單元格的範圍。

library(gridExtra) 

gs <- lapply(1:4, function(ii) 
    grobTree(rectGrob(gp=gpar(fill=ii, alpha=0.5)), textGrob(ii))) 

m <- rbind(c(1, 1, 1), 
      c(NA, 2, NA), 
      c(3, 3, 3), 
      c(4, 4, 4)) 
grid.arrange(grobs = gs, 
      layout_matrix = m, 
      heights=unit(c(1,1,1,1), c("line", "null", "line")), 
      widths = unit(c(0.2,0.6,0.2), "npc")) 

enter image description here