2011-01-31 17 views
20

Quiero usar ggplot para recorrer varias columnas para crear varias gráficas, pero usar el marcador de posición en el bucle for cambia el comportamiento de ggplot.Looping sobre las variables en ggplot

Si tengo esto:

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

Esto funciona bien:

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

Pero esto no es así:

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

que es un problema si quiero finalmente bucle sobre x, y y z. ¿Alguna ayuda?

+0

En general, 'ggplot2'is más feliz con data.frames formato largo, es decir,' m = masa fundida (t, id = "w"); ggplot (subconjunto (m, variable == "x"), aes (w, valor)) + geom_line() 'o' p <- ggplot (m, aes (w, valor)) + geom_line (aes (color = variable)) ', o' d_ply (m,. (variable), función (d) p% +% d, .print = TRUE) ', etc. – baptiste

Respuesta

32

sólo tiene que utilizar en lugar de aes_stringaes, así:

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

Tenga en cuenta que w luego tiene que ser especificado como una cadena, también.

2

El problema es cómo acceder al marco de datos t. Como probablemente sepa, existen varias formas de hacerlo, pero desafortunadamente el uso de un personaje obviamente no es uno de ellos en ggplot.

Una manera en que podría funcionar es usando la posición numérica de la columna en su ejemplo, por ejemplo, puede intentar i <- 2. Sin embargo, si esto funciona se basa en ggplot que nunca he usado (pero conozco otros trabajos de Hadley y supongo que debería funcionar)

Otra forma de eludir esto es creando un nuevo marco de datos temporal cada vez que llamas a ggplot . ej .:

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

He usado los índices numéricos antes, también, lo cual es genial para ripear a través de cada columna en un conjunto de datos. Me pongo nervioso cada vez que tengo que suponer que t $ x siempre será t [, 2], sin embargo. –

+0

Excelente, gracias. Estoy seguro de que necesitaré este trabajo en el futuro – Tom

+0

Esto no funciona para ggplots más complicados (por ejemplo, los que usan facetas). – Gregor

0

Dependiendo de lo que está tratando de hacer, encuentro facet_wrap o facet_grid a funcionar bien para la creación de varias parcelas con la misma estructura básica. Algo como esto se debe recibir en el camino correcto:

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