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


Una pregunta muy novedosa, 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 ambas series temporales var0 y var1 en el mismo gráfico, con date en el eje x, usando ggplot2? Puntos de bonificación si haces var0 y var1 diferentes colores, y puede incluir una leyenda!

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

Author: Henrik, 2010-09-23

4 answers

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

ggplot(test_data, aes(date)) + 
  geom_line(aes(y = var0, colour = "var0")) + 
  geom_line(aes(y = var1, colour = "var1"))
 293
Author: hadley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-23 16:12:22

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

salida ggplot2

 298
Author: rcs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-09 14:52:34

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 lo tienes 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 sus datos marco:

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

Solo para ser claros, el data que ggplot está consumiendo después de canalizarlo a través de gather se 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
 21
Author: ecerulm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-20 09:21:47

Usando 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 ggplot() quisiera 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 tienes un conjunto de datos reales más complejo para manipular.

Una vez que los datos están en esta forma apilada, solo requiere una simple llamada ggplot() para producir la trama que quería con todos los extras (una razón por la que paquetes de trazado de alto nivel como lattice y ggplot2 son muy útiles):

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

Te dejaré a ti ordenar las etiquetas del eje, el título de la leyenda, etc.

HTH

 12
Author: Gavin Simpson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-23 16:29:40