Выравнивание текста и размер шрифта в gtable

Мой вопрос относится к ответу Батиста, который вы можете найти здесь: https://stackoverflow.com/a/18667413/2072440.

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

Я попытался отредактировать строку, описывающую заливку фона ячеек, но это, похоже, не влияет на шрифт, а влияет только на положение самих полей, а не на текст в них.

Спасибо.


person Seb_ISU    schedule 12.11.2013    source источник


Ответы (2)


Было бы полезно рассмотреть, как работает система сетки, в частности посмотреть на ?grid.text. Система сетки сохраняет свой объект графика в 'grobs' (графические объекты). К своему удивлению, я обнаружил, что «обоснование» отличается от того, что я ожидал (и оно относится к центральной линии, а не к краям ячейки). Если вы запустите этот код на объекте "g" со страницы, которую вы цитируете, вы можете ожидать, что текст сдвинется вправо, хотя на самом деле он смещается влево.

g$grobs[c(6:8, 10:12, 14:16, 18:20, 22:24)] <- 
      lapply(g$grobs[c(6:8, 10:12, 14:16, 18:20, 22:24)], 
             function(x) modifyList( x, list(just="right") ) ) 
grid.draw(g)

Чтобы изменить шрифт, вам нужно установить узел gp аргумента «x» в список с другой структурой (отличной от простого пустого списка). См. `?gpar' для аргументов, которые он принимает:

str(g$grobs[[6]])
List of 11
 $ label        : chr "5.1"
 $ x            :Class 'unit'  atomic [1:1] 0.5
  .. ..- attr(*, "unit")= chr "npc"
  .. ..- attr(*, "valid.unit")= int 0
 $ y            :Class 'unit'  atomic [1:1] 0.5
  .. ..- attr(*, "unit")= chr "npc"
  .. ..- attr(*, "valid.unit")= int 0
 $ just         : chr "centre"
 $ hjust        : chr "left"
 $ vjust        : NULL
 $ rot          : num 0
 $ check.overlap: logi FALSE
 $ name         : chr "GRID.text.1032"
 $ gp           : list()
  ..- attr(*, "class")= chr "gpar"
 $ vp           : NULL


g$grobs[c(6:8, 10:12, 14:16, 18:20, 22:24)] <- 
           lapply(g$grobs[c(6:8, 10:12, 14:16, 18:20, 22:24)], 
                function(x) modifyList( x, list(gp=list(cex=0.8) ) ) )
grid.newpage()
grid.draw(g)

Или используйте аргумент размера шрифта:

g$grobs[c(6:8, 10:12, 14:16, 18:20, 22:24)] <- 
      lapply(g$grobs[c(6:8, 10:12, 14:16, 18:20, 22:24)], 
          function(x) modifyList( x, list(gp=list(fontsize=14, cex=1) ) ) )
grid.newpage()
grid.draw(g)

Чтобы изменить выравнивание для объекта gtable, можно «настроить» элемент $x внутри grob:

g$grobs[c(6:8, 10:12, 14:16, 18:20, 22:24)] <- 
   lapply(g$grobs[c(6:8, 10:12, 14:16, 18:20, 22:24)], 
     function(z) modifyList( z, list(x=unit(0.1,"npc"), just="left") ) )
g$grobs[c(6:8, 10:12, 14:16, 18:20, 22:24)] <- 
   lapply(g$grobs[c(6:8, 10:12, 14:16, 18:20, 22:24)], 
     function(x) modifyList( x, list(gp=list(fontsize=16, cex=1) ) ) )
grid.draw(g)

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

person IRTFM    schedule 12.11.2013
comment
Это прекрасно работает. Большое спасибо за исчерпывающий ответ. - person Seb_ISU; 13.11.2013

Я добавил табличную функцию в gtable с помощью дополнительные параметры.

К сожалению, это очень медленно (и неудивительно для сетки).

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

require(gtable)

d <- head(iris, 3)

core <- gtable_table(d,
                     fg.par = list(col=1:8, hjust=0, x=0.1),
                     bg.par = list(fill=9:15, alpha=0.5))

colhead <- gtable_table(t(colnames(d)), fg.par = list(fontface=4),
                        bg.par = list(col=NA))

rowhead <- gtable_table(c("", rownames(d)), fg.par = list(fontface=3),
                        bg.par = list(col=NA))

g <- rbind(colhead, core)
g <- cbind(rowhead, g)

grid.newpage()
grid.draw(g)
person baptiste    schedule 16.06.2014