two one multiple matplot graphs ggplot color r colors plot unique lines

one - r plot color



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

Soy bastante nuevo en R y tengo las siguientes consultas:

Estoy tratando de generar un diagrama 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 diagrama 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 diagrama 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 trama. 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 trama, 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 trama? 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.


Además de la answer @ 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).

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 here , aunque mira here 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. :)


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.


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)


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 trama.

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

y

geom_line()


Se puede dibujar más de una línea en el mismo diagrama 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


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


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


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

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)