Jak zapisać wykres jako obraz na dysku?

Rysuję prostą regresję liniową za pomocą R. Chciałbym zapisać ten obraz jako PNG lub JPEG, czy można to zrobić automatycznie? (poprzez kod)

Są dwa różne pytania: po pierwsze, już patrzę na wykres na moim monitorze i chciałbym zapisać go tak, jak jest. Po drugie, nie wygenerowałem jeszcze wykresu, ale chciałbym bezpośrednio zapisać go na dysku podczas wykonywania mojego kodu wykresu.

Author: Aaron McDaid, 2011-08-22

11 answers

Istnieją dwa ściśle powiązane pytania i odpowiedź na każde.


1. Obraz zostanie wygenerowany w przyszłości w moim skrypcie, jak zapisać go na dysku?

Aby zapisać działkę, musisz wykonać następujące czynności:

  1. otworzyć urządzenie, używając png(), bmp(), pdf() lub podobne
  2. Wykreśl swój model
  3. zamknij urządzenie za pomocą dev.off()

Przykładowy kod do zapisania wykresu do pliku png:

fit <- lm(some ~ model)

png(filename="your/file/location/name.png")
plot(fit)
dev.off()

Jest to opisane w strona pomocy dla formatów graficznych?png, ?bmp, ?jpeg i ?tiff oraz na osobnej stronie pomocy dla ?pdf.

Zauważ jednak, że obraz może wyglądać inaczej na dysku niż ten sam wykres bezpośrednio na ekranie, na przykład jeśli zmieniłeś rozmiar okna na ekranie.


Zauważ, że jeśli wykres jest tworzony przez lattice lub ggplot2, musisz wyraźnie wydrukować wykres. Zobacz tę odpowiedź, która wyjaśnia to bardziej szczegółowo, a także linki do FAQ R: qplot ggplot nie uruchamia się przy pozyskiwaniu


2. Obecnie patrzę na wykres na moim ekranie i chcę skopiować go "tak jak jest" na dysk.

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

To powinno idealnie skopiować obraz, z poszanowaniem każdej zmiany rozmiaru w oknie interaktywnym. Możesz, tak jak w pierwszej części tej odpowiedzi, zastąpić pdf innymi typami plików, takimi jak png.

 326
Author: Andrie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:43

Jeśli chcesz nadal widzieć Wykres W R, inną opcją jest użycie dev.copy:

X11 ()
plot (x,y)

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

Jeśli osiągniesz bałagan zbyt wielu okien wykresu W R, użyj graphics.off(), aby zamknąć wszystkie okna wykresu.

 72
Author: Itamar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 10:31:55

Jeśli używasz ggplot2 preferowanym sposobem zapisu jest użycie ggsave. Najpierw musisz wykreślić, po utworzeniu wykresu wywołujesz ggsave:

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

Format obrazu zależy od rozszerzenia wybranego dla nazwy pliku. Dodatkowe parametry można przekazać ggsave, w szczególności width, height, i dpi.

 52
Author: Paul Hiemstra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-17 08:53:19

Like this

png('filename.png')
# make plot
dev.off()

Lub to

# sometimes plots do better in vector graphics
svg('filename.svg')
# make plot
dev.off()

Lub to

pdf('filename.pdf')
# make plot
dev.off()

I prawdopodobnie inni też. Wszystkie są wymienione razem na stronach pomocy.

 26
Author: Owen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-22 07:11:15

Na pierwsze pytanie uważam, że dev.print jest najlepszy w pracy interaktywnej. Po pierwsze, skonfigurujesz Wykres wizualnie i kiedy będziesz zadowolony z tego, co widzisz, możesz poprosić R o zapisanie bieżącej wykresu na dysku

dev.print(pdf, file="filename.pdf");

Możesz zastąpić pdf innymi formatami, takimi jak png.

To skopiuje obraz dokładnie tak, jak widzisz go na ekranie. Problem z dev.copy polega na tym, że obraz jest często inny i nie pamięta rozmiaru okna i proporcji obrazu-wymusza to na wykresie domyślnie kwadratowy.

Na drugie pytanie, (jak inni już odpowiedzieli), musisz skierować wyjście na dysk, zanim wykonasz swoje polecenia kreślarskie

pdf('filename.pdf')
plot( yourdata )
points (some_more_data)
dev.off() # to complete the writing process and return output to your monitor
 11
Author: Aaron McDaid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-14 18:46:22

Jeśli używasz R Studio http://rstudio.org/ istnieje specjalne menu, aby zapisać wykres w dowolnym formacie i w dowolnej rozdzielczości wybrać

 8
Author: efstratios charitos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-22 11:22:38

Jeśli otworzysz urządzenie za pomocą png(), bmp(), pdf() itd. zgodnie z sugestią Andrie (najlepsza odpowiedź), okna z działkami nie wyskakują, tylko *.png, * bmp lub *.pliki pdf zostaną utworzone. Jest to wygodne w dużych obliczeniach, ponieważ R może obsługiwać tylko ograniczoną liczbę okien graficznych.

Jednakże, jeśli chcesz zobaczyć wykresy i mieć je zapisane, wywołaj savePlot(filename, type) po narysowaniu Wykresów, a okno zawierające je jest aktywne.

 2
Author: Alex Fainshtein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-10 07:08:37
plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))

png(filename=plotpath)

plot(x,y, main= file)

dev.off()
 2
Author: Gijs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-23 14:02:24

Aby dodać do tych odpowiedzi, jeśli masz skrypt r zawierający wywołania, które generują wykresy na ekranie( urządzenie natywne), to wszystkie one mogą być zapisane w pliku pdf (domyślne urządzenie dla nieinteraktywnej powłoki) "Rplots.pdf " (domyślna nazwa) poprzez przekierowanie skryptu do R z terminala (zakładając, że używasz Linuksa lub OS X), np.:

R < myscript.R --no-save

To może być przekonwertowane do jpg/png w razie potrzeby

 0
Author: wannymahoots,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 11:39:45

W niektórych przypadkach chce się zarówno zapisać, jak i wydrukować wykres r bazy. Spędziłem trochę czasu i wymyśliłem tę funkcję użyteczności:

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

Należy pamiętać, że należy użyć quote, w przeciwnym razie wywołanie plot(x) jest uruchamiane w środowisku globalnym i NULL jest przekazywane do basesave().

 0
Author: Deleet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-13 21:24:45
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()
 0
Author: orientchen1978,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 03:55:41