使用grid.layout时未遵循宽度

时间:2015-09-07 13:48:01

标签: r layout r-grid

我正在尝试创建类似于

的布局

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包复制图像中的布局?

3 个答案:

答案 0 :(得分:4)

grid.layout创建一个矩形表,因此对于给定的列(行),所有宽度(resp。高度)将相等。您在单元格内推送特定尺寸视口的方法可能是最简单的方法。

作为替代方法,您可以使用 more 列进行布局,并指定要用于特定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

答案 1 :(得分:2)

因此解决此问题的一种方法是在绘制绘图视口时推送另一个视口

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

但宽度不起作用还是我误解了这个论点仍然很奇怪?

答案 2 :(得分:1)

我不确定您是否会发现此方法优越,但另一种选择是使用grid.arrange包中的gridExtra。例如:

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