2012-03-08 36 views
16

Estoy tratando de averiguar si es posible conectarse a través de valores perdidos usando geom_line. Por ejemplo, en el siguiente enlace faltan valores en el momento 3 en la faceta F. Me gustaría una línea para conectar el tiempo 2 y 4 en ese caso. ¿Hay una manera de lograr esto?Conectando a través de valores faltantes con geom_line

https://farm8.staticflickr.com/7061/6964089563_b150e0c2a6.jpg

que tienen una trama de datos de los valores acumulados de este modo:

head(cumulative) 

    individual series Time  Value 
1   A  x 1 -1.008821 
2   A  x 2 -2.273712 
3   A  x 3 -3.430610 
4   A  x 4 -4.618860 
5   A  x 5 -4.893075 
6   A  x 6 -5.836532 

que estoy trazando con:

ggplot(cumulative, aes(x=Time,y=Value, shape=series)) + 
    geom_point() + 
    geom_line(aes(linetype=series)) + 
    facet_wrap(~ individual, ncol=3) 
+0

me han preguntado una pregunta de seguimiento: http://stackoverflow.com/questions/27676179/connect-points-across-selected-nas-with-geom-line – PatrickT

Respuesta

33

respuesta de Richie es muy completo, pero quería mostrar algo más simple. Como las líneas no se dibujan en NA puntos, otro enfoque es soltar estos puntos al dibujar líneas. Esto implícitamente hace una interpolación lineal entre puntos (como lo hacen las líneas rectas).

Usando dfr de la respuesta de Richie, sin necesidad del cálculo de z paso:

ggplot(dfr, aes(x,y)) + 
    geom_point() + 
    geom_line(data=dfr[!is.na(dfr$y),]) 

Por lo demás, en este caso la creación de subconjuntos se podía hacer por todo el asunto.

ggplot(dfr[!is.na(dfr$y),], aes(x,y)) + 
    geom_point() + 
    geom_line() 
+0

¡Sí!Esta es exactamente la solución que estaba buscando. Ahora mi comando plot es: 'ggplot (acumulativo, aes (Tiempo, Valor, forma = series)) + geom_point() + geom_line (data = acumulativo [! Is.na (Valor acumulado de $),], aes (tipo de línea) = serie)) + facet_wrap (~ individual, ncol = 3) ' Y mi gráfico que viene a buscar como: http://farm8.staticflickr.com/7064/6969423337_125cee3cdd_b.jpg – patabongo

+0

¿Qué pasa si usted tiene más de un conjunto de 'y'? p.ej. y1 = runif (10), y2 = runif (10), y3 = runif (10) ... y todas las y tienen NA en diferentes lugares. ¿Esto todavía funciona? –

+1

@BenS. Entonces necesitarías usar la primera versión, con una llamada 'geom_line' separada para cada línea, y cada una conteniendo un argumento' data' que eliminó las entradas 'NA'. Típicamente, este tipo de gráficos se manejan mejor con 'ggplot' con datos fundidos (de forma larga), pero esa es una discusión totalmente diferente. –

11

Las líneas no están dibujado si el valor es NA. Debe reemplazarlos interpolando los puntos que faltan. Hay muchos algoritmos diferentes para la interpolación, necesita experimentar con varios y ver cuál se adapta mejor a sus datos. Este ejemplo usa interpolación lineal a través del interp1 en el paquete pracma.

datos de la muestra:

dfr <- data.frame(
    x = 1:10, 
    y = runif(10) 
) 
dfr[c(3, 6, 7), "y"] <- NA 

interpolación paso:

dfr$z <- with(dfr, interp1(x, y, x, "linear")) 

Compare parcelas:

ggplot(dfr, aes(x, y)) + geom_line() 
ggplot(dfr, aes(x, z)) + geom_line() 

Si usted está mostrando esta gráfica para otras personas, asegúrese de que usted marca con claridad los lugares donde ha sintetizado datos mediante la interpolación (tal vez usando líneas punteadas).


Actualización basada en comentario:
Puede especificar diferentes estéticas para diferentes Geoms.

ggplot(dfr, aes(x)) + 
    geom_point(aes(y = y)) + 
    geom_line(aes(y = z)) 

incorporar diferentes tipos de línea de falta/no perdidos y, se puede hacer algo como

ggplot(dfr, aes(x)) + 
    geom_point(aes(y = y)) + 
    geom_line(aes(y = y)) + 
    geom_line(aes(y = z), linetype = "dotted") 
+0

Gracias. En este caso, estoy trazando los puntos usando geom_point y luego conectándolos con geom_line. Parece que tendría que usar el marco de datos original para trazar los puntos y luego el marco de datos con valores interpolados para dibujar las líneas. – patabongo

Cuestiones relacionadas