替代版本(2015 年 4 月 24 日添加)显示了元素的手动构建并包含更多评论。
## Alternative version
library(gtable)
library(grid)
# Get the ggplot grobs
g <- ggplotGrob(p)
g2 <- ggplotGrob(p2)
# Show the layout.
# Note the rows and columns
# In this case, the g2 layout is the same as the g layout
gtable_show_layout(g)
# The large panels are the plot panels.
# We will need rows 4, 6 and 8.
# For the top "Very Good" row, we will also need rows 1, 2, and 3.
# The axis is located in row 9
# Therefore rbind the grob in rows 1, 2, 3, and 4, with the grob in row 9.
top.row <- rbind(g[1:4, ], g[9, ], size = "first")
# The second "Premium" row
# We need the panels in row 6 plus the small gap row above,
# and rbind that to the axis
middle.row = rbind(g2[5:6, ], g2[9,], size = "first")
# The bottom "Ideal" row
# We need the panel in row 8 plus the small gap in the row above
# plus the axis in the row below
# plus rows below that (axis label and margin)
bottom.row = g2[7:11, ]
# rbind the three rows
all <- rbind(rbind(top.row, middle.row, size = "first"), bottom.row, size = "first")
# Draw it
grid.newpage()
grid.draw(all)
# Maybe add a little more space between the rows
gtable_show_layout(all)
all$heights[c(6,9)] = unit(1, "lines")
# Draw it
grid.newpage()
grid.draw(all)
但您甚至不需要将面板绑定到轴上;只需从布局中选择适当的行:
top.row <- g[c(1:4, 9), ]
middle.row = g2[c(5:6, 9), ]
bottom.row = g2[7:11, ]
然后绑定这三个新行。
原版
只是在行的绑定方面您犯了错误。您已将一个轴绑定到顶部的“非常好”行。底部的“理想”行已经有一个轴,因此不需要绑定。修复:中间的“Premium”行需要一个轴。
我分别构造了每一行,将轴绑定到顶部和中间的行,然后绑定三行。
我添加了另一个步骤来在行之间添加更多的空间。
g <- ggplotGrob(p)
g2 <- ggplotGrob(p2)
# locate the panels
panels <- grep("panel", g$layout$name)
panels2 <- grep("panel", g2$layout$name)
top <- unique(g$layout$t[panels])
top2 <- unique(g2$layout$t[panels2])
# Construct each row separately
top.row <- gtable:::rbind_gtable(g[seq.int(min(top)), ], g[max(top)+1,], "first")
middle.row <- gtable:::rbind_gtable(g2[c(top[2]-1,top[2]), ], g2[max(top)+1,], "first")
bottom.row <- g2[(max(top2)-1):nrow(g2), ]
all <- gtable:::rbind_gtable(gtable:::rbind_gtable(top.row, middle.row, "first"), bottom.row, "first")
# Draw it
grid.newpage()
grid.draw(all)
# Maybe add a little more space between the rows
all$heights[c(6,9)] = unit(1, "lines")
grid.newpage()
grid.draw(all)