Как сохранить сюжет в виде изображения на диске? - PullRequest
288 голосов
/ 22 августа 2011

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

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

Ответы [ 11 ]

358 голосов
/ 22 августа 2011

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


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

Чтобы сохранить сюжет, нужно сделать следующее:

  1. Откройте устройство, используя png(), bmp(), pdf() или аналогичный
  2. Сюжет вашей модели
  3. Закройте устройство, используя 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.

79 голосов
/ 01 сентября 2011

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

X11 ()
plot (x,y)

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

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

64 голосов
/ 17 ноября 2012

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

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

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

29 голосов
/ 22 августа 2011

Как это

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

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

11 голосов
/ 02 сентября 2014

По первому вопросу, я считаю 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 голосов
/ 22 августа 2011

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

3 голосов
/ 10 марта 2015

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

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

2 голосов
/ 23 декабря 2015
plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))

png(filename=plotpath)

plot(x,y, main= file)

dev.off()
0 голосов
/ 17 марта 2017
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()
0 голосов
/ 14 января 2017

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

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

...