Domanda

Ho chiesto a questa di ieri di memorizzare un complotto all'interno di un oggetto. Ho provato ad implementare il primo approccio (consapevole di non aver specificato che stavo usando qplot () nella mia domanda originale) e ho notato che non funzionava come previsto.

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

Ho usato numeri di esempio in questo caso, quindi il codice viene eseguito se è stato appena copiato. Ho passato qualche ora a scervellarmi, ma non riesco a capire cosa sta andando storto. Scrive il primo set di pdf senza problemi, quindi ho 16 pdf con i grafici corretti.

Quindi quando uso questo pezzo di codice:

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

il risultato che ottengo è l'ultima linea del modello lineare ( abline ) su ogni grafico, ma i dati non cambiano. Quando controllo il mio elenco di grafici, sembra che tutti vengano sovrascritti dal diagramma più recente (ad eccezione dell'oggetto abline ).

Una domanda secondaria meno importante era come generare un pdf di muli-page con diversi grafici su ogni pagina, ma l'obiettivo principale del mio codice era quello di memorizzare i grafici in un elenco a cui potevo accedere in un secondo momento.

È stato utile?

Soluzione

Ok, quindi se il comando della trama è cambiato in

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)           

quindi tutto funziona come previsto. Ecco cosa sospetto stia accadendo (anche se Hadley potrebbe probabilmente chiarire le cose). Quando ggplot2 "salva" i dati, ciò che effettivamente fa è salvare un frame di dati e i nomi dei parametri. Quindi per il comando come l'ho dato, ottieni

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

Tuttavia, se non si specifica un parametro data in qplot, tutte le variabili vengono valutate nell'ambito corrente, poiché non esiste un frame di dati (leggi: salvato) allegato.

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)

Quindi, quando la trama viene generata la seconda volta, invece di usare i valori originali, usa i valori correnti di x e y .

Altri suggerimenti

Penso che dovresti usare l'argomento data in qplot , cioè memorizzare i tuoi vettori in un frame di dati.

Vedi il libro di Hadley, Sezione 4.4:

La restrizione sui dati è semplice: deve essere un frame di dati. Ciò è restrittivo e, a differenza di altri pacchetti di grafica nelle funzioni di R. Lattice, può prendere un frame di dati opzionale o usare i vettori direttamente dall'ambiente globale. ...

I dati sono memorizzati nell'oggetto grafico come copia, non come riferimento. Questo ha due conseguenze importanti: se i tuoi dati cambiano, la trama non lo farà; e gli oggetti ggplot2 sono completamente autonomi in modo che possano essere salvati () d su disco e successivamente caricati () editati e stampati senza bisogno di nient'altro da quella sessione.

Nel codice è presente un bug relativo alla sottoscrizione dell'elenco. Dovrebbe essere

pltList[[pltName]]

non

pltList[pltName]

Nota:

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

pltList [1] è un elenco contenente il primo elemento di pltList.

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

pltList [[1]] è il primo elemento di pltList.

Per la tua seconda domanda: i PDF multipagina sono facili - vedi aiuto (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’.

Per la tua domanda principale, non capisco se si desidera memorizzare gli input della trama in un elenco per l'elaborazione successiva o gli output della trama . Se è quest'ultimo, non sono sicuro che plot () restituisca un oggetto che è possibile archiviare e recuperare.

Un altro suggerimento riguardo alla tua seconda domanda sarebbe di usare Sweave o Brew in quanto ti daranno il controllo completo su come visualizzi il tuo pdf multipagina.

Dai un'occhiata a questa domanda correlata .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top