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