3

为什么确定点 grob ( ) 的大小(例如,以 mm 为单位pointsGrob)失败,但对于文本 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 突然重叠(不需要的行为)。

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

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。如何做到这一点?

4

1 回答 1

4

我不知道如何解决零点大小的问题,想必它必须在 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"))
于 2013-08-31T22:10:01.627 回答