Как я могу выровнять эти таблицы в 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))

введите описание изображения здесь

Другие вопросы по тегам