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