12

我将多个图放置到一个图像中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
4

2 回答 2

6

由于您没有加载,您编辑中的代码无法正常工作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)
于 2015-03-16T08:49:19.050 回答
3

有趣的是,这是最近才被问到的——这周我也遇到了这个问题,并且能够以一种有点老套的方式解决它,但我找不到任何其他让我更满意的解决方案。

问题一:ggplotGrob没有找到

我必须确保 ggplot2 已加载。我不完全理解发生了什么(我承认我不完全理解导入/依赖/附加/等),但以下解决了这个问题。如果这非常危险,我愿意接受反馈。

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

其他人链接到此博客文章,我认为这也有效,但根据我的(不完整的)理解,这个解决方案不那么可怕。我认为。

问题 2:绘图中没有图层

正如您也发现的那样,修复该问题允许我们使用grid.arrange,但返回 NULL 并且不允许保存到对象。所以我也想使用arrangeGrob,但是当尚未加载 gridExtra 时,我也遇到了上述错误。再次应用问题 1 中的修复似乎不起作用(也许包太早地被解除连接?)。但是我注意到调用grid::grid.drawarrangeGrob的结果可以很好地打印它而没有错误。所以我在arrangeGrob的输出中添加了一个自定义类,并添加了一个简单调用grid.draw的通用打印方法

f <- function() {
  plot <- gridExtra::arrangeGrob(...)
  class(plot) <- c("ggExtraPlot", class(plot))
  plot
}
print.ggExtraPlot <- function(x, ...) {
  grid::grid.draw(x)
}

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


您可以在我的 GitHub 包中查看运行中的代码。

于 2015-03-26T20:37:56.887 回答