循环将基本图形转换为其等效的网格

瓦伦丁

使用带有gridGraphics包(此处的解决方案将基本图形一张一张地转换为它们的等效网格,可以正常工作。但是,当我尝试将其放入循环中时,我没有得到预期的结果。这是一个例子:

library(gridGraphics) 

### Make a list of 3 base plots -----
p <- vector(mode = "list", length = 3)

for (i in 1:3){
  plot(1:5^i)
  p[[i]] <- recordPlot()
}

### Attempt to convert each base plot to its grid equivalent -----
grobs <- vector(mode = "list", length = 3)

for (i in 1:3){
  plot.new() # clean up device
  p[[i]] # redraw
  # Echo graphics output using grid graphics
  grid.echo()
  # Creates a gTree object from the current grid display list
  a_gTree <- grid.grab()
  grobs[[i]] <- editGrob(grob = a_gTree, 
                         vp = viewport(width = unit(5, "cm"),
                                       height = unit(5, "cm"),
                                       angle = 90)) # rotates 90 dg
}

如果我在每个步骤的循环内运行代码块,就可以得到所需的信息,但是当我一次运行循环时,所有杂物似乎都什么也不显示。我觉得我很想念某些东西...

这是所需的输出(通过逐步运行获得):

cowplot::plot_grid(grobs[[1]], 
                   grobs[[2]], 
                   grobs[[3]])

在此处输入图片说明

瓦伦丁

感谢@ user20650指出print()循环中的用法,因此请使用print(p[[i]])代替p[[i]]甚至更好的是,我更喜欢他的优雅建议,以使用来节省一些行a_gTree <- grid.grabExpr(grid.echo(p[[i]]))grid.grabExpr不绘制任何内容的情况下从表达式捕获输出的位置。plot.new()似乎也是可选的。

for (i in 1:3){
  # Grab grid output
  a_gTree <- grid.grabExpr(grid.echo(p[[i]]))
  # Edit/modify the grob
  grobs[[i]] <- editGrob(grob = a_gTree, 
                         vp = viewport(width = unit(5, "cm"),
                                       height = unit(5, "cm"),
                                       angle = 90)) # rotates 90 dg
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章