0

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

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

4

1 回答 1

3

编辑:为 . 添加可能的方法ggplot

请注意,特别是不会自动调用的原因是,在调用finalize之前添加额外的材料(注释、补充绘图功能、标题、图例等)是非常常见的。输出。plotdev.off()plotdev.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()调用之前,根本无法写出文件)。

于 2017-05-28T22:50:44.723 回答