2011-01-31 13 views
20

Voglio utilizzare ggplot per eseguire il loop su più colonne per creare più trame, ma l'utilizzo del segnaposto nel ciclo for cambia il comportamento di ggplot.Looping su variabili in ggplot

Se ho questo:

t <- data.frame(w = c(1, 2, 3, 4), x = c(23,45,23, 34), 
y = c(23,34,54, 23), z = c(23,12,54, 32)) 

Questo funziona bene:

ggplot(data=t, aes(w, x)) + geom_line() 

Ma questo non lo fa:

i <- 'x' 
ggplot(data=t, aes(w, i)) + geom_line() 

che è un problema se voglio finalmente un ciclo su x, y e z. Qualche aiuto?

+0

In generale, 'ggplot2'is più felice con data.frames formato lunghe, cioè,' m = sciogliere (t, id = "w"); ggplot (sottoinsieme (m, variabile == "x"), aes (w, valore)) + geom_line() 'o' p <- ggplot (m, aes (w, valore)) + geom_line (aes (color = variabile) ', o' d_ply (m,. (variabile), funzione (d) p% +% d, .print = TRUE) ', ecc. – baptiste

risposta

32

Hai solo bisogno di utilizzare aes_string invece di aes, in questo modo:

ggplot(data=t, aes_string(x = "w", y = i)) + geom_line() 

Nota che w allora deve essere specificato come una stringa, anche.

2

Il problema è come accedere al frame dati t. Come probabilmente saprai, ci sono diversi modi per farlo, ma sfortunatamente l'uso di un personaggio non è evidentemente uno di questi in ggplot.

Un modo che potrebbe funzionare è utilizzare la posizione numerica della colonna nel tuo esempio, ad es. Potresti provare i <- 2. Tuttavia, se questo funziona poggia su ggplot che non ho mai usato (ma conosco altri lavori di Hadley e suppongo che dovrebbe funzionare)

Un altro modo per aggirare questo problema è creare un nuovo frame di dati temporanei ogni volta che chiami ggplot . es .:

tmp <- data.frame(a = t[['w']], b = t[[i]]) 
ggplot(data=tmp, aes(a, b)) + geom_line() 
+0

Ho usato anche gli indici numerici, il che è ottimo per il ripping attraverso ogni colonna di un set di dati. Mi innervosisco ogni volta che devo supporre che t $ x sarà sempre t [, 2], però. –

+0

Eccellente, grazie. Sono sicuro che avrò bisogno di questo work-around nel futuro – Tom

+0

Questo non funziona per i ggplots più complicati (es. quelli che usano le faccette) – Gregor

0

seconda di cosa si sta cercando di fare, trovo facet_wrap o facet_grid a lavorare bene per la creazione di più trame con la stessa struttura di base. Qualcosa del genere dovrebbe arrivare nel campo da baseball a destra:

t.m = melt(t, id="w") 
ggplot(t.m, aes(w, value)) + facet_wrap(~ variable) + geom_line()