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