Saltar al contenido

cómo agregar capas en ggplot usando un bucle for

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

ingrese la descripción de la imagen aquí

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)

ingrese la descripción de la imagen aquí

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *