Как сохранить сюжет в виде изображения на диске?

266

Я рисую простую линейную регрессию с использованием R. Я хотел бы сохранить это изображение как PNG или JPEG, возможно ли это сделать автоматически? (через код)

Есть два разных вопроса: во-первых, я уже смотрю сюжет на моем мониторе, и я хотел бы сохранить его как есть. Во-вторых, я еще не создал сюжет, но я хотел бы сохранить его на диск при выполнении кода построения.

  • 0
    Возможно, этот вопрос следует отредактировать, чтобы задать два разных сценария. Во-первых, вы можете работать в интерактивном режиме и создали хороший сюжет, который хотите сохранить. Или, во-вторых, вы еще не видели ни одного графика и хотите записать его непосредственно на диск, не просматривая его в первую очередь - это будет иметь смысл, если вы пишете сценарий, который генерирует для вас множество графиков. Сейчас буду редактировать
Теги:
ggplot2
plot
lattice
r-faq

11 ответов

321
Лучший ответ

Есть два тесно связанных вопроса и ответ для каждого.


1. Изображение будет создано в будущем в моем script, как его сохранить на диск?

Чтобы сохранить график, вам необходимо сделать следующее:

  • Откройте устройство, используя png(), bmp(), pdf() или аналогичные
  • Запланируйте свою модель.
  • Закройте устройство, используя dev.off()

Пример кода для сохранения графика в файле png:

fit <- lm(some ~ model)

png(filename="your/file/location/name.png")
plot(fit)
dev.off()

Это описано на странице (комбинированной) справки для графических форматов ?png, ?bmp, ?jpeg и ?tiff, а также на отдельной странице справки для ?pdf.

Обратите внимание, однако, что изображение может выглядеть по-другому на диске на тот же график, который непосредственно отображается на вашем экране, например, если вы изменили размер экранного окна.


Обратите внимание, что если ваш график сделан либо с помощью lattice, либо ggplot2, вы должны явно распечатать график. См. Этот ответ, который объясняет это более подробно, а также ссылки на часто задаваемые вопросы R: qplot ggplot не выполняется при поиске


2. В настоящее время я просматриваю сюжет на моем экране, и я хочу скопировать его на диск как "есть-есть".

dev.print(pdf, 'filename.pdf')

Это должно полностью копировать изображение, учитывая любое изменение размера, которое вы сделали в интерактивном окне. Вы можете, как и в первой части этого ответа, заменить pdf на другие типы файлов, такие как png.

  • 2
    если вы не указали путь, например, png (filename = "name.png"), вы можете узнать каталог сохранения с помощью getwd()
  • 2
    Я расширил этот ответ, включив ссылку на dev.print . Есть два тесно связанных вопроса, на которые, я думаю, нужны разные ответы. Второй подвопрос в основном «Как сохранить изображение, которое я уже нанес на экран?». Извините, если мое редактирование не очень хорошо, не стесняйтесь улучшать мои изменения.
Показать ещё 3 комментария
68

Если вы хотите видеть график в R, другой вариант - использовать dev.copy:

X11 ()
plot (x,y)

dev.copy(jpeg,filename="plot.jpg");
dev.off ();

Если вы достигли загромождения слишком большого количества окон графика в R, используйте graphics.off(), чтобы закрыть все окна графика.

  • 2
    Отличный ответ! Это позволяет вам экспериментировать с графиками через X, пока вы не будете довольны результатами, а затем сохранить их на месте. Обычно это наиболее удобный режим работы.
  • 3
    dev.print лучше, так как он точно копирует изображение с экрана. dev.copy заставляет каждое изображение быть квадратным по умолчанию. Это расстраивает, если вы все настроили красиво в интерактивном режиме
Показать ещё 1 комментарий
53

Если вы используете ggplot2, предпочтительный способ сохранения - использовать ggsave. Сначала вы должны построить, после создания сюжета вы вызываете ggsave:

ggplot(...)
ggsave("plot.png")

Формат изображения определяется расширением, которое вы выбираете для имени файла. Дополнительные параметры можно передать в ggsave, особенно width, height и dpi.

  • 0
    Это хорошо работает в цикле, dev.off не работал для меня
24

Подобно этому

png('filename.png')
# make plot
dev.off()

или

# sometimes plots do better in vector graphics
svg('filename.svg')
# make plot
dev.off()

или

pdf('filename.pdf')
# make plot
dev.off()

И, возможно, и другие. Все они перечислены на страницах справки.

  • 0
    Есть ли способ для R автоматически определить расширение файла (то есть, основываясь на функции)? Кажется утомительным, чтобы изменить имя файла, а также используемую функцию.
11

Для первого вопроса я считаю, что dev.print является лучшим при работе в интерактивном режиме. Сначала вы настраиваете свой сюжет визуально, и когда вы довольны тем, что видите, вы можете попросить R сохранить текущий график на диске

dev.print(pdf, file="filename.pdf");

Вы можете заменить pdf на другие форматы, такие как png.

Это скопирует изображение точно так же, как вы видите его на экране. Проблема с dev.copy заключается в том, что изображение часто отличается и не запоминает размер окна и соотношение сторон - он заставляет график быть квадратным по умолчанию.

Во втором вопросе (как уже ответили другие) вы должны направить вывод на диск перед выполнением команд построения

pdf('filename.pdf')
plot( yourdata )
points (some_more_data)
dev.off() # to complete the writing process and return output to your monitor
8

Если вы используете R Studio http://rstudio.org/, есть специальное меню для сохранения вашего сюжета в любом формате, который вам нравится, и при любом выбранном вами разрешении

  • 4
    Это также существует в графическом интерфейсе R в Windows, по крайней мере.
2
plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))

png(filename=plotpath)

plot(x,y, main= file)

dev.off()
2

Если вы открываете устройство с помощью png(), bmp(), pdf() и т.д., как это было предложено Andrie (лучший ответ), окна с графиками не будут открываться, просто *.png, * bmp или *.pdf файлы будут созданы. Это удобно в массовых расчетах, так как R может обрабатывать только ограниченное количество графических окон.

Однако, если вы хотите просмотреть графики и сохранить их, вызовите savePlot(filename, type) после того, как графики будут рисованы, и окно, содержащее их, будет активным.

0
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()
0

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

x = 1:10

basesave = function(expr, filename, print=T) {
  #extension
  exten = stringr::str_match(filename, "\\.(\\w+)$")[, 2]

  switch(exten,
         png = {
           png(filename)
           eval(expr, envir = parent.frame())
           dev.off()
         },
         {stop("filetype not recognized")})


  #print?
  if (print) eval(expr, envir = parent.frame())

  invisible(NULL)
}

#plots, but doesn't save
plot(x)

#saves, but doesn't plot
png("test.png")
plot(x)
dev.off()

#both
basesave(quote(plot(x)), "test.png")

#works with pipe too
quote(plot(x)) %>% basesave("test.png")

Обратите внимание, что нужно использовать quote, иначе вызов plot(x) запускается в глобальной среде, а NULL передается basesave().

0

Чтобы добавить к этим ответам, если у вас есть R script, содержащий вызовы, которые генерируют графики для экрана (собственное устройство), то все они могут быть сохранены в файле pdf (устройство по умолчанию для неинтерактивной оболочки ) "Rplots.pdf" (имя по умолчанию) путем перенаправления script на R из терминала (при условии, что вы используете Linux или OS X), например:

R < myscript.R --no-save

Это может быть преобразовано в jpg/png при необходимости

Ещё вопросы

Сообщество Overcoder
Наверх
Меню