вертикальное выравнивание gridExtra tableGrob (R grid graphics/grob)

Возникли проблемы с выравниванием графического объекта сетки - прочитал все документы, которые я смог найти, включая книгу Мюррелла, но безуспешно. Я думаю, что то, что я пытаюсь сделать, довольно просто, поэтому, надеюсь, мне не хватает простого.

Вот воспроизводимый пример, который создаст PDF-файл всех авиаперевозчиков по пунктам назначения в пакете Hadley hflights (отражает то, что я пытаюсь сделать с другим набором данных).

require(hflights)
require(gridExtra)
require(Cairo)

make_table <- function(df) {
  p <- tableGrob(
    df
   ,padding.h=unit(.25, "mm")
   ,show.rownames=FALSE
   ,gpar.coretext = gpar(fontsize=8, lineheight=0)
   #this doesn't seem to justify the table
   ,just = c("bottom")
   ,show.box = T
  )
  return(p)
}

dests <- unique(hflights$Dest)

#list to hold the plots
plot_list <- list()

#loop over destinations and make a simple report
for (i in dests) {
  #just this destination
  this_dest <- hflights[hflights$Dest == i, ]

  #the title
  title <- textGrob(label = i, gp = gpar(fontsize=72, fontface = 'bold'))

  #a table of carriers
  carriers <- unique(this_dest$UniqueCarrier)
  carriers <- data.frame(
    carrier=carriers  
  )
  carrier_table <- make_table(carriers)

  #put them together
  p <- arrangeGrob(
    title, carrier_table
   ,nrow=2
  )

  plot_list[[i]] <- p
}


#print the report
Cairo(
  width = 11, height = 8.5 
 ,file = paste('destinations.pdf', sep = ''), type="pdf"
 ,units = "in"
)

  print(plot_list)

dev.off()

Я хочу, чтобы вся таблица, созданная tableGrob (в функции make_table), располагалась в верхней части гроба. Прямо сейчас он центрирован по вертикали и горизонтали внутри гроба. Мне нужно сделать это при вызове tableGrob или это при вызове arrangeGrob? Чтобы задать другой вопрос, если вышеизложенное неясно, как я могу сделать так, чтобы вся таблица (а не текст внутри нее) выравнивалась по верхнему/нижнему/левому/правому краю своего контейнера?

Спасибо!


person Andrew    schedule 22.08.2014    source источник
comment
Вы можете заглянуть в сам пакет grid. Особенно функция grid.layout полезна для создания видовых экранов нестандартного размера. У вас проблемы с кодом, связанным с arrangeGrob, который делит бумагу на два окна просмотра одинакового размера. Как только вы привыкнете к настройке расположения окон просмотра в grid, вы никогда не захотите его пропустить.   -  person SimonG    schedule 23.08.2014
comment
@SimonG ArrangeGrob является оболочкой для grid.layout и допускает неравную высоту.   -  person baptiste    schedule 23.08.2014
comment
Действительно? Я не понял, что это также позволяет установить выравнивание. Тогда извините за дезинформацию!   -  person SimonG    schedule 23.08.2014
comment
Можно указать высоту и ширину @SimonG; выравнивание - это другой вопрос. Выравнивание всегда довольно неудобно обрабатывать в сетке.   -  person baptiste    schedule 23.08.2014


Ответы (1)


попробуй это,

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

library(gridExtra)
justify <- function(x, hjust="center", vjust="center", draw=TRUE){
  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)
}

g <- tableGrob(iris[1:3,1:2])
grid.newpage()
justify(g,"right", "top")
person baptiste    schedule 22.08.2014
comment
Собирался проголосовать, но обнаружил, что уже проголосовал за предыдущий визит. Спасибо еще раз - person arvi1000; 29.09.2016