¿Cómo guardar una trama como imagen en el disco?


304

Trazo una regresión lineal simple usando R. Me gustaría guardar esa imagen como PNG o JPEG, ¿es posible hacerlo automáticamente? (a través del código)

Hay dos preguntas diferentes: Primero, ya estoy mirando la trama en mi monitor y me gustaría guardarla tal como está. En segundo lugar, todavía no he generado el diagrama, pero me gustaría guardarlo directamente en el disco cuando ejecuto mi código de diagrama.


Quizás esta pregunta debería ser editada para preguntar sobre dos escenarios distintos: Primero, podría estar trabajando de manera interactiva y haber creado una buena trama que desea guardar. O, en segundo lugar, aún no ha visto ninguna trama y desea escribirla directamente en el disco sin mirarla primero; esto tendría sentido si estuviera escribiendo un script para generar muchas tramas para usted. Lo editaré ahora
Aaron McDaid

Respuestas:


376

Hay dos preguntas estrechamente relacionadas y una respuesta para cada una.


1. En el futuro se generará una imagen en mi script, ¿cómo la guardo en el disco?

Para guardar una trama, debe hacer lo siguiente:

  1. Abrir un dispositivo, utilizando png(), bmp(), pdf()o similares
  2. Traza tu modelo
  3. Cierre el dispositivo usando dev.off()

Algún código de ejemplo para guardar la trama en un pngarchivo:

fit <- lm(some ~ model)

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

Esto se describe en la página de ayuda (combinado) para los formatos gráficos ?png, ?bmp, ?jpegy ?tiffasí como en la página de ayuda separada para ?pdf.

Sin embargo, tenga en cuenta que la imagen puede verse diferente en el disco con respecto al mismo diagrama trazado directamente en su pantalla, por ejemplo, si ha cambiado el tamaño de la ventana en pantalla.


Tenga en cuenta que si su diagrama está hecho por cualquiera de los dos latticeo ggplot2tiene que imprimirlo explícitamente. 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 viendo un diagrama en mi pantalla y quiero copiarlo "tal cual" al 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 pdfcon otros tipos de archivos como png.


44
si no configura la ruta, como png (filename = "name.png"), puede conocer el directorio de guardar congetwd()
JuanPablo

2
He extendido esta respuesta para incluir una referencia a dev.print. Hay dos preguntas estrechamente relacionadas que creo que necesitan respuestas diferentes. La segunda subpregunta es básicamente "¿Cómo guardo una imagen que ya he trazado en mi pantalla?". Disculpas si mi edición no es muy buena, no dudes en mejorar mis ediciones.
Aaron McDaid

¿Cómo hago esto cuando R pide una "Selección"? Por ejemplo, si uso m3=garchFit(~arma(3,0)+garch(1,1))y plot(m3).
jacob

3
¿Cómo puedo guardar la cifra con dpi = 3000
Abhishek

2
8 años usando R sin saber que realmente podría guardar el desarrollador abierto en mi pantalla en un archivo. Supongo que no necesitaba eso ... pero muchas gracias: D
Simon C.

82

Si desea seguir viendo la trama 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.


2
¡Gran respuesta! Esto le permite experimentar con gráficos a través de X, hasta que esté satisfecho con los resultados, y luego guardarlos en el acto. Este suele ser el modo de operación más conveniente.
Aaron McDaid el

3
dev.printes mejor ya que copia la imagen de la pantalla exactamente. dev.copyfuerza que cada imagen sea cuadrada por defecto. Esto es frustrante si ha configurado todo muy bien de forma interactiva
Aaron McDaid

44
Utilizo dev.print()con los parámetros ancho y alto para definir las dimensiones. por ejemplo dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
Scott el

72

Si usa ggplot2la 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. Los parámetros adicionales se pueden pasar a ggsave, en particular width, heighty dpi.


Esto funciona bien en un bucle, dev.off no funcionó para mí
princelySid

La ventaja de esto es la API consistente y no hay necesidad de meterse con encender y apagar dispositivos
qwr

A diferencia de las soluciones con dev, esta solución funcionó en una máquina virtual sin dispositivos gráficos.
miguelmorin

Desearía que hubiera un enfoque poderoso, pero simple, como este para TODOS los complots en R. De todos modos, mi voto va aquí.
SilSur

1
Todavía válido casi 7 años después! Gracias.
Nick

30

Me gusta esto

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 se enumeran juntos en las páginas de ayuda.


¿Hay alguna forma de que R infiera la extensión del archivo automáticamente (es decir, en función de la función)? Parece tedioso tener que cambiar el nombre del archivo y la función utilizada.
Bonlenfum el

11

Para la primera pregunta, creo que soy dev.printel mejor cuando trabajo de forma interactiva. Primero, configura su trama visualmente y cuando está satisfecho con lo que ve, puede pedirle a R que guarde la trama actual en el disco

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

Puede reemplazar pdfcon otros formatos como png.

Esto copiará la imagen exactamente como la ve en la pantalla. El problema dev.copyes que la imagen a menudo es diferente y no recuerda el tamaño de la ventana y la relación de aspecto: obliga a que el gráfico sea cuadrado de forma predeterminada.

Para la segunda pregunta (como ya han respondido otros), 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

8

Si usa R Studio http://rstudio.org/ hay un menú especial para guardar su trama en cualquier formato que desee y en cualquier resolución que elija


44
Esto también existe en la GUI R en Windows, al menos.
richiemorrisroe

a veces esto me falla misteriosamente, pero llamar a una función siempre funciona
qwr

3

Si abre un dispositivo usando png(), etc. bmp(), pdf()como sugiere Andrie (la mejor respuesta), las ventanas con gráficos no se abrirán, solo se crearán archivos * .png, * bmp o * .pdf. Esto es conveniente en cálculos masivos, ya que R puede manejar solo un número limitado de ventanas gráficas.

Sin embargo, si desea ver los gráficos y también tenerlos guardados, llame savePlot(filename, type)después de que se dibujen los gráficos y la ventana que los contiene esté activa.



0

Para agregar a estas respuestas, si tiene una secuencia de comandos R que contiene llamadas que generan trazados en la pantalla (el dispositivo nativo), todos estos se pueden guardar en un archivo pdf (el dispositivo predeterminado para un shell no interactivo) "Rplots.pdf "(el nombre predeterminado) al redirigir el script a R desde la terminal (suponiendo que esté ejecutando Linux u OS X), por ejemplo:

R < myscript.R --no-save

Esto podría convertirse a jpg / png según sea necesario


0

En algunos casos, uno quiere guardar e imprimir un diagrama 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 plot(x)llamada se ejecuta en el entorno global y NULLse pasa a basesave().


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.