2016-10-17 13 views
6

tworzę obojętne timeseries xts obiekt z brakującymi danymi dotyczącymi daty 2-09-2015 jak:odróżnienia od głównych wartości brakujących danych w działce wykorzystujące R

library(xts) 
library(ggplot2) 
library(scales) 

set.seed(123) 
seq <- seq(as.POSIXct("2015-09-01"),as.POSIXct("2015-09-02"), by = "1 hour") 
ob1 <- xts(rnorm(length(seq),150,5),seq) 
seq2 <- seq(as.POSIXct("2015-09-03"),as.POSIXct("2015-09-05"), by = "1 hour") 
ob2 <- xts(rnorm(length(seq2),170,5),seq2) 
final_ob <- rbind(ob1,ob2) 
plot(final_ob) 
# with ggplot 
df <- data.frame(time = index(final_ob), val = coredata(final_ob)) 
ggplot(df, aes(time, val)) + geom_line()+ scale_x_datetime(labels = date_format("%Y-%m-%d")) 

Po kreślenia moich danych wygląda następująco: enter image description here

Czerwono kolorowa prostokątna część reprezentuje datę, w której brakuje danych. Jak powinienem pokazać, że danych nie było w tym dniu na głównej działce?

Myślę, że powinienem pokazać brakujące dane w innym kolorze. Ale nie wiem, jak powinienem przetwarzać dane, aby odzwierciedlić brakujące zachowanie danych w głównym wątku.

+4

Dzięki za świetny powtarzalny przykład. –

+0

http://stackoverflow.com/questions/3321489/r-ggplot-plotting-irregular-time-series lub prawdopodobnie http://stackoverflow.com/questions/21529332/how-to-not-plot-gaps-in- timeseries-with-r –

Odpowiedz

7

Dzięki za świetny powtarzalny przykład. Myślę, że najlepiej jest pominąć tę linię w "brakującej" części. Jeśli masz linię prostą (nawet w innym kolorze), sugeruje to, że dane zostały zebrane w tym przedziale, który przypadkiem przypadł na tę linię prostą. Jeśli pominiesz linię w tym przedziale, jasne jest, że nie ma tam danych.

Problem polega na tym, że chcesz, aby dane godzinowe były łączone liniami, a następnie brak wierszy w sekcji "brakujących danych" - więc potrzebujesz sposobu na wykrycie brakujących sekcji danych.

Nie podałeś w tym pytaniu kryteriów, więc na podstawie twojego przykładu powiem, że każda linia na działce powinna składać się z danych w odstępach godzinnych; jeśli przerwa trwa dłużej niż godzinę, powinna powstać nowa linia. Będziesz musiał dostosować te kryteria do konkretnego problemu. Wszystko, co robimy, to dzielenie twojej ramek danych na bity, które są drukowane przez tę samą linię.

Więc najpierw utworzyć zmienną, która mówi której „grupa” (czyli linia) każde dane znajduje się w:

df$grp <- factor(c(0, cumsum(diff(df$time) > 1))) 

Następnie można użyć group= estetykę który geom_line używa się rozdzielić linie:

ggplot(df, aes(time, val)) + geom_line(aes(group=grp)) + # <-- only change 
    scale_x_datetime(labels = date_format("%Y-%m-%d")) 

enter image description here

+0

Wielkie dzięki :) –

Powiązane problemy