2013-09-27 16 views
9

Wykonuję analizę eksploracyjną moich danych i potrzebuję wykreślić wiele grafik używając ggplot. Ilość grafiki jest naprawdę ogromna (206 stacji) i chciałem ją wykreślić w 1 kolumnie, a 8 wierszy na stronie, na tak wielu stronach. Zdaję sobie sprawę z funkcji takich jak viewport lub grid.arrange, ale nie jestem w stanie zmusić ich do pracy w tym przypadku. Zauważyłem już, że layout() ani par (mfrow = c (8,1)) nie działają z ggplot, ale wysyłam część kodu, w której utknąłem poniżej. Każda pomoc będzie doceniona!Wiele wykresów na wielu stronach przy użyciu ggplot

pdf('test.pdf', width=21, height=27) 
par(mfrow=c(8,1)) 
for(i in levels(tab$Station)) 
{ 

print(ggplot(tab[tab$Station==i], aes(x=Date)) + 
    geom_line(aes(y=Tmin), col="blue", size=0.1) + 
    geom_line(aes(y=Tmax), col="red", size=0.1) + 
    geom_text(aes(x=as.Date('2010-01-01'), y=45), label=i) + 
    ylim(0, 45) + 
    scale_x_date(labels = date_format("%Y")) + 
    theme_bw() + 
    theme(
    plot.background = element_blank() 
    ,panel.grid.major = element_blank() 
    ,panel.grid.minor = element_blank() 
    ,panel.border = element_rect(color = 'black') 
    ,panel.background = element_blank() 

) 
) 

} 

dev.off() 
+3

Witaj Jose, czy mógłbyś uczynić to powtarzalnym przykładem? To zwykle oznacza dostarczanie danych o zabawkach, abyśmy mogli po prostu pobrać kod i uruchomić go. Najczęściej ludzie używają do tego funkcji 'data()'. Na przykład 'dane (mtcars)' ładuje 'mtcars' data.frame do pamięci. – Statwonk

+1

Czy odpowiedź @baptiste działa? –

+2

Wiem, że to stare pytanie - ale spróbuj użyć funkcji facet_wrap_paginate w pakiecie ggforce. Zobacz pomoc tutaj https://cran.r-project.org/web/packages/ggforce/ggforce.pdf w ten sposób rozwiązałem mój podobny problem. –

Odpowiedz

1

Powinieneś uprościć fabułę, ponieważ po uzyskaniu prawidłowej kolejności z prostą fabułą, po prostu zastąp ją skomplikowaną. ggplot2 są oparte na pakiecie grid, więc musisz użyć gridExtra, aby rozmieścić działki. Następnie pętli, na każde 8 działek, należy przechowywać je w liście, a ty zadzwoń grid.arrange nad nim, i powtarzać to aż do końca swoich działkach ...

library(gridExtra) 
library(ggplot2) 
pdf('test.pdf', width=21, height=27) 
i = 1 
plot = list() 
for (n in unique(tab$Station)){ 
    ### process data for plotting here #### 
    plot[[i]] = ggplot(tab[tab$Station==n], aes(x=Date)) +... 
    if (i %% 8 == 0) { ## print 8 plots on a page 
    print (do.call(grid.arrange, plot)) 
    plot = list() # reset plot 
    i = 0 # reset index 
    } 
    i = i + 1 
} 
if (length(plot) != 0) { 
    print (do.call(grid.arrange, plot)) 
} 
dev.off() 
0

Niestety mfrow nie działa z ggplot2. Musisz użyć innych metod, takich jak this one lub this one lub użyć natywnej funkcji plot.

Być może używać faceting aby uzyskać 8 działek na jednej stronie, potem drugi link, aby umieścić go w wielu dokumentach ...

1

szlifowaniem może być droga. Zdecyduj, ile mini-działek ma się znaleźć na stronie, a następnie przeprowadź wymaganą liczbę razy, generując plik PNG lub PDF. Więc jeśli masz 200 elementów danych i potrzebujesz 50 na stronę, w aspektach po 5 i 10 w dół, po prostu przeprowadź pętlę przez 200/50 = 4 iteracje. Surowe, ale powinno działać.

facets

library(ggplot2) 

ii <- 7 
nn <- 49 

mydf <- data.frame(date = rep(seq(as.Date('2013-03-01'), 
         by = 'day', length.out = ii), nn), 
        value = rep(runif(nn, 100, 200))) 

mydf$facet.variable <- rep(1:nn, each = ii) 

p <- ggplot(mydf, aes(x = date, y = value)) + 
    geom_line() + 
    facet_wrap(~ facet.variable, ncol = ii) 

print(p) 
8
library(plyr) 
library(gridExtra) 

p = ggplot(tab, aes(x=Date)) + 
     geom_line(aes(y=Tmin), col="blue", size=0.1) 

plots = dlply(tab , "Station", `%+%`, e1 = p) 
ml = do.call(marrangeGrob, c(plots, list(nrow=8, ncol=1))) 
ggsave("multipage.pdf", ml) 

niesprawdzone.

+0

czy mógłbyś wyjaśnić, co zrobiłeś, aby utworzyć obiekt "działki" powyżej? Do czego służy ''% +% ''? – llewmills

+1

'% +%' zastępuje dane w ggplot – baptiste

+0

Ciągle mam zielony pasek, więc potrzebuję pomocy od czarnego pasa Czwartego Dana, takiego jak ty. Również dopiero teraz poznałem użycie 'plyr' i' dplyr' zamiast rodziny 'apply'. Zgaduję, że tutaj, ale czy to oznacza, że ​​przekazałeś podtapiany obiekt 'tab' (podzielony przez Station) do ggplota' p', używając funkcji '% +%' aby zastąpić miejsce argumentem 'tab' przechowywane w oryginale? Jeśli tak, to jest fantastyczne. – llewmills

Powiązane problemy