Salto de línea cuando no hay datos en ggplot2

Estoy usando R para trazar algunos datos.

Date <- c("07/12/2012 05:00:00", "07/12/2012 06:00:00", "07/12/2012 07:00:00", "07/12/2012 08:00:00","07/12/2012 10:00:00","07/12/2012 11:00:00") Date <- strptime(Date, "%d/%m/%Y %H:%M") Counts <- c("0","3","10","6","5","4") Counts <- as.numeric(Counts) df1 <- data.frame(Date,Counts,stringsAsFactors = FALSE) library(ggplot2) g = ggplot(df1, aes(x=Date, y=Counts)) + geom_line(aes(group = 1)) g 

¿Cómo le pido a R que no trace los datos como una línea continua cuando hay una interrupción en el tiempo? Normalmente tengo un punto de datos cada hora, pero a veces hay un descanso (entre las 8 a.m. y las 10 a.m.). Entre estos puntos, no quiero que la línea se conecte. ¿Es esto posible en R?

Editar

Muchas gracias por las respuestas aquí. Mis datos ahora están en intervalos de 10 segundos, y deseo hacer el mismo análisis usando estos datos.

 df <- structure(list(Date = c("11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012"), Time = c("20:16:00", "20:16:10", "20:16:20", "20:16:30", "20:16:40", "20:16:50", "20:43:30", "20:43:40", "20:43:50", "20:44:00", "20:44:10"), Axis1 = c(181L, 14L, 65L, 79L, 137L, 104L, 7L, 0L, 0L, 14L, 0L), Steps = c(13L, 1L, 6L, 3L, 8L, 4L, 1L, 0L, 0L, 0L, 0L)), .Names = c("Date", "Time", "Axis1", "Steps"), row.names = c(57337L, 57338L, 57339L, 57340L, 57341L, 57342L, 57502L, 57503L, 57504L, 57505L, 57506L), class = "data.frame") 

Creo que entiendo lo que el código está tratando de hacer, cuando agrega la columna ‘grupo’ al dataframe original, pero mi pregunta se refiere a cómo logro que R sepa que los datos están ahora en intervalos de 10 segundos. Cuando aplico la primera línea de código para determinar si los números son continuos o si hay un espacio (por ejemplo, idx <- c (1, diff (df $ Time)), aparece el siguiente error:

Error en r [i1] – r [-length (r) 🙁 length (r) – lag + 1L)]: argumento no numérico para el operador binario

Después de mi variable ‘Time’, ¿necesito agregar ‘as.POSIXct’ para asegurar que reconoce la hora correctamente?

Deberá establecer un group estableciendo un valor común para aquellos puntos en los que le gustaría estar conectado. Aquí, puede establecer los primeros 4 valores para decir 1 y los últimos 2 a 2 . Y mantenlos como factores. Es decir,

 df1$grp <- factor(rep(1:2, c(4,2))) g <- ggplot(df1, aes(x=Date, y=Counts)) + geom_line(aes(group = grp)) + geom_point() 

Editar: una vez que haya cargado su data.frame , puede usar este código para generar automáticamente la columna grp :

 idx <- c(1, diff(df$Date)) i2 <- c(1,which(idx != 1), nrow(df)+1) df1$grp <- rep(1:length(diff(i2)), diff(i2)) 

Nota: También es importante agregar geom_point() porque si el discontinuous range pasa a ser la ÚLTIMA entrada en el data.frame, no se trazará (ya que no hay 2 puntos para conectar la línea). En este caso, geom_point() lo geom_point() .

Como ejemplo, generaré datos con más vacíos:

 # get a test data set.seed(1234) df <- data.frame(Date=seq(as.POSIXct("05:00", format="%H:%M"), as.POSIXct("23:00", format="%H:%M"), by="hours")) df$Counts <- sample(19) df <- df[-c(4,7,17,18),] # generate the groups automatically and plot idx <- c(1, diff(df$Date)) i2 <- c(1,which(idx != 1), nrow(df)+1) df$grp <- rep(1:length(diff(i2)), diff(i2)) g <- ggplot(df, aes(x=Date, y=Counts)) + geom_line(aes(group = grp)) + geom_point() g 

ggplot2_groups

Editar: para su NUEVA información (suponiendo que es df ),

 df$t <- strptime(paste(df$Date, df$Time), format="%d/%m/%Y %H:%M:%S") idx <- c(10, diff(df$t)) i2 <- c(1,which(idx != 10), nrow(df)+1) df$grp <- rep(1:length(diff(i2)), diff(i2)) 

ahora ttwig con aes(x=t, ...) .

Creo que no hay forma de que R o ggplot2 sepan si falta un punto de datos en alguna parte, aparte de ti, para especificarlo con una NA . De esta manera, por ejemplo:

 df1 <- rbind(df1, list(strptime("07/12/2012 09:00:00", "%d/%m/%Y %H:%M"), NA)) ggplot(df1, aes(x=Date, y=Counts)) + geom_line(aes(group = 1)) 

enter image description here

La respuesta de Juba , para incluir NA explícitas donde quiera descansos, es el mejor enfoque. Aquí hay una manera alternativa de presentar esos NA en el lugar correcto (sin tener que resolverlo manualmente).

 every.hour <- data.frame(Date=seq(min(Date), max(Date), by="1 hour")) df2 <- merge(df1, every.hour, all=TRUE) g %+% df2 

enter image description here

Puede hacer algo similar con su ejemplo de df posterior, después de cambiar las fechas y horas en un formato adecuado

 df$DateTime <- as.POSIXct(strptime(paste(df$Date, df$Time), format="%m/%d/%Y %H:%M:%S")) every.ten.seconds <- data.frame(DateTime=seq(min(df$DateTime), max(df$DateTime), by="10 sec")) df.10 <- merge(df, every.ten.seconds, all=TRUE)