Trazando dos variables como líneas usando ggplot2 en el mismo gráfico

Una pregunta muy nueva, pero digamos que tengo datos como este:

test_data <- data.frame( var0 = 100 + c(0, cumsum(runif(49, -20, 20))), var1 = 150 + c(0, cumsum(runif(49, -10, 10))), date = seq(as.Date("2002-01-01"), by="1 month", length.out=100) ) 

¿Cómo puedo trazar las series temporales var0 y var1 en el mismo gráfico, con la date en el eje x, usando ggplot2 ? ¡Puntos de bonificación si haces var0 y var1 colores diferentes, y puedes incluir una leyenda!

Estoy seguro de que esto es muy simple, pero no puedo encontrar ningún ejemplo.

Para un pequeño número de variables, puede usar construir la ttwig manualmente usted mismo:

 ggplot(test_data, aes(date)) + geom_line(aes(y = var0, colour = "var0")) + geom_line(aes(y = var1, colour = "var1")) 

El enfoque general es convertir los datos a formato largo (utilizando melt() desde la reshape del paquete o la reshape2 ) o gather() desde el paquete tidyr :

 library("reshape2") library("ggplot2") test_data_long <- melt(test_data, id="date") # convert to long format ggplot(data=test_data_long, aes(x=date, y=value, colour=variable)) + geom_line() 

salida ggplot2

Necesita que los datos estén en formato “alto” en lugar de “ancho” para ggplot2. “ancho” significa tener una observación por fila con cada variable como una columna diferente (como la que tiene ahora). Debe convertirlo a un formato “alto” donde tenga una columna que le indique el nombre de la variable y otra columna que le indique el valor de la variable. El proceso de pasar de ancho a alto generalmente se llama “fusión”. Puede usar tidyr::gather para fundir su dataframe:

 library(ggplot2) library(tidyr) test_data <- data.frame( var0 = 100 + c(0, cumsum(runif(49, -20, 20))), var1 = 150 + c(0, cumsum(runif(49, -10, 10))), date = seq(as.Date("2002-01-01"), by="1 month", length.out=100) ) test_data %>% gather(key,value, var0, var1) %>% ggplot(aes(x=date, y=value, colour=key)) + geom_line() 

serie múltiple ggplot2

Para que quede claro los data que ggplot está consumiendo después de ggplot a través de gather ve así:

 date key value 2002-01-01 var0 100.00000 2002-02-01 var0 115.16388 ... 2007-11-01 var1 114.86302 2007-12-01 var1 119.30996 

Usando tus datos:

 test_data <- data.frame( var0 = 100 + c(0, cumsum(runif(49, -20, 20))), var1 = 150 + c(0, cumsum(runif(49, -10, 10))), Dates = seq.Date(as.Date("2002-01-01"), by="1 month", length.out=100)) 

Creo una versión astackda, que es con lo que ggplot() desea trabajar:

 stacked <- with(test_data, data.frame(value = c(var0, var1), variable = factor(rep(c("Var0","Var1"), each = NROW(test_data))), Dates = rep(Dates, 2))) 

En este caso, producir stacked fue bastante fácil, ya que solo tuvimos que hacer un par de manipulaciones, pero reshape() y la reshape y reshape2 podría ser útil si tiene que manipular un conjunto de datos más complejo.

Una vez que los datos están en esta forma astackda, solo se requiere una simple llamada a ggplot() para producir la gráfica que desea con todos los extras (una razón por la cual los paquetes de trazado de alto nivel como lattice y ggplot2 son tan útiles):

 require(ggplot2) p <- ggplot(stacked, aes(Dates, value, colour = variable)) p + geom_line() 

Te dejo a ti ordenar las tags del eje, el título de la leyenda, etc.

HTH