2012-02-02 12 views
11

Devo generare 250 grafici con la stessa vista.Creazione di grafici in un ciclo utilizzando ggplot2

I miei dati esempio dato:

df <- data.frame(name = c("john","alex","mike","dennis","alex"), 
      expenses = c("10","12","15","8","2"), 
      type = c("food","rent","rent","food","food")) 

vorrei trame a barre con le spese per ogni nome in un unico appezzamento. La trama per "alex" sarà simile:

selected.name <- "alex" 
df1 <- subset(df, name == selected.name) 
ggplot(data = df1, aes(type, expenses)) + geom_bar() 

Ora voglio usare un ciclo che traccia la trama stessa per ogni nome nel DF. Ho provato a utilizzare un ciclo for che esegue il codice di trama sopra come file sorgente. Ma non posso passare la variabile name al file sorgente in modo che tracci il grafico per ogni nome. Ora ho solo un grafico dal ciclo for.

+0

Si prega di specificare la vostra domanda un po 'di più. è il tuo problema che hai solo 1 finestra con 1 grafico? che 'x11()' potrebbe essere la soluzione. se vuoi salvare i pdf usa 'pdf (file)' 'print (ggplot (...)' 'dev.off()' .... – Seb

+0

Ciao Seb, grazie per la risposta. Voglio creare una trama come la trama che ho creato per il nome alex per ogni altro nome in df senza dover digitare manualmente i nomi, perché nei dati reali ci sono 250 nomi Spero che questo aiuti – jeroen81

+1

@Seb, vorrei andare su ggsave invece di pdf(). –

risposta

15

Per rispondere alla domanda originale. Per fare questo con lo standard R:

doPlot = function(sel_name) { 
    dum = subset(df, name == sel_name) 
    ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar() 
    print(ggobj) 
    ggsave(sprintf("%s.pdf", sel_name)) 
} 
lapply(unique(df$name), doPlot) 

In questo modo si finisce con un gran numero di file PDF chiamato Adam.pdf ecc Si potrebbe quindi utilizzare pdftk (pdf tool kit) al gatto i file insieme in un unico documento. Preferirei ancora, una soluzione migliore usando per es. sfaccettatura o un diverso tipo di trama.

Non sarebbe molto meglio usare la sfaccettatura? Dato il tuo esempio il codice sarebbe:

ggplot(data = df, aes(type, expenses)) + 
    geom_bar() + facet_wrap(~name) 

che porta alla seguente grafico:

enter image description here

Forse per 250 nomi e più variabili, questo potrebbe essere un problema. Ma guarderei comunque a sfaccettatura.

+0

Grazie Paul, questa è una bella funzionalità. È utile per confrontare le trame. 250 nomi e 12 variabili di spesa, che genereranno una trama molto complessa: sto costruendo uno strumento di reporting che genera tutti i tipi di indicatori KPI per dipendente e non facciamo confronti in questo rapporto, motivo per cui ho bisogno di tutti i singoli grafici. Il report generato in Latex/R sweave. – jeroen81

+1

Ho aggiunto una soluzione con singoli grafici in pdf separato file alla mia risposta. –

+0

Grazie Paul, questo funziona perfettamente per me adesso. Posso adattare le funzioni in base alle mie esigenze. – jeroen81

1

Un collega ha appena sottolineato che l'utilizzo di un sottoinsieme in una funzione è una pessima idea. Vedi ?subset() per maggiori informazioni. Così ho adattato l'ansiere di Paul Hiemstra e sostituito il sottoinsieme.

doPlot = function(sel_name) { 
    dum <- df[df$name == sel_name,] 
    ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar() 
    print(ggobj) 
    ggsave(sprintf("%s.pdf", sel_name)) 
} 
lapply(unique(df$name), doPlot) 
+0

+1! Ottimo punto. Sottoinsieme – marbel

Problemi correlati