¿Cómo guardar una gráfica como imagen en el disco?
Trazo una regresión lineal simple usando R. Me gustaría guardar esa imagen como PNG o JPEG, ¿es posible hacerlo automáticamente? (vía código)
Hay dos preguntas diferentes: Primero, ya estoy mirando la trama en mi monitor y me gustaría guardarla tal cual. En segundo lugar, todavía no he generado el gráfico, pero me gustaría guardarlo directamente en el disco cuando ejecute mi código de trazado.
11 answers
Hay dos preguntas estrechamente relacionadas, y una respuesta para cada una.
1. Una imagen se generará en el futuro en mi script, ¿cómo la guardo en el disco?
Para guardar un gráfico, debe hacer lo siguiente:
- Abra un dispositivo, usando
png()
,bmp()
,pdf()
o similar - Trazar su modelo
- Cierre el dispositivo usando
dev.off()
Un código de ejemplo para guardar la gráfica en un archivo png
:
fit <- lm(some ~ model)
png(filename="your/file/location/name.png")
plot(fit)
dev.off()
Esto se describe en el página de ayuda (combinada) para los formatos gráficos?png
, ?bmp
, ?jpeg
y ?tiff
así como en la página de ayuda separada para ?pdf
.
Sin embargo, tenga en cuenta que la imagen puede verse diferente en el disco a la misma gráfica directamente trazada en su pantalla, por ejemplo, si ha cambiado el tamaño de la ventana en pantalla.
Tenga en cuenta que si su parcela está hecha por lattice
o ggplot2
tiene que imprimir explícitamente la parcela. Vea esta respuesta que explica esto con más detalle y también enlaces a las preguntas frecuentes de R: qplot de ggplot no se ejecuta en el abastecimiento
2. Actualmente estoy mirando un gráfico en mi pantalla y quiero copiarlo 'tal cual' en el disco.
dev.print(pdf, 'filename.pdf')
Esto debería copiar la imagen perfectamente, respetando cualquier cambio de tamaño que haya hecho a la ventana interactiva. Puede, como en la primera parte de esta respuesta, reemplazar pdf
con otros tipos de archivo como png
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:43
Si quieres seguir viendo la gráfica en R, otra opción es usar dev.copy
:
X11 ()
plot (x,y)
dev.copy(jpeg,filename="plot.jpg");
dev.off ();
Si llega a un desorden de demasiadas ventanas de trazado en R, use graphics.off()
para cerrar todas las ventanas de trazado.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-01 10:31:55
Si usas ggplot2
la forma preferida de guardar es usar ggsave
. Primero tienes que trazar, después de crear la trama que llamas ggsave
:
ggplot(...)
ggsave("plot.png")
El formato de la imagen está determinado por la extensión que elija para el nombre del archivo. Se pueden pasar parámetros adicionales a ggsave
, en particular width
, height
, y dpi
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-17 08:53:19
Así
png('filename.png')
# make plot
dev.off()
O esto
# sometimes plots do better in vector graphics
svg('filename.svg')
# make plot
dev.off()
O esto
pdf('filename.pdf')
# make plot
dev.off()
Y probablemente otros también. Todos están listados juntos en las páginas de ayuda.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-22 07:11:15
Para la primera pregunta, encuentro que dev.print
es el mejor cuando se trabaja interactivamente. Primero, configura su parcela visualmente y cuando esté satisfecho con lo que ve, puede pedirle a R que guarde la parcela actual en el disco
dev.print(pdf, file="filename.pdf");
Puede reemplazar pdf
con otros formatos como png
.
Esto copiará la imagen exactamente como la ves en la pantalla. El problema con dev.copy
es que la imagen es a menudo diferente y no recuerda el tamaño de la ventana y la relación de aspecto-que obliga a la trama a ser cuadrado por defecto.
Para la segunda pregunta, (como otros ya han respondido), debe dirigir la salida al disco antes de ejecutar sus comandos de trazado
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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-14 18:46:22
Si utiliza R Studio http://rstudio.org / hay un menú especial para guardar su parcela como cualquier formato que desee y en cualquier resolución que elija
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-22 11:22:38
Si abre un dispositivo usando png()
, bmp()
, pdf()
etc. según lo sugerido por Andrie (la mejor respuesta), las ventanas con parcelas no aparecerán abiertas, solo *.png, *bmp o *.se crearán archivos PDF. Esto es conveniente en cálculos masivos, ya que R solo puede manejar un número limitado de ventanas gráficas.
Sin embargo, si desea ver las parcelas y también guardarlas, llame a savePlot(filename, type)
después de que se dibujen las parcelas y la ventana que las contiene esté activa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-23 14:02:24
Para agregar a estas respuestas, si tiene un script R que contiene llamadas que generan gráficas a screen (el dispositivo nativo), entonces todas estas se pueden guardar en un archivo pdf (el dispositivo predeterminado para un shell no interactivo) "Rplots.pdf " (el nombre predeterminado) redirigiendo el script a R desde el terminal (suponiendo que esté ejecutando linux o OS X), por ejemplo:
R < myscript.R --no-save
Esto se puede convertir a jpg / png según sea necesario
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-10 11:39:45
En algunos casos uno quiere guardar e imprimir una gráfica base r. Pasé un poco de tiempo y se me ocurrió esta función de utilidad:
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")
Tenga en cuenta que se debe usar quote
, de lo contrario la llamada plot(x)
se ejecuta en el entorno global y NULL
se pasa a basesave()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-17 03:55:41