如何将图自动保存为png?

时间:2018-06-27 16:16:25

标签: r x11 graphic rstudio-server

是否可以通过以下方式将图以png格式自动保存到文件夹中?

  1. 每次调用png都会创建一个新的plot.new()文件
  2. 文件在每次图形更新时都进行更新(例如,调用points()lines()rect()时),以便每当图形更新时,文件也会更新(不更新)必须通过dev.off()关闭设备)

如果可能的话,以下代码应按预期工作:

plot(rnorm(100))
# create a new png file (e.g. plot-1.png) and the graphics is output to the file

plot(rnorm(100))
# create a new png file (e.g. plot-2.png) and the graphics is output to the file
abline(h = 0, col = "red")
# then the line is output to the file

这样做的动机是试图避免X11 / Quartz转发(它们在屏幕/ tmux上不能很好地工作,因为当用户从其他地方附加会话时图形会丢失),并避免xpra似乎很少有人支持它(导致Ubuntu 16.04卡在登录屏幕上,请参阅https://askubuntu.com/questions/930161/ubuntu-16-04-2-cannot-login-after-installing-xpra?noredirect=1#comment1661998_930161)。

这与RStudio Server处理R图形的方式非常相似(请参见https://github.com/rstudio/rstudio/tree/master/src/cpp/r/session/graphics的源代码)。我想知道是否有更简单的方法来实现这一点(最好不要从头开始重写图形设备)?

1 个答案:

答案 0 :(得分:4)

尽管github页面包含更多信息,我将快速总结如何使用rmote

  1. ssh -L 4321:localhost:4321 remoteuser@remotehost
  2. tmux(如果已经启动,则为tmux attach
  3. emacs,使用ESS启动R
  4. 一旦开始,就开始:

    library(rmote)
    start_rmote(server_dir="path/to/save/pngs")
    
  5. 进行一些绘图,将本地Web浏览器指向http://127.0.0.1:4321。 (最初它会显示一个目录列表,但是一旦开始绘制,它将自动刷新。)

    plot(1:10, type='l')
    plot_done() # required for base-graphics
    plot(2:20)
    plot_done()
    library(ggplot2)
    ggplot(mtcars, aes(mpg, disp)) + geom_point() # no plot_done() required for ggplot2
    
  6. 断开与tmux / ssh的连接。 (由于关闭了隧道,网页可能会失败。)

  7. 重新连接ssh -L 4321:localhost:4321 remoteuser@remotehosttmux attach
  8. 刷新浏览器,所有图都可用(仍具有完整的历史记录)
  9. 完成后,stop_rmote()。所有图都保存在path/to/save/pngs/plots/中。

奖金:如果您对同一目录执行start_rmote(...),则可以使用相同的绘图历史记录。因此,如果必须重新启动R会话,则不会丢失任何内容。 (我还没有测试过,但是也许可以同时使用R会话...)

编辑

我经常更改图的大小,部分是为了填充浏览器的屏幕,但有时会设置报告的特定文件大小或复制不同的屏幕限制。

options(rmote_device = list(type="png", retina=TRUE, width=1024, height=768))

参考:https://github.com/cloudyr/rmote/blob/ee13936806cc1be5b2f95b70b33af374331ae2dc/man/rmote_device.Rd

编辑2 :我想我应该注意,尽管可能未充分利用rmote的功能,但可以将 just 用于使用大多数绘图方法自动生成PNG的目的。您无需连接127.0.0.1:4321即可实现自动保存PNG的好处。