Trazado de dos variables como líneas utilizando ggplot2 en el mismo gráfico
-
04-10-2019 - |
Pregunta
Una pregunta muy newbish, pero decir que tengo los 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 trazar lo tanto el tiempo var0
series y var1
en el mismo gráfico, con date
en el eje x, usando ggplot2
? Los puntos de bonificación si se hacen var0
y var1
diferentes colores, y pueden incluir una leyenda!
Estoy seguro que esto es muy simple, pero no puedo encontrar ningún ejemplo que hay.
Solución
En un pequeño número de variables, se puede construir la trama manualmente usted mismo:
ggplot(test_data, aes(date)) +
geom_line(aes(y = var0, colour = "var0")) +
geom_line(aes(y = var1, colour = "var1"))
Otros consejos
El enfoque general consiste en convertir los datos a formato largo (usando melt()
de reshape
paquete o reshape2
) o gather()
/ pivot_longer()
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()
Es necesario que los datos sean en formato "alto" en lugar de "amplia" para ggplot2. medios "ancho" que tiene una observación por fila con cada variable como una columna diferente (como que tiene ahora). Es necesario convertirlo a un formato de "alto" donde se tiene una columna que indica el nombre de la variable y la otra columna que indica el valor de la variable. El proceso de pasar de gran angular a alto generalmente se llama "fusión". Puede utilizar tidyr::gather
a derretir su trama 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()
Para que quede claro que el data
ggplot
está consumiendo después se conducirá a través de miradas gather
como esto:
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
El uso de 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))
crear una versión apilada que es lo ggplot()
gustaría trabajar con:
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 stacked
producción fue bastante fácil, ya que sólo tuvimos que hacer un par de manipulaciones, pero reshape()
y la reshape
y reshape2
podría ser útil si usted tiene un conjunto de datos reales más compleja de manipular.
Una vez que los datos se encuentran en esta forma apilada, que sólo requiere una simple llamada ggplot()
para producir la trama que quería con todos los extras (una de las razones de mayor nivel de trazado de paquetes como lattice
y ggplot2
son tan útiles):
require(ggplot2)
p <- ggplot(stacked, aes(Dates, value, colour = variable))
p + geom_line()
voy a dejar a usted para poner en orden las etiquetas de los ejes, la leyenda del título, etc.
HTH
También soy nuevo en R pero tratando de entender cómo funciona ggplot Creo que lo entiendo otra manera de hacerlo. Acabo de compartir probablemente no como una solución perfecta completa, pero al añadir algunos puntos de vista diferentes.
Sé ggplot se hace para trabajar con tramas de datos mejores, pero tal vez puede ser también a veces útil saber que se puede trazar directamente dos vectores sin usar una trama de datos.
La carga de datos. longitud fecha original del vector es de 100, mientras que var0 y var1 tienen longitud 50 por lo que sólo representar los datos disponibles (primeras 50 fechas).
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=50)
Trazado
ggplot() + geom_line(aes(x=date,y=var0),color='red') +
geom_line(aes(x=date,y=var1),color='blue') +
ylab('Values')+xlab('date')
Sin embargo, no fue capaz de añadir una leyenda correcta usando este formato. ¿Alguien sabe cómo?
@Papalagui el color debe estar en AES para que sea una parte de la leyenda. De esta manera:
geom_line(aes(x=date,y=var0,color='red'))