2016-09-28 30 views
8

Wykreślam wykresy za pomocą ggplot2 i mam funkcję facet_wrap do tworzenia wielu wykresów (~ 51), ale wszystkie one pojawiają się na jednej stronie. Teraz po przeszukaniu odkryłem, że ggplot2 nie może umieszczać wykresów na wielu stronach.ggplot2: Wykresy na wielu stronach

Czy istnieje sposób, aby to zrobić? Spojrzałem na to pytanie (Multiple graphs over multiple pages using ggplot) i wypróbowałem kod z niewielkim sukcesem.

Oto mój kod dla moich wykresów, generuje ~ 51 wykresów na jednej stronie, co czyni je bardzo małymi i trudnymi do zauważenia, gdybym mógł wydrukować to do 1 wykresu na stronę w pliku PDF, to byłoby świetnie:

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

Jeśli ktoś mógłby napisać mały kod i wytłumaczyć mi to, byłoby wspaniale!

Dzięki!

Odpowiedz

8

Jedną z opcji jest tylko działka, powiedzmy, sześć poziomów individual naraz przy użyciu tego samego kodu, którego używasz teraz. Będziesz musiał iterować go kilka razy, raz dla każdego podzbioru danych. Nie podajemy przykładowe dane, więc oto przykład za pomocą ramki Baseball danych:

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

Powyższy kod będzie produkować plik PDF z czterech stron działek, każda z sześcioma ściankami do strony. Można również utworzyć cztery oddzielne pliki PDF, jeden dla każdej grupy sześciu aspektach:

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

Innym rozwiązaniem, jeśli potrzebują większej elastyczności, jest utworzenie osobnego działką na każdym poziomie (czyli każda wyjątkowa wartość) zmienną fasetowania i zapisać wszystkie poszczególne wykresy na liście. Następnie możesz rozłożyć dowolną liczbę działek na każdej stronie. To chyba przesada tutaj, ale przydaje się elastyczności.

Najpierw utwórzmy wszystkie wykresy. Użyjemy team87 jako naszej kolumny fasetowania. Dlatego chcemy utworzyć jedną działkę dla każdego poziomu team87. Zrobimy to, dzieląc dane przez team87 i tworząc osobny wykres dla każdego podzbioru danych.

W poniższym kodzie split dzieli dane na osobne ramki danych dla każdego poziomu team87. Opakowanie lapply kolejno przesyła każdy podzbiór danych do ggplot, aby utworzyć wykres dla każdego zespołu. Zapisujemy dane wyjściowe w plist, listę (w tym przypadku) 24 działek.

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

Teraz rozłożymy sześć działek na raz w pliku PDF. Poniżej znajdują się dwie opcje, jedna z czterema oddzielnymi plikami PDF, z których każda zawiera sześć działek, a druga z pojedynczym czterostronicowym plikiem PDF. Wkleiłem też jeden z wątków na dole. Używamy grid.arrange do rozplanowania wykresów, włączając w to użycie argumentów left i bottom w celu dodania tytułów osi.

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

Witam @ eipi10! To działało cudownie i było łatwe do zrozumienia! Chociaż mam jedną kwestię. Wygląda na to, że kod nie lubi jednej z moich osób i otrzymuję ten błąd. Zatrzymuje drukowanie po tym, jak trafi na tę indywidualną listę '= (grobs Błąd w gList (705-70773 = lista (grobs = lista (lista (x = 0,5, y = 0.5,: tylko "groby" dozwolone w "gList" ' Każda pomoc będzie świetna! – LearningTheMacros

+1

Czy jest coś w danych dotyczących tej osoby, co powoduje, że fabuła nie jest produkowana? Jeśli nie ma wykresu, to wynik kodu nie będzie grobem (obiektem graficznym). Na przykład, czy brakuje danych dla tej osoby lub czegoś w tym stylu? Spróbuj utworzyć fabułę, ale przesyłaj ggplot ramkę danych z danymi tylko dla tej osoby i zobacz, co się stanie. Spójrz na dane tej osoby i sprawdź, czy jest w niej coś zupełnie innego. – eipi10

+0

Fabuła została wykonana, gdy użyłem sugestii HubertL, więc nie wiem. Tak czy inaczej, zrozumiałem twoją odpowiedź i pomoże mi to w przyszłości. Jeszcze raz dziękuję! – LearningTheMacros

2

coś takiego:

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