Как сохранить сюжет в виде изображения на диске?
Я строю простую линейную регрессию, используя R. Я хотел бы сохранить это изображение в формате PNG или JPEG, возможно ли сделать это автоматически? (через код)
Есть два разных вопроса: во-первых, я уже смотрю на график на своем мониторе и хотел бы сохранить его как есть. Во-вторых, я еще не сгенерировал график, но я хотел бы сохранить его непосредственно на диск, когда я выполню свой код построения.
11 ответов
Есть два тесно связанных вопроса, и ответ на каждый.
1. Изображение будет сгенерировано в будущем в моем скрипте, как мне сохранить его на диск?
Чтобы сохранить сюжет, нужно сделать следующее:
- Откройте устройство, используя
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 FAQ: qplot ggplot не выполняется при поиске
2. В настоящее время я смотрю на график на своем экране и хочу скопировать его "как есть" на диск.
dev.print(pdf, 'filename.pdf')
Это должно идеально скопировать изображение с учетом любого изменения размера, которое вы сделали для интерактивного окна. Вы можете, как и в первой части этого ответа, заменить pdf
с другими типами файлов, такими как png
,
Если вы хотите продолжать видеть график в R, другой вариант заключается в использовании dev.copy
:
X11 ()
plot (x,y)
dev.copy(jpeg,filename="plot.jpg");
dev.off ();
Если вы попали в загроможденность слишком большого количества окон графика в R, используйте graphics.off()
закрыть все окна сюжета.
Если вы используете ggplot2
предпочтительный способ экономии заключается в использовании ggsave
, Сначала вы должны построить, после создания сюжета вы называете ggsave
:
ggplot(...)
ggsave("plot.png")
Формат изображения определяется расширением, которое вы выбираете для имени файла. Дополнительные параметры могут быть переданы ggsave
, а именно width
, height
, а также dpi
,
Как это
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()
И, вероятно, другие тоже. Они все перечислены вместе на страницах справки.
По первому вопросу я нахожу 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
Если вы используете R Studio http://rstudio.org/ есть специальное меню для сохранения вашего графика в любом формате и в любом разрешении, которое вы выберете.
Если вы открываете устройство с помощью png()
, bmp()
, pdf()
и т.д., как подсказал Андри (лучший ответ), окна с графиками не будут открываться, будут созданы только файлы *.png, *bmp или *.pdf. Это удобно в массовых вычислениях, поскольку R может обрабатывать только ограниченное количество графических окон.
Однако, если вы хотите увидеть графики и сохранить их, позвоните savePlot(filename, type)
после того, как графики нарисованы, и окно, содержащее их, активно.
plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))
png(filename=plotpath)
plot(x,y, main= file)
dev.off()
Чтобы добавить к этим ответам, если у вас есть сценарий R, содержащий вызовы, которые генерируют графики на экране (собственное устройство), то все они могут быть сохранены в PDF-файл (устройство по умолчанию для неинтерактивной оболочки) "Rplots.pdf" (имя по умолчанию) путем перенаправления скрипта в R из терминала (при условии, что вы работаете в Linux или OS X), например:
R < myscript.R --no-save
Это может быть преобразовано в JPG / PNG по мере необходимости
В некоторых случаях требуется сохранить и распечатать базовый график. Я потратил немного времени и придумал эту полезную функцию:
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()
,
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()