¿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.

Author: Aaron McDaid, 2011-08-22

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:

  1. Abra un dispositivo, usando png(), bmp(), pdf() o similar
  2. Trazar su modelo
  3. 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.

 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/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.

 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/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.

 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/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.

 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/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
 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/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

 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/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.

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

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

 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/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()
 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-17 03:55:41