varias superponer modificar los graficos graficas ggplot escala ejes como cambiar avanzados r ggplot2 graph time-series r-faq

modificar - superponer graficas en r ggplot



Graficando dos variables como líneas usando ggplot2 en el mismo gráfico (4)

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 de tiempo 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 puede incluir una leyenda!

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


El enfoque general es convertir los datos a formato largo (usando melt() del paquete reshape o reshape2 ) o gather() del 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()


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" en el que 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 denomina "fusión". Puede usar tidyr::gather para fundir su marco de datos:

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

Solo para aclarar los data que ggplot está consumiendo después de canalizarlos a través de la 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


Para un pequeño número de variables, puede usar construir el gráfico manualmente usted mismo:

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


Utilizando sus 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 apilada que es con lo que a ggplot() le gustaría 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 reshape y reshape2 podrían ser útiles si tiene un conjunto de datos reales más complejo que manipular.

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

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

Te lo dejo a ti para ordenar las etiquetas de los ejes, el título de la leyenda, etc.

HTH