2010-08-03 5 views
22

Ich versuche, eine Funktion zu schreiben, die einen ggplot facet_wrap Plot über mehrere Seiten plottet. Es ist nur ein Hack, da diese Funktion auf der Aufgabenliste von ggplot2 zu finden ist. Ich mache ein paar kleine Berechnungen, um die Anzahl der Seiten zu finden, die ich brauche, die Anzahl der Zeilen meiner data.frame, die ich pro Seite brauche usw. Ich bin ziemlich zuversichtlich, dass das alles funktioniert.R + ggplot: Plotten über mehrere Seiten

pdf(filename) 
for (i in seq(num_pages)){ 
    slice = seq(((i-1)*num_rows)+1,(i*num_rows)) 
    slice = slice[!(slice > nrow(df.merged))] 
    df.segment=df.merged[slice,] 
    p <- ggplot(df.segment, aes(y=mean,x=phenotype)) 
    p <- p + geom_bar(stat="identity",fill="white",colour="black") 
    p + facet_wrap("ID",scales="free_y",ncol=n_facets,nrow=n_facets) 
} 
dev.off() 

Mein Problem ist, dass durch sie alle auf in einem for-Schleife wie diese, in zwischen den pdf() und dev.off() Funktionen Verpackung, ist, dass die for-Schleife für ggplot zu warten scheint nicht seine Sache zu tun, und durchbricht seine Schleife sehr schnell und gibt eine ungültige PDF aus.

Wenn ich i = 1 gesetzt, starten Sie den pdf(), den obigen Code innerhalb der for-Schleife laufen, dann setzen i=2, führen Sie den Code, und so weiter, bis ich langweilig (i=3) dann das Gerät die resultierende PDF auszuschalten ist brillant.

Gibt es eine Möglichkeit, die for-Schleife warten zu können, bis die letzte Zeile das Plotten beendet hat, bevor ich zur nächsten Iteration übergehe?

Antwort

29

Ich denke, das Problem ist, dass Sie print() um Ihre letzte Zeile (p + ...) benötigen, um es tatsächlich auf dem Gerät innerhalb der for-Schleife zu drucken. . .

+0

wow, das funktioniert völlig. Ich hatte keine Ahnung, dass der Druck so verwendet werden könnte. –

+0

Es ist weil 'p' ein Objekt ist. Die letzte Zeile Ihres Codes ändert das 'p'-Objekt, aber dann möchten Sie es auf dem Gerät' drucken'. – JoFrhwld

+0

Yup, es ist ein häufiges Hindernis. Manchmal schreibe ich eine Funktion in ggplot2 und lasse 'print()' um den letzten Teil herum, daher bekomme ich keine Ausgabe ... – aL3xa

4

Genau. Seite 39 des ggplot2-Buchs sagt uns, dass wenn Sie ggplot2-Objekte erstellen, können Sie es auf dem Bildschirm mit print() rendern. Dies passiert automatisch beim interaktiven Ausführen, aber innerhalb einer Schleife oder Funktion müssen Sie drucken() es selbst ".