将 gridExtra::grid.arrange 的输出存储到一个对象中

Store output from gridExtra::grid.arrange into an object

我正在使用 gridExtra::grid.arrange 将多个图放入一个图像中,并且希望可以选择将组合图保存为一个对象,该对象可以作为返回对象列表的一部分从函数中返回.理想情况下,我想在不打印绘图对象的情况下执行此操作。

下面的代码创建了两个图,将它们与 grid.arrange 组合,并尝试将结果保存到 x 中。但是,x 的计算结果为 NULL 并打印该图。 grid.arrange 的文档将我指向 arrangeGrob 并建议可以使用 plot=FALSE 关闭绘图,但是当我尝试这样做时出现错误,因为 FALSE 不是 grob 对象.

对我不理解的地方有什么建议吗?

# R under development
# Windows 7 (32 bit)
# ggplot2 1.0.0
# gridExtra 0.9.1

p1 <- ggplot(mtcars, aes(x=factor(cyl), y=mpg)) + geom_boxplot()

p2 <- ggplot(mtcars, aes(x=factor(cyl), y=wt)) + geom_boxplot()

x <- gridExtra::grid.arrange(p1, p2)

x

根据评论,我添加了此修改。当我用 arrangeGrob 尝试时,我根本没有输出。

> gridExtra::arrangeGrob(p1, p2)
> print(gridExtra::arrangeGrob(p1, p2))
Error: No layers in plot
> x <- gridExtra::arrangeGrob(p1, p2)
> x
Error: No layers in plot

您编辑的代码无法正常工作,因为您没有加载 gridExtra

library(gridExtra)
y <- arrangeGrob(p1, p2, ncol = 1)
class(y)
#[1] "gtable" "grob"   "gDesc"
grid.draw(y)

编辑:从版本 2.0.0 开始,我对下面的 grid 依赖项的评论不再有效,因为 grid 现在已导入。

编辑:对于 gridExtra 版本 >= 2.0.0,无需附加任何一个包,

p <- ggplot2::qplot(1,1)
x <- gridExtra::arrangeGrob(p, p)
grid::grid.draw(x)

最近有人问这个问题很有趣 - 这周我也 运行 遇到了这个问题,并且能够以一种有点笨拙的方式解决它,但我找不到任何其他解决方案我更开心。

问题一:ggplotGrob没有找到

我必须确保 ggplot2 已加载。我不完全理解发生了什么(我承认我不完全理解 imports/depends/attaching/etc),但以下修复了这个问题。如果这非常危险,我愿意接受反馈。

if (!"package:ggplot2" %in% search()) {
  suppressPackageStartupMessages(attachNamespace("ggplot2"))
  on.exit(detach("package:ggplot2"))
}

其他人链接到 this blog post,我认为这也有效,但根据我(不完全)的理解,这个解决方案不那么可怕。我觉得。

问题2:图中没有图层

正如您所发现的,解决该问题后我们可以使用 grid.arrange,但 returns NULL 并且不允许保存到对象。所以我也想使用 arrangeGrob 但当 gridExtra 尚未加载时我也 运行 进入上述错误。再次应用问题 1 中的修复程序似乎不起作用(也许软件包过早地解除附加?)。但是我注意到,在 ar运行geGrob 的结果上调用 grid::grid.draw 可以很好地打印它,没有错误。所以我在 ar运行geGrob 的输出中添加了一个自定义的 class 并添加了一个简单调用 grid.draw

的通用打印方法
f <- function() {
  plot <- gridExtra::arrangeGrob(...)
  class(plot) <- c("ggExtraPlot", class(plot))
  plot
}
print.ggExtraPlot <- function(x, ...) {
  grid::grid.draw(x)
}

万岁,现在我可以打开一个没有显式加载包的新 R 会话,我可以成功调用一个创建 grob 的函数并稍后打印它!


您可以看到正在运行的代码 in my package on GitHub.