【问题标题】:Store output from gridExtra::grid.arrange into an object将来自 gridExtra::grid.arrange 的输出存储到一个对象中
【发布时间】:2015-03-15 16:00:09
【问题描述】:

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

根据 cmets,我正在添加此编辑。当我用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

【问题讨论】:

  • 尝试改用arrangeGrob
  • @hrbrmstr:我认为一个小答案是值得的。在这种情况下,帮助页面相当无用,尽管有相当多的经验,但我无法在脑海中回答这个问题。
  • arrangeGrob 实际上变得更奇怪了(我一直忘记代码在 cmets 中没有格式,所以我对问题进行了编辑)。

标签: r ggplot2 gridextra


【解决方案1】:

由于您没有加载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)

【讨论】:

  • 有趣。这不是我所期望的行为。也许我不像我想的那样理解:: 运算符。谢谢你让我直截了当。
  • 抱歉,加载 gridExtra 后您不需要 gridExtra::,请参阅编辑。不客气!
  • 加载我理解的包后我不需要gridExtra::。我正在使用:: 运算符,因为我在一个包中具有此功能,并且在加载我的包时试图避免将其他包加载到搜索路径中。我曾认为加载库或使用:: 会产生相同的结果。显然这里不是这样。
  • 啊,我想起来了。 gridExtra 依赖于 grid,所以如果你导入gridExtra,它将无法正常工作,因为它找不到grid。不幸的是,这是一种相当古老的编写包的风格。链接here,请参阅“警告”部分。
  • 请不要使用plot(),输出是一个gtable,应该用grid.draw()绘制(遵循网格约定)。
【解决方案2】:

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

问题 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 中的修复似乎不起作用(也许包太早地被解除连接?)。但我注意到,在安排Grob 的结果上调用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)
}

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


你可以看到代码在运行in my package on GitHub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多