3

ポイント グロブ ( ) のサイズ (たとえば mm 単位) の決定にpointsGrob失敗するのに、テキスト グロブ ( 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...

私が質問している理由は次のとおりです。テキスト グロブとポイント グロブを並べて配置し、 の値を変更するとcex、突然 2 つのグロブが重なります (望ましくない動作)。

同様の問題を示す例を次に示します。

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"))

長方形は、グロブの幅と高さが正しくないことを示しています。pg大きな ではポイントのサイズが「見えません」cex。これはどのように達成できますか?

4

1 に答える 1

4

ゼロ ポイント サイズの問題を解決する方法がわかりません。おそらく、グリッド ソース コードの内部で C レベルで定義する必要があります。

ただし、pointGrob の問題に関係なく、packGrob / gTree に対して grobWidth と grobHeight が定義されておらず、pointGrob が textGrob に置き換えられたとしても、このアプローチは失敗することを指摘しておきます。おそらく、「mygrob」などの新しいクラスの gTree を定義し、独自の 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 に答える