【发布时间】:2015-11-20 09:39:15
【问题描述】:
由于到目前为止我在 stackoverflow 上阅读了很多类似的问题,因此如果不将 ggplot2 更新到开发版本,我找不到一个好的解决方案。
我的问题,我有几个脚本使用arrangeGrob 从单个图形中创建组合图形。我将它们保存到一个变量和print 这个变量和/或用ggsave 保存它。由于我的很多同事定期更新那里的软件包(我认为这是一件好事),我总是收到邮件我的脚本在更新到 gridExtra 2.0.0 后不再工作。
我不确定如何处理这个问题,因为解决问题的新 ggplot2 版本仍在开发中。如果要保存的对象是ggplot,我在堆栈溢出时发现了一个article,以删除一个测试,因为新的arrangeGrob 函数返回一个gtable 对象,但在我的情况下这失败了:
library(ggplot2)
library(grid)
library(gridExtra)
a <- data.frame(x=c(1,2,3),
y=c(2,3,4))
p <- ggplot(a, aes(x, y)) + geom_point()
b <- arrangeGrob(p, p)
grid.draw(b)
ggsave('test.pdf', b)
ggsave <- ggplot2::ggsave
body(ggsave) <- body(ggplot2::ggsave)[-2]
ggsave('test.pdf', b)
控制台上的一些输出和错误:
d> grid.draw(b)
d> ggsave('test.pdf', b)
Error in ggsave("test.pdf", b) : plot should be a ggplot2 plot
d> ggsave <- ggplot2::ggsave
d> body(ggsave) <- body(ggplot2::ggsave)[-2]
d> ggsave('test.pdf', b)
Saving 10.5 x 10.7 in image
TableGrob (2 x 1) "arrange": 2 grobs
z cells name grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]
d>
test.pdf 已创建,但已损坏且无法打开。 gtable 对象也会被打印出来。所以我猜这里有问题。
但是,如您所见,我在示例代码中找到了grid.draw 函数来绘制至少我的组合图,但修改后我仍然无法ggsave 它。
我不想使用this article 中建议的“旧”(pdf(file = "test.pdf"); grid.draw(b); dev.off())设备保存功能,因为它们使用起来非常不舒服。
在this question 中,有人确切地询问如何保存对象,但在答案中他们只是解释使用grid.darw,他接受了solving the problem 的答案,到目前为止没有人在我的 cmets 上回答。
所以我现在很迷茫,如何为那些已经和没有更新到新的gridExtra 包的人提供工作脚本。在ggsave 函数中删除测试的方法是我想最好的解决方案,因为我可以检查gridExtra 和ggplot2 版本并覆盖ggsave 函数以防版本不匹配,但我可以不让它运行。
期待得到一些帮助。
编辑:
也许sessionInfo 有帮助
d> sessionInfo()
R version 3.2.0 (2015-04-16)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.9.5 (Mavericks)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] grid stats graphics grDevices utils datasets methods base
other attached packages:
[1] gridExtra_2.0.0 ggplot2_1.0.1
loaded via a namespace (and not attached):
[1] Rcpp_0.12.1 digest_0.6.8 MASS_7.3-44 plyr_1.8.3 gtable_0.1.2
[6] magrittr_1.5 scales_0.3.0 stringi_1.0-1 reshape2_1.4.1 devtools_1.9.1
[11] proto_0.3-10 tools_3.2.0 stringr_1.0.0 munsell_0.4.2 colorspace_1.2-6
[16] memoise_0.2.1
【问题讨论】:
-
您是否尝试使用 pdf() 而不是 ggsave?类似的东西: pdf(file = "test.pdf"); grid.newpage() ;print(b) ;dev.off()
-
此链接可能会有所帮助:alstatr.blogspot.co.uk/2015/02/…
-
@YCR 这是我在第二个链接中提到的。我知道这是可行的,但非常不方便。我希望
ggsave函数按照第一个链接中的建议工作,否则我必须更改脚本中的很多行... -
我可能不明白,但是
ggsave使用您的示例的错误/问题在哪里? -
@Pascal 我在下面直接添加了输出和评论,忘记提及问题所在:-)