Как я могу выровнять эти таблицы в gtable, используя grid.arrange?
У меня есть документ уценки, использующий немного LaTeX для создания PDF-файла со следующим фрагментом:
grid.arrange(
grobs = list(
gtable_combine(
gtable_add_grob(
tableGrob(mtcars[1:3, 1:2], rows = NULL),
grobs = segmentsGrob(y1 = unit(0, "npc"),
gp = gpar(fill = NA, lwd = 2)),
t = 1,
l = 1,
r = ncol(mtcars[1:3, 1:2])
),
gtable_add_grob(
tableGrob(mtcars[1:3, 1:2], rows = NULL),
grobs = segmentsGrob(y1 = unit(0, "npc"),
gp = gpar(fill = NA, lwd = 2)),
t = 1,
l = 1,
r = ncol(mtcars[1:3, 1:2])
),
along = 2),
gtable_add_grob(
tableGrob(mtcars[1:8, 1:2], rows = NULL),
grobs = segmentsGrob(y1 = unit(0, "npc"),
gp = gpar(fill = NA, lwd = 2)),
t = 1,
l = 1,
r = ncol(mtcars[1:8, 1:2])
)
),
ncol = 2
)
Вывод выровнен по центру, и я хотел бы выровнять его сверху. Моя точка зрения в том, что левая часть уже состоит из двух комбинированных таблиц, и я, похоже, не могу вложить выходные данные этой функции в другой вызов gtable_combine()
, Мне также не повезло, используя layout_matrix=
аргумент в gridExtra, так как это добавляет огромное количество пространства между левыми двумя таблицами.
Как сделать так, чтобы две левые таблицы были очень близки (хорошо прилегающие), а также чтобы верхняя часть самой верхней левой таблицы и верхняя часть правой таблицы были выровнены по горизонтали?
2 ответа
Я нашел ответ из этого предыдущего поста SO. Мне кажется, что заполнение вывода двух более коротких таблиц gtable_combine(...)
отличается от вывода более длинной таблицы, так как верхний отступ по умолчанию является функцией длины таблицы, и здесь две таблицы, даже если они объединены, будут отличаться по длине. Функция @baptiste, описанная в его ответе, решает эту проблему, фиксируя это значение заполнения. Реализация этого в моем случае использования выглядит следующим образом:
justify <- function(x, hjust="center", vjust="top", draw=FALSE){
w <- sum(x$widths)
h <- sum(x$heights)
xj <- switch(
hjust,
center = 0.5,
left = 0.5 * w,
right = unit(1, "npc") - 0.5 * w
)
yj <- switch(
vjust,
center = 0.5,
bottom = 0.5 * h,
top = unit(1, "npc") - 0.5 * h
)
x$vp <- viewport(x=xj, y=yj)
if(draw) grid.draw(x)
return(x)
}
grid.arrange(
justify(
gtable_combine(
gtable_add_grob(
tableGrob(mtcars[1:3, 1:2], rows = NULL),
grobs = segmentsGrob(y1 = unit(0, "npc"),
gp = gpar(fill = NA, lwd = 2)),
t = 1,
l = 1,
r = ncol(mtcars[1:3, 1:2])
),
gtable_add_grob(
tableGrob(mtcars[1:3, 1:2], rows = NULL),
grobs = segmentsGrob(y1 = unit(0, "npc"),
gp = gpar(fill = NA, lwd = 2)),
t = 1,
l = 1,
r = ncol(mtcars[1:3, 1:2])
),
along = 2
)
),
justify(
gtable_add_grob(
tableGrob(mtcars[1:8, 1:2], rows = NULL),
grobs = segmentsGrob(y1 = unit(0, "npc"),
gp = gpar(fill = NA, lwd = 2)),
t = 1,
l = 1,
r = ncol(mtcars[1:3, 1:2])
)
),
ncol = 2
)
Пытаться
library(gridExtra)
t1 <- tableGrob(mtcars[1:3,], rows = NULL)
t2 <- tableGrob(mtcars[1:8,], rows = NULL)
grid.draw(gtable_combine(t1, t2))