【问题标题】:Text alignment and font size in gtablegtable中的文本对齐和字体大小
【发布时间】:2013-11-24 22:01:15
【问题描述】:

我的问题与 Baptiste 的回答有关,您可以在这里找到:https://stackoverflow.com/a/18667413/2072440

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

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

谢谢。

【问题讨论】:

    标签: r fonts alignment gtable


    【解决方案1】:

    查看网格系统的工作原理会很有用,尤其是查看?grid.text。网格系统将其绘图对象保存在“grobs”(图形对象)中。我有点惊讶地发现,“理由”与我的预期相反(并且它参考的是中心线而不是单元格的边缘)。如果您在引用页面的 "g"-object 上运行此代码,您可能会期望文本向右移动,而实际上它向左移动。

    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)
    

    【讨论】:

    • 效果很好。非常感谢您的详尽回复。
    【解决方案2】:

    我有added a table function in gtable,和more options

    不幸的是,它真的很慢(对于网格图形来说也不足为奇)。

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 2015-01-16
      • 2020-09-06
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多