arrangeGrob 中的垂直对齐和高度

Vertical justification and heights in arrangeGrob

我正在尝试构建包含多个页面的报告。每个页面都有相同的结构,一个标题说明正在显示的医院,然后是页面上半部分的 table 和下半部分的情节。我正在使用 tableGrob 将 table 转换为图形 object 并使用 arrangeGrob 将其全部放入页面中。我的代码看起来像:

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

df <- iris[1:10,]
pp <- ggplot(iris, aes(x = Sepal.Length)) + geom_histogram(binwidth = 0.2)

tTitle <- textGrob(paste("Title line 1","\n", "Line 2", "\n", "Line 3"),
                   gp=gpar(fontsize=15))
padding <- unit(3,"line")
tt <- tableGrob(df, rows = NULL, theme = ttheme_minimal())
tt <- gtable_add_rows(tt, heights = grobHeight(tTitle) + padding, pos = 0)
tt <- gtable_add_grob(tt, list(tTitle), t=1, l=1, r=ncol(tt))

pg <- arrangeGrob(tt, pp,
                  nrow=2, as.table=FALSE)

pdf("Demo.pdf", paper = "a4", width = 8.27)
grid.draw(pg)
dev.off()

我的问题是页面顶部有很多space,而底部的table被情节截断了。

我如何垂直对齐标题和 table 以便它们向上移动页面,为情节留下足够的 space?

这里有一种可能:查询table的高度(由内容决定的固定数字),剩下的留给情节。请注意 paper="a4" 介绍了它自己的特质,我会忽略它。

library(ggplot2)
library(gridExtra)
library(grid)
library(gtable)
library(maggritr)

df <- iris[1:10,]
pp <- ggplot(iris, aes(x = Sepal.Length)) + geom_histogram(binwidth = 0.2)

tTitle <- textGrob(paste("Title line 1","\n", "Line 2", "\n", "Line 3"),
                   gp=gpar(fontsize=15))
padding <- unit(3,"line")

tt <- tableGrob(df, rows = NULL, theme = ttheme_minimal()) %>%
  gtable_add_rows(heights = grobHeight(tTitle) + padding, pos = 0) %>%
  gtable_add_grob(list(tTitle), t=1, l=1, r=ncol(tt)) %>%
  gtable_add_grob(rectGrob(gp=gpar(fill=NA,col="red")),
                  t=1, l=1, r=ncol(tt),b=nrow(tt))

th <- sum(tt$heights)
pg <- arrangeGrob(tt, pp, heights = unit.c(th, unit(1,"npc")-th))

pdf("Demo.pdf", width=21/2.54,height=27.7/2.54)
grid.draw(pg)
dev.off()

请注意,使用这种方法,ggplot 将扩展以填充剩余的 space。如果你不想这样,你应该分配一个固定的高度,例如

# 10 cm or remaining space on the page if smaller than that
cappedheight = unit.pmin(unit(1,"npc"), unit(10, "cm"))
# wrap plot in a grobTree to assign a viewport (centered in remaining space)
pp1 <- grobTree(ggplotGrob(pp), vp=viewport(height=cappedheight))
pg <- arrangeGrob(tt, pp1, heights = unit.c(th, unit(1,"npc")-th))