【问题标题】:Automatically calling dev.off after plot in R在 R 中绘图后自动调用 dev.off
【发布时间】:2017-05-28 22:12:07
【问题描述】:

我正在寻找一种在有人调用 plot() 或 ggplot() 时自动调用 dev.off() 将绘图刷新到磁盘的方法。

这可能吗? RStudio 看起来会自动加载绘图,它是如何工作的?

【问题讨论】:

  • 解决第二部分:RStudio 创建自己的图形设备,类型为RStudioGD。如果您在 RStudio 中右键单击并“检查”绘图,您会看到该图像是一个临时文件,由运行在幕后的服务器发送到 RStudio(本质上是一个浏览器)。

标签: r rlang


【解决方案1】:

编辑:ggplot 添加可能的方法。

请注意,plot 不会自动调用dev.off()原因是因为它很常见——在调用plot 之后——添加额外的材料(注释、补充绘图功能、标题、图例等),在调用dev.off() 完成输出之前进行额外调用。

但是,如果您真的希望plot 完成情节并阻止添加任何进一步的内容,您可以通过重新定义plot 来实现:

plot <- function(...) {
    graphics::plot(...)
    dev.off()
}

请注意,对于基于窗口的图形设备(例如,x11),由于dev.off() 会关闭窗口,所以绘图会在屏幕上短暂闪烁然后消失,但它应该可以正常处理文件:

> png("plot.png")
> plot(1:10,runif(10))
null device     <-- proof that dev.off() was called
          1 
> 

对于ggplot2,我想你最好的选择是覆盖print 方法(这是通常在屏幕上显示绘图的方式)。所以,如果你定义:

print.ggplot <- function(...) {
    ggplot2:::print.ggplot(...)
    dev.off()
}

然后:

> png("plot.png")
> ggplot(mapping=aes(x=1:10,y=1:10))+geom_line()
[[ print method is implicitly called here ]]
> dev.off()   # to prove that dev.off() was already called
Error in dev.off() : cannel shut down device 1 (the null device)
>

似乎可以按照您想要的方式工作。

我不使用 RStudio,所以我不确定它有什么不同,但我猜它以这样一种方式截取图形命令,即在文件已最终确定,而不是实际显示文件(对于位图图形,在绘图完全完成并调用 dev.off() 之前,根本无法写出文件)。

【讨论】:

  • 最好给函数起一个名字而不是plot(),以免它在下游造成一些意想不到的疯狂。
  • 谢谢!对于 ggplot 和其他图表,您将如何解决这个问题?我试过了,但它似乎会导致错误。
  • 您能否提供一个真实的ggplot 示例来说明您希望它如何工作?
  • 库('ggplot2') ggplot(mapping=aes(x=1:10, y=1:​​10)) + geom_line()
  • 好的,但是这个输出应该去哪里呢?什么设备是打开的,现在需要关闭?使用ggsave 保存最后一个绘图不是比假设设备已打开并且dev.off() 它更容易吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 2017-08-22
  • 2012-10-04
  • 2017-12-16
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多