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.
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:
- otworzyć urządzenie, używając
png()
,bmp()
,pdf()
lub podobne - Wykreśl swój model
- 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
.
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.
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
.
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.
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
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ć
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.
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()
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
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()
.
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()
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