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 tanto series de tiempo var0
como var1
en el mismo gráfico, con date
el eje x, usando ggplot2
? Los puntos de bonificación si se hacen 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í.
colour=
como el nombre de la variable.colour='var_names'
según lo especificado por hadley funciona bien. pero @DaveX: sería más específico si se desea elegir colores específicos en lugar de colores seleccionados automáticamente por la función.El enfoque general es convertir los datos a formato largo (usando
melt()
desde el paquetereshape
oreshape2
) ogather()
/pivot_longer()
desde eltidyr
paquete:También vea esta pregunta sobre la remodelación de datos de ancho a largo.
fuente
gather()
función detidyr
paquete para derretir los datos:gather(test_data, variable, value, -date)
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 tiene 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 "derretimiento". Puede usar
tidyr::gather
para derretir su marco de datos:Para que quede claro, lo
data
queggplot
está consumiendo después de conectarlo segather
ve así:fuente
Usando sus datos:
Creo una versión apilada con la que me
ggplot()
gustaría trabajar:En este caso, la producción
stacked
fue muy fácil ya que sólo tuvimos que hacer un par de manipulaciones, peroreshape()
y elreshape
yreshape2
podría ser útil si usted tiene un conjunto de datos reales más compleja de manipular.Una vez que los datos están en esta forma apilada, solo se requiere una simple
ggplot()
llamada para producir la trama que desea con todos los extras (una razón por la cual los paquetes de trama de alto nivel les gustanlattice
yggplot2
son tan útiles):Te dejaré que arregles las etiquetas de los ejes, el título de la leyenda, etc.
HTH
fuente
rep()
, por lo que realmente solo estamos obteniendo 3 colsstacked
. Editaré el código para aclarar la sangría.melt()
está bien tomado, y noto que el paquete reshape [2] sería útil aquí. No estoy tan familiarizado con reshape2 y para una manipulación tan simple hacerlo a mano es más complejo que una llamadamelt()
, fue menos esfuerzo ya que no necesitaba leer cómo usarlomelt()
. Y RCS se coló con su respuesta mientras yo producía la mía; cuando comencé la respuesta no había habido respuestas. más de una forma de pelar un gato, como dicen. ;-)También soy nuevo en R, pero al tratar de entender cómo funciona ggplot, creo que tengo otra forma de hacerlo. Probablemente comparto probablemente no como una solución perfecta completa sino para agregar algunos puntos de vista diferentes.
Sé que ggplot está diseñado para funcionar mejor con los marcos de datos, pero tal vez a veces también sea útil saber que puedes trazar directamente dos vectores sin usar un marco de datos.
Cargando datos. La longitud del vector de fecha original es 100, mientras que var0 y var1 tienen una longitud de 50, por lo que solo trazo los datos disponibles (primeras 50 fechas).
Graficado
Sin embargo, no pude agregar una leyenda correcta usando este formato. ¿Alguien sabe cómo?
fuente
ggplot() + geom_line(aes(x=date,y=var0, group=1, colour = 'red')) + geom_line(aes(x=date,y=var1, group = 2, colour = 'blue')) + ylab('Values')+xlab('date')