Как сохранить сюжет как изображение на диске?
Я рисую простую линейную регрессию с использованием 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()