gtable中的文本对齐方式和字体大小

时间:2013-11-12 16:26:46

标签: r fonts alignment gtable

我的问题与巴蒂斯特的回答有关,你可以在这里找到:https://stackoverflow.com/a/18667413/2072440

该代码完全符合我的要求。我想做两处修改。首先,我想将第一列中的文本对齐到左侧。其次,我想改变文字的字体。

我曾尝试编辑描述单元格背景填充的行,但这似乎不会影响字体,它只影响框本身的位置而不是文本中的文本。

谢谢。

2 个答案:

答案 0 :(得分:3)

查看网格系统的工作原理会很有用,特别是?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)

为了更改字体,您需要将“x”参数的gp节点设置为具有不同结构的列表(不仅仅是一个空列表)。请参阅`?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)

或使用fontsize参数:

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对象的对齐方式,可以“调整”grob中的$x元素:

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)

enter image description here

答案 1 :(得分:0)

&#39; ave added a table function in gtablemore options

不幸的是,

非常慢(对于网格图形而言并不令人惊讶)。

enter image description here

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)