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))
我正在尝试构建包含多个页面的报告。每个页面都有相同的结构,一个标题说明正在显示的医院,然后是页面上半部分的 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))