2012-07-30 11 views
24

Realmente apreciaría su ayuda con el siguiente problema. Conozco varias maneras de guardar un solo diagrama en un archivo. Mi pregunta es: ¿Cómo guardo correctamente un multiplot en un archivo?R - guardar multiplo en el archivo

Para empezar, no soy un usuario de R con experiencia. Yo uso ggplot2 para crear mis tramas, y otra cosa que probablemente debería mencionar es que uso la GUI de RStudio. Usando un example del R Cookbook, puedo crear múltiples gráficos en una ventana.

Me gustaría guardar este llamado multiplot en un archivo (preferiblemente como jpeg), pero de alguna manera no lo hago.

estoy creando el G. múltiple de la siguiente manera:

##define multiplot function 
    multiplot <- function(..., plotlist=NULL, cols) { 
     require(grid) 

     # Make a list from the ... arguments and plotlist 
     plots <- c(list(...), plotlist) 

     numPlots = length(plots) 

     # Make the panel 
     plotCols = cols       # Number of columns of plots 
     plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols 

     # Set up the page 
     grid.newpage() 
     pushViewport(viewport(layout = grid.layout(plotRows, plotCols))) 
     vplayout <- function(x, y) 
      viewport(layout.pos.row = x, layout.pos.col = y) 

     # Make each plot, in the correct location 
     for (i in 1:numPlots) { 
      curRow = ceiling(i/plotCols) 
      curCol = (i-1) %% plotCols + 1 
      print(plots[[i]], vp = vplayout(curRow, curCol)) 
     } 

    } 

## define subplots (short example here, I specified some more aesthetics in my script) 
plot1a <- qplot(variable1,variable2,data=Mydataframe1) 
plot1b <- qplot(variable1,variable3,data=Mydataframe1) 
plot1c <- qplot(variable1,variable2,data=Mydataframe2) 
plot1d <- qplot(variable1,variable3,data=Mydataframe2) 

## plot in one frame 
Myplot <- multiplot(plot1a,plot1b,plot1c,plot1d, cols=2) 

Esto da el resultado deseado. El problema surge cuando intento guardar en un archivo. Puedo hacerlo manualmente en RStudio (usando Exportar -> Guardar gráfico como imagen), pero me gustaría ejecutar todo en un script. Logro guardar solo subplot1d (que es last_plot()), y no el multiplot completo.

Lo que he probado hasta ahora:

  1. Usando ggsave

    ggsave(filename = "D:/R/plots/Myplots.jpg") 
    

    Esto da como resultado solamente 1d subtrama siendo salvados.

  2. Usando jpeg(), print() y dev.off()

    jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE) 
    print(Myplot) 
    dev.off() 
    

    Esto da lugar a una imagen completamente blanco (sólo el fondo supongo). print (Myplot) devuelve NULL.

No estoy seguro de lo que estoy haciendo mal aquí. Mi falta de comprensión R es la razón por la que estoy atrapado tratando de encontrar una solución. ¿Alguien puede explicar lo que estoy haciendo mal y quizás sugerir una forma de resolver mi problema?

+4

También puede usar ** gridExtra :: grid.arrange (plot1a, plot1b, plot1c, plot1d, ncol = 2) ** – dickoa

+0

El paquete gridExtra no contiene grid.arrange, sí contiene arrangeGrob que parece proporcionar la misma funcionalidad. También parece recordar una función llamada grid.arrange, tal vez el autor cambió los títulos de las funciones en el paquete. –

+0

'grid.arrange' debe estar en gridExtra. Incidentemente, uno de los beneficios de 'arrangeGrob' vs' multiplot' es que es compatible con 'ggsave', y que puede almacenar el grob compuesto para su uso posterior. – baptiste

Respuesta

18

Es porque Myplot es el valor devuelto de su función multiplot, y no devuelve nada (su trabajo es imprimir los gráficos). Debe llamar al multiplot con el dispositivo jpeg abierto:

jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE) 
multiplot(plot1a,plot1b,plot1c,plot1d, cols=2) 
dev.off() 

debería funcionar.

+0

¡Realmente es así de simple! Muchas gracias por explicar por qué mi enfoque no funcionó. –

17

Utilizando el example code (R libro de cocina), que funciona para mí

png("chickweight.png") 
multiplot(p1, p2, p3, p4, cols=2) 
dev.off() 

enter image description here

+1

Tiene razón, pero su código es ligeramente diferente de @M_Vermeulen, primero traza los 4 trazados, esperando que 'multiplot' devuelva un objeto de cuadrícula. Podría ser que 'grid.arrange' muestre este comportamiento? –

+0

@PaulHiemstra: No creo que tome un enfoque diferente aquí, eche un vistazo a la página de ejemplo. El problema real fue explicado muy bien por @Spacedman. Y sí 'grid.arrange' muestra el mismo comportamiento – dickoa

+0

Su código ya incorpora la solución de @Spacedman, el multiplot debe estar dentro de la llamada' png'. –

6

Y para completarlo, ggsave no funciona ya que sólo se salva el último objeto ggplot impresa, que en su el caso es solo el último argumento. Esto se debe al hecho de que el multiplot crea el gráfico dibujando los objetos ggplot en diferentes subconjuntos del dispositivo gráfico total. Una alternativa es crear la trama combinando los objetos ggplot en un gran objeto ggplot e imprimiendo el objeto. Esto sería compatible con ggsave. Este enfoque está implementado por arrangeGrob en el paquete gridExtra.

+2

técnicamente, 'arrangeGrob' no crea" un gran objeto ggplot ", devuelve un gTree de clase" arregla ", y si hay ggplots en la lista de hijos, entonces la clase también hereda de" ggplot "para engañar a ggsave . – baptiste

+0

Gracias por la información más detallada. –

Cuestiones relacionadas