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.

¿Fue útil?

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

salida ggplot2

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

 múltiples serie ggplot2

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

introducir descripción de la imagen aquí

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'))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top