在R函数内生成多个图形

36

我想在R中使用ggplot绘图功能从一个函数中生成多个图形窗口...

testf <- function(a, b) {
  devAskNewPage(TRUE)
  qplot(a, b);
  # grid.newpage(recording = TRUE)
  dev.new()
  qplot(a, a+a);
  # grid.newpage(recording = TRUE)
  dev.new()
  qplot(b, b+b);
}

library(ggplot2)

x <- rnorm(50)
y <- rnorm(50)
testf(x, y)

然而,无论是dev.new()还是grid.newpage()似乎都不能刷新前面的图像。

我知道在R中,函数通常只产生它们评估的最后一个结果,但我想更好地理解这个过程并了解任何可能的解决方法。

你有什么想法吗?


2
也许可以参考 R FAQ 7.22 http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-do-lattice_002ftrellis-graphics-not-work_003f。 - rcs
@rcs 您的评论回答了问题。请将其写成答案,以便被接受。 - gd047
RCS的评论建议某人不要阅读常见问题解答(FAQ) ;) - Marek
2
我不确定我是否应该能够发现这个问题... "7.22 为什么格子/栅格图形无法工作?" 几乎没有回答我关于 ggplot 和输出的问题。当FAQ(常见问题解答)被良好索引并提及某人可能搜索的所有关键短语时,它们才有效。 - William Doane
我同意你的观点。在你的情况下,你的问题与FAQ7.22之间没有直接联系。另一方面,你的问题也不是“清除前一个图形”,因为如果你将其写入png,那么两个图形都将为空。那么你可能会问:“为什么我的ggplot2无法工作?” - Marek
1个回答

37

在lattice和ggplot2中,基于网格的图形函数会创建一个图形对象,但不会直接显示。对于这个图形对象,print()方法用于将其实际显示出来。

print(qplot(x, y))

解决了这个问题。

参见R FAQ 7.22


2
你的建议是正确的,但这与网格没有什么关系 - 这只是一种编程风格决策。 - hadley
12
这句话的含义是:为了展示图形对象,需要一个print()方法。当你在命令行交互式地使用(ggplot2、grid等)函数时,结果会自动打印出来,但在source()或你自己编写的函数中,你需要显式地使用print()语句来打印出结果。这个提示非常重要,因此值得再次强调。 - smci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接