Как автоматически сохранять графики в png? - PullRequest
0 голосов
/ 27 июня 2018

Возможно ли, что графики автоматически сохраняются в папке в формате 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 (они не очень хорошо работают с screen / 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 голосов
/ 27 июня 2018

Я быстро подведу итог, как я использую rmote, хотя страница github содержит гораздо больше информации.

  1. ssh -L 4321:localhost:4321 remoteuser@remotehost
  2. tmux (или tmux attach, если уже запущен)
  3. emacs, начать R с помощью ESS
  4. Однажды, чтобы начать работу:

    library(rmote)
    start_rmote(server_dir="path/to/save/pngs")
    
  5. Создайте несколько графиков, указывая вашему локальному веб-браузеру на 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@remotehost и tmux attach.
  8. Обновление браузера, все доступные графики (с полной историей)
  9. Когда закончите, stop_rmote(). Все графики сохраняются в path/to/save/pngs/plots/.

Бонус: если вы делаете start_rmote(...) с тем же каталогом, будет доступна та же история сюжета. Так что если вам нужно перезапустить сеанс R, ничего не было потеряно. (Я не тестировал его, но, возможно, он будет работать с одновременными сеансами R ...)

EDIT

Я часто изменяю размер графика, частично для того, чтобы я мог заполнить экран моего браузера, но иногда для установки определенных размеров файлов для отчетов или для репликации другого ограничения экрана.

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, его, безусловно, можно использовать просто для целей автоматического -Генерация ПНГ с большинством методов построения графиков. Вам не нужно подключаться к 127.0.0.1:4321, чтобы реализовать автоматическое сохранение PNG.

...