Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定pointsGrob的大小(与textGrob的大小相比)?_R_R Grid - Fatal编程技术网

如何确定pointsGrob的大小(与textGrob的大小相比)?

如何确定pointsGrob的大小(与textGrob的大小相比)?,r,r-grid,R,R Grid,为什么确定点组(pointsGrob)的大小(例如,以毫米为单位)失败,而文本组(textGrob)却没有失败 我问这个问题的原因是:如果您将文本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
)的大小(例如,以毫米为单位)失败,而文本组(
textGrob
)却没有失败

我问这个问题的原因是:如果您将文本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"))

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

然而,我想指出的是,不管pointsGrob问题如何,grobWidth和grobHeight都没有为packGrob/gTree定义,即使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"))
库(网格)

gt我认为点的大小为零。你可以画一个圆代替,但一个点可以有许多不同的形式(
pch
),因此基于圆的解决方案只能处理
pch=1
。老实说,点符号的大小…感谢链接:-)谢谢,巴蒂斯特。我认为“网格”的一个主要优点是,我不必自己处理“大小”,只需将网格打包在一起,就可以自动处理它们的大小等问题[否则,可以使用基本图形代替]。因此,我假设你的答案是“你必须自己处理这个问题”(?)对于gTree这样的复杂grobs,如何定义宽度/高度并不总是显而易见的。必须有人定义计算,不幸的是grid没有默认方法(显而易见的选择是一个包含所有对象的“边界框”)。事实上,一个(通常设置的)gTree的“边界框”会很棒。我假设这不存在[例如,在ggplot中](否则你会将我指向来源)…你可以直接问Paul Murrell,他可能有一些东西。谢谢你,巴蒂斯特,你的方法现在确实很有意义。。。虽然我认为我对
heightDetails.*()
使用了与
widthDetails()相同的
do.call(max,…)
方法。此外,我确实想知道为什么没有(width | height)Details.gTree()默认值,我将向Paul Murrell推荐一个。
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"))