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