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

时间:2015-03-15 16:00:10

标签: r ggplot2 gridextra

我使用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

2 个答案:

答案 0 :(得分:3)

由于您未加载gridExtra,编辑中的代码无法正常运行。

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

enter image description here

修改:自版本2.0.0起,我对以下grid依赖关系的评论不再有效,因为现在已导入grid

编辑:使用gridExtra版本&gt; = 2.0.0,无需附加任何一个包,

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

答案 1 :(得分:2)

有趣的是,这是最近才被问到的 - 本周我也遇到了这个问题并且能够以一种黑客的方式解决它,但我找不到任何其他解决方案我更高兴。 / p>

问题1:找不到ggplotGrob

我必须确保加载ggplot2。我不完全理解发生了什么(我承认我并不完全了解进口/依赖/附加/等),但以下修复了这一点。如果这是非常危险的话,我愿意接受反馈。

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

其他人与this blog post相关联,我认为这也有效,但从我(非完整)的理解来看,这个解决方案并不那么可怕。我想。

问题2:图中没有图层

正如您所发现的,修复该问题允许我们使用grid.arrange,但是返回NULL并且不允许保存到对象。所以我也想使用arrangeGrob但是当gridExtra尚未加载时我也遇到了上述错误。再次应用问题1中的修复似乎不起作用(可能包过早取消连接?)。但我发现在arrangeGrob的结果上调用grid::grid.draw可以正确打印它而不会出错。所以我在arrangeGrob的输出中添加了一个自定义类,并添加了一个简单调用grid.draw

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

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


您可以在行动in my package on GitHub中看到代码。