Trace múltiples líneas (series de datos), cada una con un color único en R

Soy bastante nuevo en R y tengo las siguientes consultas:

Estoy tratando de generar un diagtwig en R que tiene múltiples líneas (serie de datos). Cada una de estas líneas es una categoría y quiero que tenga un color único.

Actualmente mi código está configurado de esta manera:

Primero, estoy creando un diagtwig vacío:

plot(1,type='n',xlim=c(1,10),ylim=c(0,max_y),xlab='ID', ylab='Frequency') 

Luego, para cada una de mis categorías, estoy trazando líneas en este diagtwig vacío usando un ciclo “for” como ese:

 for (category in categories){ lines(data.frame.for.this.category, type='o', col=sample(rainbow(10)), lwd=2) } 

Aquí hay 8 categorías, por lo que hay 8 líneas producidas en la ttwig. Como puede ver, estoy intentando muestrear un color de la función de arco iris () para generar un color para cada línea.

Sin embargo, cuando se genera la ttwig, encuentro que hay varias líneas que tienen el mismo color. Por ejemplo, 3 de esas 8 líneas tienen color verde.

¿Cómo hago que cada una de estas 8 líneas tenga un color único?

Además, ¿cómo puedo reflejar esta singularidad en la leyenda de la ttwig? Estaba intentando buscar la función legend() , sin embargo, no estaba claro qué parámetro debería usar para reflejar este color único para cada categoría.

Cualquier ayuda o sugerencia sería muy apreciada.

Si sus datos están en formato ancho, matplot está hecho para esto y a menudo se olvida de:

  dat <- matrix(runif(40,1,20),ncol=4) # make data matplot(dat, type = c("b"),pch=1,col = 1:4) #plot legend("topleft", legend = 1:4, col=1:4, pch=1) # optional legend 

También existe la ventaja adicional para aquellos que no están familiarizados con cosas como ggplot que la mayoría de los parámetros de trazado como pch etc. son los mismos usando matplot() como plot() . enter image description here

Si desea una solución ggplot2 , puede hacerlo si puede dar forma a sus datos en este formato (ver ejemplo a continuación)

 # dummy data set.seed(45) df <- data.frame(x=rep(1:5, 9), val=sample(1:100, 45), variable=rep(paste0("category", 1:9), each=5)) # plot ggplot(data = df, aes(x=x, y=val)) + geom_line(aes(colour=variable)) 

ggplot2_geom_line

Tiene la estrategia general adecuada para hacer esto usando gráficos base, pero como se señaló, básicamente le está diciendo a R que elija un color aleatorio de un conjunto de 10 para cada línea. Dado eso, no es sorprendente que ocasionalmente obtengas dos líneas con el mismo color. Aquí hay un ejemplo usando gráficos base:

 plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n") cl <- rainbow(5) for (i in 1:5){ lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b') } 

enter image description here

Tenga en cuenta el uso de type = "n" para suprimir todos los trazado en la llamada original para configurar la ventana, y la indexación de cl dentro del bucle for.

Usando @Arun dummy data 🙂 aquí una solución lattice :

 xyplot(val~x,type=c('l','p'),groups= variable,data=df,auto.key=T) 

enter image description here

Se puede dibujar más de una línea en el mismo diagtwig utilizando la función lines()

 # Create the data for the chart. v <- c(7,12,28,3,41) t <- c(14,7,6,19,3) # Give the chart file a name. png(file = "line_chart_2_lines.jpg") # Plot the bar chart. plot(v,type = "o",col = "red", xlab = "Month", ylab = "Rain fall", main = "Rain fall chart") lines(t, type = "o", col = "blue") # Save the file. dev.off() 

SALIDA enter image description here

Lo sé, era una publicación anterior a responder, pero al igual que me encontré buscando la misma publicación, alguien más podría volverse también aquí

Al agregar: color en la función ggplot, pude lograr las líneas con diferentes colores relacionados con el grupo presente en la ttwig.

 ggplot(data=Set6, aes(x=Semana, y=Net_Sales_in_pesos, group = Agencia_ID, colour = as.factor(Agencia_ID))) 

y

 geom_line() 

Gráfico de líneas con múltiples colores

Aquí hay un código de muestra que incluye una leyenda si es de su interés.

 # First create an empty plot. plot(1, type = 'n', xlim = c(xminp, xmaxp), ylim = c(0, 1), xlab = "log transformed coverage", ylab = "frequency") # Create a list of 22 colors to use for the lines. cl <- rainbow(22) # Now fill plot with the log transformed coverage data from the # files one by one. for(i in 1:length(data)) { lines(density(log(data[[i]]$coverage)), col = cl[i]) plotcol[i] <- cl[i] } legend("topright", legend = c(list.files()), col = plotcol, lwd = 1, cex = 0.5) 

Aquí hay otra forma de agregar líneas usando plot() :

Primero, use la función par(new=T)

opción:

http://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_addat.html

Para colorearlos de manera diferente necesitarás col() .

Para evitar descripciones de ejes superfluas, utilice xaxt="n" y yaxt="n" para la segunda y otras gráficas.

Además de la respuesta de @ joran usando la función de plot base con un ciclo for , también puede usar la plot base con lapply :

 plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n") cl <- rainbow(5) invisible(lapply(1:5, function(i) lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b'))) 
  • Aquí, la función invisible simplemente sirve para evitar que lapply produzca una salida de lista en su consola (ya que todo lo que queremos es la recursión provista por la función, no una lista).

enter image description here

Como puede ver, produce exactamente el mismo resultado que usar el enfoque for loop.

Entonces, ¿por qué usar lapply ?

Aunque se ha demostrado que lapply funciona más rápido / mejor que en R (por ejemplo, mira aquí , aunque mira aquí para ver una instancia donde no lo está), en este caso, realiza más o menos lo mismo:

Aumentar el número de líneas a 50000 tanto para la lapply como for aproximaciones llevó a mi sistema a 46.3 y 46.55 segundos, respectivamente.

  • Entonces, aunque la lapply fue solo un poco más rápida, fue insignificante. Esta diferencia de velocidad puede ser útil con gráficos más grandes / más complejos, pero seamos honestos, 50000 líneas es probablemente un techo bastante bueno ...

Entonces, la respuesta a "¿ lapply qué lapply ?": Es simplemente un enfoque alternativo que funciona igual de bien. 🙂