Solución:
Un enfoque sería remodelar su marco de datos de formato ancho a formato largo usando la función melt()
de la biblioteca reshape2
. En el nuevo marco de datos tendrá x1
valores, variable
que determinan de qué columna provienen los datos, y value
que contiene todos los valores de y originales.
Ahora puede trazar todos los datos con uno ggplot()
y geom_line()
llamar y usar variable
para tener, por ejemplo, un color diferente para cada línea.
library(reshape2)
df.long<-melt(df,id.vars="x1")
head(df.long)
x1 variable value
1 1 y1 2.0
2 2 y1 5.4
3 3 y1 7.1
4 4 y1 4.6
5 5 y1 5.0
6 1 y2 0.4
ggplot(df.long,aes(x1,value,color=variable))+geom_line()
Si realmente desea usar el bucle for () (no es la mejor manera), debe usar names(df)[-1]
en lugar de seq()
. Esto hará un vector de nombres de columna (excepto la primera columna). Entonces adentro geom_line()
usar aes_string(y=i)
para seleccionar la columna por su nombre.
plotAllLayers<-function(df){
p<-ggplot(data=df,aes(df[,1]))
for(i in names(df)[-1]){
p<-p+geom_line(aes_string(y=i))
}
return(p)
}
plotAllLayers(df)
Probé el método de fusión en un gran conjunto de datos desordenado y deseaba un método más rápido y más limpio. Este bucle for usa eval () para construir la trama deseada.
fields <- names(df_normal) # index, var1, var2, var3, ...
p <- ggplot( aes(x=index), data = df_normal)
for (i in 2:length(fields)) {
loop_input = paste("geom_smooth(aes(y=",fields[i],",color="",fields[i],""))", sep="")
p <- p + eval(parse(text=loop_input))
}
p <- p + guides( color = guide_legend(title = "",) )
p
Esto funcionó mucho más rápido que un gran conjunto de datos derretido cuando lo probé.
También probé el bucle for con aes_string (y = fields[i], color = campos[i]), pero no pudo diferenciar los colores.