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

304

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

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

blakc05
источник
Возможно, этот вопрос следует отредактировать, чтобы задать два разных сценария. Во-первых, вы можете работать в интерактивном режиме и создали хороший сюжет, который хотите сохранить. Или, во-вторых, вы еще не видели ни одного графика, и вы хотите записать его непосредственно на диск, не просматривая его сначала - это будет иметь смысл, если вы пишете сценарий, который генерирует для вас много графиков. Я отредактирую это сейчас
Аарон МакДейд,

Ответы:

376

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


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 FAQ: qplot ggplot не выполняется при поиске


2. Сейчас я смотрю на график на своем экране и хочу скопировать его «как есть» на диск.

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

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

Andrie
источник
4
если вы не указали путь, например, png (filename = "name.png"), вы можете узнать каталог сохранения с помощьюgetwd()
JuanPablo
2
Я расширил этот ответ, чтобы включить ссылку на dev.print. Есть два тесно связанных вопроса, на которые, я думаю, нужны разные ответы. Второй подвопрос в основном «Как сохранить изображение, которое я уже нанес на экран?». Извините, если мое редактирование не очень хорошее, не стесняйтесь улучшать мои изменения.
Аарон МакДейд
Как мне это сделать, когда R запрашивает «Выбор»? Например, если я использую m3=garchFit(~arma(3,0)+garch(1,1))и plot(m3).
Джейкоб
3
Как я могу сохранить фигуру с dpi = 3000
Абхишек
2
8 лет, используя R, не зная, что я могу на самом деле сохранить открытый файл на моем экране в файл. Думаю, мне это не нужно ... но большое спасибо: D
Саймон С.
82

Если вы хотите продолжать видеть график в 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заставляет каждое изображение быть квадратным по умолчанию. Это расстраивает, если вы все настроили красиво в интерактивном режиме
Аарон МакДейд,
4
Я использую dev.print()параметры ширины и высоты, чтобы определить размеры. например dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
Скотт
72

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

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

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

Пол Химстра
источник
Это работает хорошо в цикле, dev.off не работал для меня
princelySid
Плюсом этого является последовательный API, и нет необходимости возиться с включением и выключением устройств
qwr
В отличие от решений dev, это решение работало на виртуальной машине без графических устройств.
Мигельморин
Хотелось бы, чтобы для ВСЕХ заговоров в R. был такой мощный, но простой подход, как этот. В любом случае, мой голос здесь.
SilSur
1
Все еще действует почти 7 лет! Спасибо.
Ник
30

Как это

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

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

Оуэн
источник
Есть ли способ для R автоматически определить расширение файла (т.е. на основе функции)? Кажется утомительным, чтобы изменить имя файла, а также используемую функцию.
Bonlenfum
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/, есть специальное меню для сохранения вашего графика в любом формате и в любом разрешении, которое вы выберете.

Efstratios Charitos
источник
4
Это также существует в графическом интерфейсе R в Windows, по крайней мере.
richiemorrisroe
иногда это для меня таинственно не получается, но вызов функции всегда работает
qwr
3

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

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

Алекс Файнштейн
источник
0

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

R < myscript.R --no-save

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

waferthin
источник
0

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

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

Deleet
источник
0
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()
orientchen1978
источник