Pregunta

Hice esta pregunta ayer sobre el almacenamiento de una trama dentro de un objeto. Intenté implementar el primer enfoque (consciente de que no especifiqué que estaba usando qplot () en mi pregunta original) y noté que no funcionaba como se esperaba.

library(ggplot2)               # add ggplot2

string = "C:/example.pdf"      # Setup pdf
pdf(string,height=6,width=9)

x_range <- range(1,50)         # Specify Range

# Create a list to hold the plot objects.
pltList <- list()
pltList[]

for(i in 1 : 16){

# Organise data 
y = (1:50) * i * 1000                       # Get y col
x = (1:50)                                  # get x col
y = log(y)                                  # Use natural log

# Regression
lm.0 = lm(formula = y ~ x)                  # make linear model
inter = summary(lm.0)$coefficients[1,1]     # Get intercept
slop = summary(lm.0)$coefficients[2,1]      # Get slope

# Make plot name
pltName <- paste( 'a', i, sep = '' )

# make plot object    
p <- qplot(
    x, y,   
    xlab = "Radius [km]", 
    ylab = "Services [log]",
    xlim = x_range,
    main = paste("Sample",i)
) + geom_abline(intercept = inter, slope = slop, colour = "red", size = 1)        

print(p)     

pltList[[pltName]] = p       
}

# close the PDF file
dev.off() 

He utilizado números de muestra en este caso, por lo que el código se ejecuta si solo se copia. Pasé algunas horas pensando en esto, pero no puedo entender qué está mal. Escribe el primer conjunto de archivos PDF sin problemas, por lo que tengo 16 archivos PDF con las parcelas correctas.

Luego, cuando uso este código:

string = "C:/test_tabloid.pdf"
pdf(string, height = 11, width = 17)

grid.newpage()
pushViewport( viewport( layout = grid.layout(3, 3) ) )

vplayout <- function(x, y){viewport(layout.pos.row = x, layout.pos.col = y)}

counter = 1

# Page 1
for (i in 1:3){    
    for (j in 1:3){     
         pltName <- paste( 'a', counter, sep = '' )   
         print( pltList[[pltName]], vp = vplayout(i,j) )
         counter = counter + 1
     }
 }

 dev.off()

el resultado que obtengo es la última línea de modelo lineal ( abline ) en cada gráfico, pero los datos no cambian. Cuando reviso mi lista de gráficos, parece que todos se sobrescriben con el gráfico más reciente (con la excepción del objeto abline ).

Una pregunta secundaria menos importante era cómo generar un pdf de páginas de muli con varias parcelas en cada página, pero el objetivo principal de mi código era almacenar las parcelas en una lista a la que pudiera acceder más adelante.

¿Fue útil?

Solución

Ok, entonces si su comando de trazado se cambia a

p <- qplot(data = data.frame(x = x, y = y),
           x, y,   
           xlab = "Radius [km]", 
           ylab = "Services [log]",
           xlim = x_range,
           ylim = c(0,10),
           main = paste("Sample",i)
           ) + geom_abline(intercept = inter, slope = slop, colour = "red", size = 1)           

entonces todo funciona como se esperaba. Esto es lo que sospecho que está sucediendo (aunque Hadley probablemente podría aclarar las cosas). Cuando ggplot2 " guarda " los datos, lo que realmente hace es guardar un marco de datos y los nombres de los parámetros. Entonces, para el comando que le he dado, obtienes

> summary(pltList[["a1"]])
data: x, y [50x2]
mapping:  x = x, y = y
scales:   x, y 
faceting: facet_grid(. ~ ., FALSE)
-----------------------------------
geom_point:  
stat_identity:  
position_identity: (width = NULL, height = NULL)

mapping: group = 1 
geom_abline: colour = red, size = 1 
stat_abline: intercept = 2.55595281266726, slope = 0.05543539319091 
position_identity: (width = NULL, height = NULL)

Sin embargo, si no especifica un parámetro data en qplot, todas las variables se evalúan en el ámbito actual, porque no hay un marco de datos adjunto (leído: guardado).

data: [0x0]
mapping:  x = x, y = y
scales:   x, y 
faceting: facet_grid(. ~ ., FALSE)
-----------------------------------
geom_point:  
stat_identity:  
position_identity: (width = NULL, height = NULL)

mapping: group = 1 
geom_abline: colour = red, size = 1 
stat_abline: intercept = 2.55595281266726, slope = 0.05543539319091 
position_identity: (width = NULL, height = NULL)

Entonces, cuando el diagrama se genera por segunda vez, en lugar de usar los valores originales, usa los valores actuales de x y y .

Otros consejos

Creo que debería usar el argumento data en qplot , es decir, almacenar sus vectores en un marco de datos.

Ver el libro de Hadley, Sección 4.4:

La restricción en los datos es simple: debe ser un marco de datos. Esto es restrictivo y, a diferencia de otros paquetes de gráficos en R. Las funciones de celosía pueden tomar un marco de datos opcional o usar vectores directamente del entorno global. ...

Los datos se almacenan en el objeto de trazado como una copia, no como una referencia. Esto tiene dos consecuencias importantes: si sus datos cambian, la trama no lo hará; y los objetos ggplot2 son completamente autónomos para que se puedan guardar () d en el disco y luego cargar () ed y trazar sin necesidad de nada más de esa sesión.

Hay un error en su código relacionado con la suscripción de listas. Debería ser

pltList[[pltName]]

no

pltList[pltName]

Nota:

class(pltList[1])
[1] "list"

pltList [1] es una lista que contiene el primer elemento de pltList.

class(pltList[[1]])
[1] "ggplot"

pltList [[1]] es el primer elemento de pltList.

Para su segunda pregunta: los archivos PDF de varias páginas son fáciles; consulte la ayuda (pdf) :

 onefile: logical: if true (the default) allow multiple figures in one
          file.  If false, generate a file with name containing the
          page number for each page.  Defaults to ‘TRUE’.

Para su pregunta principal, no entiendo si desea almacenar las entradas de trazado en una lista para su posterior procesamiento, o las salidas de trazado . Si es lo último, no estoy seguro de que plot () devuelva un objeto que puede almacenar y recuperar.

Otra sugerencia con respecto a su segunda pregunta sería usar Sweave o Brew, ya que le darán un control completo sobre cómo mostrar su pdf de varias páginas.

Eche un vistazo en esta pregunta relacionada .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top