Як зберегти сюжет як зображення на диску?


304

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

Є два різні питання: По-перше, я вже дивлюся на сюжет на моніторі і хотів би зберегти його таким, яким він є. По-друге, я ще не генерував сюжет, але хотів би безпосередньо зберегти його на диску, коли виконую код коду графіку.


Можливо, це питання слід відредагувати, щоб задати два різних сценарії: По-перше, ви можете працювати в інтерактивному режимі і створили хороший сюжет, який хочете зберегти. Або, по-друге, ви ще не бачили жодного сюжету, і хочете записати його безпосередньо на диск, не дивлячись спочатку на це - це мало б сенс, якби ви писали сценарій, щоб створити багато сюжетів для вас. Я відредагую це зараз
Аарон МакДейд,

Відповіді:


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.


4
якщо ви не встановили шлях, наприклад png (filename = "name.png"), ви можете знати каталог збереження зgetwd()
JuanPablo

2
Я розширив цю відповідь, щоб включити посилання на dev.print. Є два тісно пов'язані питання, на які, на мою думку, потрібні різні відповіді. Друге підпитання - це в основному "Як зберегти зображення, яке я вже побудував на екрані?". Вибачте, якщо моя редакція не дуже хороша, не соромтеся покращувати свої зміни.
Аарон Макдейд

Як це зробити, коли R запитує "Вибір"? Наприклад, якщо я використовую m3=garchFit(~arma(3,0)+garch(1,1))і plot(m3).
jacob

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, це рішення працювало на віртуальній машині без графічних пристроїв.
miguelmorin

Мені б хотілося, щоб у ВСІХ сюжетах у Р. був потужний, але простий підхід, подібний цьому, як би там не було, моє голосування йде тут.
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 зробити висновок про розширення файлу автоматично (тобто на основі функції)? Здається нудно змінити ім'я файлу, а також використану функцію.
Бонленфум

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/, існує спеціальне меню, яке дозволяє вам зберегти сюжет у будь-якому форматі, який вам подобається, і в будь-якій вибраній роздільній здатності.


4
Принаймні, це існує і в R GUI для Windows.
richiemorrisroe

іноді це загадково для мене не вдається, але виклик функції завжди працює
qwr

3

Якщо відкрити пристрій , використовуючи png(), bmp(), і pdf()т.д. , як було запропоновано Andrie (краща відповідь), вікно з ділянок не спливало відкритим, тільки * .png, * ВМР або * .pdf файли будуть створені. Це зручно в масштабних обчисленнях, оскільки R може обробляти лише обмежену кількість графічних вікон.

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



0

Щоб додати до цих відповідей, якщо у вас є сценарій R, що містить виклики, які генерують графіки на екрані (нативний пристрій), то всі вони можуть бути збережені у файлі pdf (пристрій за замовчуванням для неінтерактивної оболонки) "Rplots.pdf "(ім'я за замовчуванням) шляхом перенаправлення скрипту в R з терміналу (при умові, що ви працюєте з Linux або OS X), наприклад:

R < myscript.R --no-save

Це може бути перетворено у jpg / png за необхідності


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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.