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

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

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

Ответ 1

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


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

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

X11 ()
plot (x,y)

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

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

Ответ 3

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

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

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

Ответ 4

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

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()

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

Ответ 5

Для первого вопроса я считаю, что 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

Ответ 6

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

Ответ 7

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

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

Ответ 8

plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))

png(filename=plotpath)

plot(x,y, main= file)

dev.off()

Ответ 9

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

R < myscript.R --no-save

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

Ответ 10

В некоторых случаях вы хотите сохранить и распечатать базовый график 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().

Ответ 11

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