2016-09-28 6 views
8

Ich zeichne Diagramme mit ggplot2 und ich habe die facet_wrap Funktion, um mehrere Grafiken (~ 51) zu machen, aber sie alle erscheinen auf einer Seite. Jetzt, nach der Suche, habe ich herausgefunden, dass ggplot2 keine Grafiken auf mehreren Seiten platzieren kann.ggplot2: Plots über mehrere Seiten

Gibt es eine Möglichkeit, dies zu tun? Ich habe diese Frage (Multiple graphs over multiple pages using ggplot) angeschaut und den Code mit wenig Erfolg ausprobiert.

Hier ist mein Code für meine Grafiken, es produziert ~ 51 Grafiken auf einer Seite, so dass sie sehr klein und schwer zu sehen, wenn ich dies auf 1 Grafik pro Seite in einem PDF drucken könnte, das wäre großartig:

ggplot(indbill, aes(x = prey, y = weight), tab) + 
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) + 
facet_wrap(~ individual) + 
theme(axis.ticks.x = element_blank(), 
    axis.text.x = element_text(size=rel(0.5)), 
    axis.ticks.y = element_blank(), 
    axis.text.y = element_blank()) + 
xlab("") + ylab("") + 
guides(color = guide_legend(ncol=2)) + 
coord_radar() 

Wenn jemand einen kleinen Code schreiben und mir erklären könnte, wäre das großartig!

Danke!

Antwort

8

Eine Option ist nur Grundstück zu, sagen wir, sechs Ebenen der individual zu einem Zeitpunkt, den gleichen Code jetzt Sie verwenden verwenden. Sie müssen es nur mehrmals wiederholen, einmal für jede Teilmenge Ihrer Daten. Sie haben keine Beispieldaten zur Verfügung gestellt, so ist hier ein Beispiel der Baseball Datenrahmen mit:

library(ggplot2) 
library(vcd) # For the Baseball data 
data(Baseball) 

pdf("baseball.pdf", 7, 5) 
for (i in seq(1, length(unique(Baseball$team87)), 6)) { 
    print(ggplot(Baseball[Baseball$team87 %in% levels(Baseball$team87)[i:(i+5)], ], 
        aes(hits86, sal87)) + 
    geom_point() + 
    facet_wrap(~ team87) + 
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) + 
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) + 
    theme_bw()) 
} 
dev.off() 

Der obige Code eine PDF-Datei mit vier Seiten von Plots produzieren, die jeweils mit sechs Facetten auf einer Seite. Sie können auch vier separate PDF-Dateien, eine für jede Gruppe von sechs Facetten erstellen:

for (i in seq(1, length(unique(Baseball$team87)), 6)) { 
pdf(paste0("baseball_",i,".pdf"), 7, 5) 
    ...ggplot code... 
dev.off() 
} 

Eine weitere Option, wenn Sie mehr Flexibilität benötigen, ist ein separates Grundstück für jede Ebene zu schaffen (das heißt, jeder eindeutige Wert) der facettierenden Variablen und speichern Sie alle einzelnen Plots in einer Liste. Dann können Sie auf jeder Seite eine beliebige Anzahl von Plots anlegen. Das ist hier wohl zuviel, aber here's an example wo die Flexibilität kommt.

Zuerst erstellen wir alle Plots. Wir verwenden team87 als Facettierungsspalte. Wir wollen also für jedes Level von team87 ein Diagramm erstellen. Wir tun dies, indem wir die Daten nach team87 aufteilen und für jede Teilmenge der Daten ein separates Diagramm erstellen.

Im folgenden Code teilt split die Daten in separate Datenrahmen für jede Ebene von team87. Der lapply Wrapper speist nacheinander jede Datenteilmenge in ggplot ein, um für jedes Team ein Diagramm zu erstellen. Wir speichern die Ausgabe in plist, eine Liste von (in diesem Fall) 24 Plots.

plist = lapply(split(Baseball, Baseball$team87), function(d) { 
    ggplot(d, aes(hits86, sal87)) + 
    geom_point() + 
    facet_wrap(~ team87) + 
    scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) + 
    scale_x_continuous(limits=c(0, max(Baseball$hits86))) + 
    theme_bw() + 
    theme(plot.margin=unit(rep(0.4,4),"lines"), 
      axis.title=element_blank()) 
}) 

Jetzt werden wir sechs Diagramme in einer PDF-Datei zur Verfügung stellen. Im Folgenden finden Sie zwei Optionen, eine mit vier separaten PDF-Dateien mit jeweils sechs Plots, die andere mit einer einzigen vierseitigen PDF-Datei. Ich habe auch in einen der Grundstücke eingefügt. Wir verwenden grid.arrange, um die Diagramme auszulegen, einschließlich der Argumente left und bottom, um Achsentitel hinzuzufügen.

library(gridExtra) 

# Four separate single-page PDF files, each with six plots 
for (i in seq(1, length(plist), 6)) { 
    pdf(paste0("baseball_",i,".pdf"), 7, 5) 
    grid.arrange(grobs=plist[i:(i+5)], 
       ncol=3, left="Salary 1987", bottom="Hits 1986") 
    dev.off() 
} 

# Four pages of plots in one PDF file 
pdf("baseball.pdf", 7, 5) 
for (i in seq(1, length(plist), 6)) { 
    grid.arrange(grobs=plist[i:(i+5)], 
       ncol=3, left="Salary 1987", bottom="Hits 1986") 
} 
dev.off() 
+0

Hallo @ eipi10! Das hat wunderbar funktioniert und war einfach zu verstehen! Obwohl ich ein Problem habe. Es scheint, dass der Code eine meiner Personen nicht mag und ich bekomme diesen Fehler. Es hört auf zu drucken, nachdem es diese individuelle '= Liste trifft (grobs Fehler in gList (705-70773 = Liste (grobs = Liste (Liste (x = 0.5, y = 0.5,: nur 'grobs' erlaubt in "gList" ' Jede Hilfe wäre toll! – LearningTheMacros

+1

Gibt es etwas über die Daten für diese Person, die dazu führen, dass eine Handlung nicht produziert wird? Wenn kein Plot vorhanden ist, ist die Ausgabe des Plot-Codes kein Grob (Grafikobjekt). Zum Beispiel, fehlen alle Daten für diese Person oder etwas ähnliches? Versuchen Sie, Ihr Diagramm zu erstellen, aber feed ggplot einen Datenrahmen mit nur den Daten für diese eine Person und sehen, was passiert. Schau dir die Daten für diese Person an und sieh nach, ob da etwas offensichtlich anders ist. – eipi10

+0

Die Handlung wurde gemacht, als ich HubertLs Vorschlag benutzte, also weiß ich es nicht. Wie auch immer, ich habe Ihre Antwort verstanden und es wird mir in Zukunft helfen. Danke nochmal! – LearningTheMacros

2

so etwas wie:

by(indbill, indbill$individual, function (x){ 
    ggplot(x, aes(x = prey, y = weight), tab) + 
    geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) + 
    theme(axis.ticks.x = element_blank(), 
     axis.text.x = element_text(size=rel(0.5)), 
     axis.ticks.y = element_blank(), 
     axis.text.y = element_blank()) + 
    xlab("") + ylab("") + 
    guides(color = guide_legend(ncol=2)) + 
    coord_radar() 
} 
Verwandte Themen