如何确定pointsGrob的大小(vs一个textGrob)?

时间:2013-08-31 20:11:29

标签: r r-grid

为什么确定点grob(pointsGrob)的大小(例如以mm为单位)失败,而不是文本grob(textGrob)失败?

### puzzled about grobs (not) knowning how big they are:
require(grid)
convertUnit(grobWidth(textGrob("some tex")), "mm") # 16.93mm => fine
convertUnit(grobWidth(pointsGrob(0.5, 0.5)),  "mm") # 0mm => ?
convertUnit(grobWidth(pointsGrob(0.5, 0.5, size=unit(3, "mm"))), "mm") ## still 0mm...

我之所以要问的是:如果你并排放置一个文本grob和一个点grob,并改变cex的值,那么两个grob突然重叠(不需要的行为)。 / p>

这是一个显示类似问题的例子:

gt <- grobTree(pointsGrob(x=.5, y=.5,  gp=gpar(cex=4)),
               linesGrob(x=0:1, y=.5,  gp=gpar(cex=4)),
               pointsGrob(x=.5, y=.5,  gp=gpar(cex=1)))
pg <- packGrob(frameGrob(vp=NULL), gt,
               width = unit(1, "char"),
               height = unit(1, "char"))
grid.newpage()
grid.draw(pg)
grid.rect(width=grobWidth(pg), height=grobHeight(pg), gp=gpar(col="red"))

矩形显示grob宽度和高度不正确; pg没有“看到”大cex点的大小。如何实现这一目标?

1 个答案:

答案 0 :(得分:3)

我不知道如何解决零点大小问题,可能必须在C级网格源代码的内部定义。

但是,我想指出的是,无论pointsGrob问题如何,都没有为packGrob / gTree定义grobWidth和grobHeight,即使将pointsGrob替换为textGrob,该方法也会失败。 你可能想要定义一个新类的gTree,比如“mygrob”,并定义你自己的widthDetails.mygrob和heightDetails.mygrob方法,

library(grid)

gt <- grobTree(linesGrob(x=c(0.2, 0.8), y=.5,  gp=gpar(col="grey", lwd=10)),
               textGrob("some label",  gp=gpar(cex=2)),
               cl = "mygrob")

widthDetails.mygrob <- function(x)
  do.call(max, lapply(x$children, grobWidth))


heightDetails.mygrob <- function(x)
  do.call(max, lapply(x$children, grobHeight))

grid.newpage()
grid.draw(gt)
grid.rect(width=grobWidth(gt), height=grobHeight(gt), gp=gpar(col="red"))