2011-06-14 10 views
8

Necesito trazar una serie temporal con ggplot2. Para cada punto de la serie de tiempo también tengo algunos cuantiles, digamos 0.05, 0.25, 0.75, 0.95, es decir, tengo cinco datos para cada punto. Por ejemplo:R: trazar una serie temporal con cuantiles usando ggplot2

time   quantile=0.05 quantile=0.25 quantile=0.5 quantile=0.75 quantile=0.95 
00:01   623.0725  630.4353  903.8870  959.1407  1327.721 
00:02   623.0944  631.3707  911.9967  1337.4564  1518.539 
00:03   623.0725  630.4353  903.8870  1170.8316  1431.893 
00:04   623.0725  630.4353  903.8870  1336.3212  1431.893 
00:05   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:06   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:07   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:08   623.0780  631.3483  905.3496  1056.3719  1375.610 
00:09   623.0671  630.4275  903.8839  1170.8196  1356.963 
00:10   623.0507  630.0261  741.8475  1006.1208  1462.271 

Idealmente, me gustaría tener el cuantil 0,5 como una línea de negro y los demás como intervalos de color sombreadas que rodean la línea de color negro. ¿Cuál es la mejor manera de hacer esto? He estado mirando sin suerte, no puedo encontrar ejemplos de esto, incluso menos con ggplot2.

Cualquier ayuda sería apreciada.

Salud!

+2

Danos algunos datos para jugar. Aquí hay algunas pautas sobre cómo hacer un gran ejemplo reproducible: http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

Respuesta

9

¿Hace esto lo que quiere? El truco para ggplot es entender que espera datos en formato largo. Esto a menudo significa que tenemos que transformar los datos antes de que esté listo para trazar, generalmente con melt().

Después de leer sus datos con textConnection() y la creación de un objeto nombrado dat, aquí están los pasos que tomaría:

#Melt into long format 
dat.m <- melt(dat, id.vars = "time") 

#Not necessary, but if you want different line types depending on quantile, here's how I'd do it 
dat.m <- within(dat.m 
    , lty <- ifelse(variable == "quantile.0.5", 1 
    , ifelse(variable %in% c("quantile.0.25", "quantile.0.75"),2,3) 
    ) 
) 

#plot it 
ggplot(dat.m, aes(time, value, group = variable, colour = variable, linetype = lty)) + 
    geom_line() + 
    scale_colour_manual(name = "", values = c("red", "blue", "black", "blue", "red")) 

le ofrece:

enter image description here

Después de leer su pregunta de nuevo, ¿tal vez quieres cintas sombreadas fuera de la estimación mediana en lugar de líneas? Si es así, dale un giro. El único truco real aquí es que pasamos group = 1 como estética para que geom_line() se comporte correctamente con datos de factor/carácter. Previamente, agrupamos por la variable que sirvió el mismo efecto. También tenga en cuenta que ya no estamos utilizando el melt ed data.frame, ya que el wide data.frame nos va muy bien en este caso.

ggplot(dat, aes(x = time, group = 1)) + 
    geom_ribbon(aes(ymin = quantile.0.05, ymax = quantile.0.95, fill = "05%-95%"), alpha = .25) + 
    geom_ribbon(aes(ymin = quantile.0.25, ymax = quantile.0.75, fill = "25%-75%"), alpha = .25) + 
    geom_line(aes(y = quantile.0.5)) + 
    scale_fill_manual(name = "", values = c("25%-75%" = "red", "05%-95%" = "blue")) 

enter image description here

Editar: Para forzar una leyenda para el valor predicho

Podemos utilizar el mismo método que usamos para las capas geom_ribbon().Vamos a añadir una estética a geom_line() y después fijar los valores de esa estética con scale_colour_manual():

ggplot(dat, aes(x = time, group = 1)) + 
    geom_ribbon(aes(ymin = quantile.0.05, ymax = quantile.0.95, fill = "05%-95%"), alpha = .25) + 
    geom_ribbon(aes(ymin = quantile.0.25, ymax = quantile.0.75, fill = "25%-75%"), alpha = .25) + 
    geom_line(aes(y = quantile.0.5, colour = "Predicted")) + 
    scale_fill_manual(name = "", values = c("25%-75%" = "red", "05%-95%" = "blue")) + 
    scale_colour_manual(name = "", values = c("Predicted" = "black")) 

Puede haber formas más eficientes de hacer eso, pero esa es la forma en que siempre he utilizado y he tenido bastante bueno éxito con eso. YMMV.

+0

ggplot las respuestas son como los autobuses de Londres. Puedes esperar tres horas sin nada a la vista, y de repente ¡tienes dos dentro de 6 minutos! PD. +1 – Andrie

+0

Hace unos años, suena como un autobús en Ljubljana. :) –

+0

¡Guau, esto es casi perfecto! ¡Muchas gracias! Lo único que necesitaría agregar es una leyenda para la línea que dice "valores predichos". ¿Cómo podría hacer eso? ¿Puedo combinar scale_fill_manual con otro scale_manual? ¡Gracias de nuevo! – jla

5

Asumiendo que su dat.frame se llama df:

La solución más fácil es utilizar ggplot geom diagrama de caja. Esto da una línea central negra con cuadros llenos en las posiciones media y superior.

Dado que usted tiene pre-resumidos los datos, es importante especificar el parámetro stat="identity":

ggplot(df, aes(x=time)) + 
    geom_boxplot(
     aes(
      lower=quantile.0.25, 
      upper=quantile.0.75, 
      middle=quantile.0.5, 
      ymin=quantile.0.05, 
      ymax=quantile.0.95 
     ), 
     stat="identity", 
     fill = "cyan" 
) 

enter image description here

PS. Recreé sus datos de la siguiente manera:

df <- "time   quantile=0.05 quantile=0.25 quantile=0.5 quantile=0.75 quantile=0.95 
00:01   623.0725  630.4353  903.8870  959.1407  1327.721 
00:02   623.0944  631.3707  911.9967  1337.4564  1518.539 
00:03   623.0725  630.4353  903.8870  1170.8316  1431.893 
00:04   623.0725  630.4353  903.8870  1336.3212  1431.893 
00:05   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:06   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:07   623.0835  631.3557  905.4220  1079.6623  1452.260 
00:08   623.0780  631.3483  905.3496  1056.3719  1375.610 
00:09   623.0671  630.4275  903.8839  1170.8196  1356.963 
00:10   623.0507  630.0261  741.8475  1006.1208  1462.271" 

df <- read.table(textConnection(df), header=TRUE) 
+0

Hmmm - hemos interpretado su pregunta de manera diferente ... después de volver a leerlo, no estoy seguro de quién está en el camino correcto aquí! De todos modos, buen trabajo que muestra cómo crear manualmente los diagramas de caja. +1 – Chase

+0

Sí, estaba más interesado en el estilo de línea y cinta, ya que mi serie es larga. Pero gracias de todos modos, ¡aprendí algo más! :) – jla

Cuestiones relacionadas