Frage

Ich fragte diese Frage gestern über ein Grundstück zu speichern innerhalb eines Objekts. Ich habe versucht, den ersten Ansatz der Umsetzung (beachten Sie, dass ich nicht angeben, dass ich qplot() in meiner ursprünglichen Frage wurde mit) und bemerkte, dass es nicht wie erwartet funktioniert hat.

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

Ich habe Probennummern in diesem Fall verwendet, so der Code ausgeführt wird, wenn es nur kopiert wird. Ich habe ein paar Stunden rätselhaft über diese verbringen, aber ich kann nicht herausfinden, was schief läuft. Es schreibt den ersten Satz von PDF-Dateien ohne Probleme, so dass ich 16 pdfs mit den richtigen Grundstücken.

Dann, wenn ich dieses Stück Code:

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

das Ergebnis, das ich bekomme, ist die letzte lineare Modell Linie (abline) auf jedem Graphen, aber die Daten nicht ändern. Wenn ich meine Liste der Grundstücke zu überprüfen, scheint es, dass alle von ihnen durch die letzte Handlung überschrieben werden (mit Ausnahme des abline Objekts).

Eine weniger wichtige sekundäre Frage war, wie ein Muli-Seite pdf mit mehreren Plots auf jeder Seite zu generieren, aber das Hauptziel meines Codes war es, die Grundstücke in einer Liste zu speichern, die ich zu einem späteren Zeitpunkt zugreifen konnte.

War es hilfreich?

Lösung

Ok, also, wenn Ihr Plotbefehl geändert, um

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)           

dann alles wie erwartet funktioniert. Hier ist, was ich vermute, geschieht (obwohl Hadley könnte wahrscheinlich Dinge klären). Wenn ggplot2 „rettet“ die Daten, was es tatsächlich tut, ist ein Datenrahmen speichern, und die Namen der Parameter. Also für den Befehl, wie ich es gegeben haben, erhalten Sie

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

Wenn Sie jedoch keinen data Parameter in qplot angeben, werden alle Variablen erhalten im aktuellen Bereich ausgewertet, weil es keine angebracht (sprich: gespeichert) Datenrahmen.

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)

Also, wenn die Handlung zum zweiten Mal erzeugt wird, um, anstatt die ursprünglichen Werte verwendet, verwendet es die Strom Werte von x und y.

Andere Tipps

Ich glaube, Sie das data Argument in qplot verwenden sollte, das heißt, speichern Sie Ihre Vektoren in einem Datenrahmen.

Siehe Hadley Buch, Abschnitt 4.4:

Die Beschränkung der Daten ist einfach: es muss ein Datenrahmen sein. Dies ist restriktiv, und im Gegensatz zu anderen Grafikpaketen in R. Lattice Funktionen kann einen optionalen Datenrahmen oder Vektoren nehmen verwenden, um direkt aus der globalen Umwelt. ...

Die Daten werden in dem Grundstück Objekt als Kopie gespeichert, keine Referenz. Dies hat zwei wichtige Konsequenzen: wenn die Datenänderungen, die Handlung wird nicht; und ggplot2 Objekte vollständig in sich geschlossen sind, so dass sie sparen können () d auf die Festplatte und später load () ed und aufgetragen, ohne irgendetwas anderes aus dieser Sitzung zu benötigen.

Es ist ein Fehler im Code zur Liste Subskribierung. Es sollte sein

pltList[[pltName]]

nicht

pltList[pltName]

Hinweis:

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

pltList [1] ist eine Liste enthält das erste Element pltList.

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

pltList [[1]] ist das erste -Element von pltList.

Für Ihre zweite Frage: Mehrseitiges PDF-Dateien sind einfach - siehe help(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’.

Für Ihre wichtigste Frage, die ich nicht verstehe, wenn Sie die Plot Eingänge in einer Liste für eine spätere Verarbeitung oder die Plot Ausgänge speichern möchten. Wenn es letzteres ist, bin ich nicht sicher, dass plot() ein Objekt zurückgibt Sie speichern und abrufen können.

Ein weiterer Vorschlag Ihre zweite Frage bezüglich wäre entweder Sweave oder Brew zu verwenden, wie sie Ihnen die vollständige Kontrolle über geben, wie Sie Ihre mehrseitige PDF anzuzeigen.

Hier finden Sie aktuelle zu dieser Frage im Zusammenhang .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top