2013-09-27 15 views
9

Sto facendo un'analisi esplorativa dei miei dati e ho bisogno di tracciare più elementi grafici usando ggplot. La quantità di grafica è davvero enorme (206 stazioni) e volevo tracciarli in 1 colonna contro 8 righe per pagina sulle tante pagine necessarie. Sono a conoscenza di funzioni come viewport o grid.arrange, ma non riesco a farle funzionare in questo caso. Ho già notato che layout() né par (mfrow = c (8,1)) non funzionano con ggplot, ma invio la parte del codice in cui sono bloccato sotto. Qualsiasi aiuto sarebbe molto apprezzato!Più grafici su più pagine utilizzando 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

Ciao Jose, ti dispiacerebbe rendere questo un esempio riproducibile? Ciò significa comunemente fornire dati giocattolo in modo che possiamo semplicemente prendere il codice ed eseguirlo. Molto spesso, le persone usano la funzione 'data()' per fare ciò. Ad esempio 'data (mtcars)' carica in memoria 'mtcars' data.frame. – Statwonk

+1

La risposta di @baptiste è stata eseguita? –

+2

So che è una vecchia domanda, ma prova a utilizzare la funzione facet_wrap_paginate nel pacchetto ggforce. Vedere l'aiuto qui https://cran.r-project.org/web/packages/ggforce/ggforce.pdf è così che ho risolto il mio problema simile. –

risposta

1

Si dovrebbe semplificare la trama poiché una volta ottenuto l'ordine giusto con una trama semplice, è sufficiente sostituirlo con quello complicato. ggplot2 sono basati sul pacchetto grid, quindi è necessario utilizzare gridExtra per organizzare i grafici. Poi si esegue un ciclo, per ogni 8 lotti, di metterle in un elenco e si chiama grid.arrange su di esso, e si ripete questa fino alla fine dei tuoi trame ...

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

Purtroppo, mfrow non funziona con ggplot2. È necessario utilizzare altri metodi come this one o this one o utilizzare la funzione nativa plot.

Forse è possibile utilizzare per ottenere le sfaccettature 8 lotti in una sola pagina, poi il secondo link per metterla in più documenti ...

1

sfaccettatura potrebbe essere la strada da percorrere. Decidi quanti mini tramezzi sfaccettati vuoi per pagina, quindi passa attraverso il numero di volte richiesto, generando un png o un pdf mentre vai. Quindi se hai 200 elementi di dati e vuoi 50 per pagina, in facet di 5 across e 10 down, fai un ciclo di 200/50 = 4 iterazioni. Grezzo, ma dovrebbe funzionare

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) 

non testati.

+0

potresti spiegare cosa hai fatto per creare l'oggetto 'plot 'sopra? Cosa fa ''% +% ''? – llewmills

+1

'% +%' sovrascrive i dati in un ggplot – baptiste

+0

Sono ancora una cintura verde, quindi ho bisogno di aiuto da una cintura nera del 4 ° Dan come te. Inoltre, sto solo familiarizzando con l'uso di 'plyr' e' dplyr' invece della famiglia 'apply'. Quindi sto indovinando qui, ma questo significa che hai passato l'oggetto 'tab' subsetted (sottotitolato da Station) nel ggplot' p', usando la funzione '% +%' per sovrascrivere il posto dell'argomento 'tab' tenuto nell'originale? Se è così è fantastico. – llewmills