在 R 中绘图后自动调用 dev.off
Automatically calling dev.off after plot in R
我正在寻找一种方法,当有人调用 plot() 或 ggplot() 时自动调用 dev.off() 将绘图刷新到磁盘。
这可能吗? RStudio 看起来会自动加载绘图,它是如何工作的?
编辑: 为 ggplot
添加可能的方法。
请注意 原因 plot
,尤其是不会自动调用 dev.off()
的原因是它很常见——在调用 plot
-- 在调用 dev.off()
最终确定输出之前通过额外的调用添加额外的 material(注释、补充绘图功能、标题、图例等)。
但是,如果您真的想要plot
完成情节并防止添加任何进一步的内容,您可以通过重新定义plot
来完成:
plot <- function(...) {
graphics::plot(...)
dev.off()
}
请注意,对于 window-based 图形设备(例如 x11
),绘图会在消失前在屏幕上短暂闪烁,因为 dev.off()
关闭了 window,但它应该适用于文件:
> 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,所以我不确定它有什么不同,但我猜测它会以同时显示 "plot in progress" 的方式拦截图形命令在文件最终确定之前,而不是实际显示文件(对于位图图形,在绘图完全完成并调用 dev.off()
之前根本无法写出)。
我正在寻找一种方法,当有人调用 plot() 或 ggplot() 时自动调用 dev.off() 将绘图刷新到磁盘。
这可能吗? RStudio 看起来会自动加载绘图,它是如何工作的?
编辑: 为 ggplot
添加可能的方法。
请注意 原因 plot
,尤其是不会自动调用 dev.off()
的原因是它很常见——在调用 plot
-- 在调用 dev.off()
最终确定输出之前通过额外的调用添加额外的 material(注释、补充绘图功能、标题、图例等)。
但是,如果您真的想要plot
完成情节并防止添加任何进一步的内容,您可以通过重新定义plot
来完成:
plot <- function(...) {
graphics::plot(...)
dev.off()
}
请注意,对于 window-based 图形设备(例如 x11
),绘图会在消失前在屏幕上短暂闪烁,因为 dev.off()
关闭了 window,但它应该适用于文件:
> 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,所以我不确定它有什么不同,但我猜测它会以同时显示 "plot in progress" 的方式拦截图形命令在文件最终确定之前,而不是实际显示文件(对于位图图形,在绘图完全完成并调用 dev.off()
之前根本无法写出)。