Вертикальное выравнивание и высоты в аранжировкеГроб - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь создать отчет из нескольких страниц.Каждая страница имеет одинаковую структуру: заголовок, в котором указано, какая больница отображается, затем таблица в верхней половине страницы и график в нижней половине.Я использую tableGrob, чтобы преобразовать таблицу в графический объект и 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()

Моя проблема в том, что в верхней части страницы много места, а нижняя часть таблицы обрезана сюжетом.

Каквыровнять по вертикали заголовок и таблицу так, чтобы они перемещались вверх по странице, оставляя достаточно места для сюжета?

1 Ответ

0 голосов
/ 09 ноября 2018

Вот одна из возможностей: запросить высоту таблицы (фиксированное число, продиктованное содержимым) и оставить оставшуюся часть для графика. Обратите внимание, что 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 будет расширяться, чтобы заполнить оставшееся пространство. Если вы этого не хотите, вам следует назначить фиксированную высоту, например,

# 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...