2013-01-03 9 views
14

Mam szereg czasowy z wieloma dniami danych. W każdym dniu jest jeden okres bez punktów danych. Jak mogę pominąć te okresy podczas drukowania serii czasowych przy użyciu ggplot2?Wyznaczanie serii czasowych ggplot2: jak pomijać okresy, gdy nie ma punktów danych?

Sztuczny przykład pokazany poniżej, jak pozbyć się dwóch okresów braku danych?

Kod:

Time = Sys.time()+(seq(1,100)*60+c(rep(1,100)*3600*24, rep(2, 100)*3600*24, rep(3, 100)*3600*24)) 
Value = rnorm(length(Time)) 
g <- ggplot() 
g <- g + geom_line (aes(x=Time, y=Value)) 
g 

enter image description here

Odpowiedz

17

Najpierw utwórz zmienną ugrupowania. Tutaj dwie grupy są różne, jeżeli różnica czasu jest większy niż 1 minuta:

Group <- c(0, cumsum(diff(Time) > 1)) 

obecnie trzy różne panele mogą być tworzone za pomocą facet_grid a argument scales = "free_x":

library(ggplot2) 
g <- ggplot(data.frame(Time, Value, Group)) + 
    geom_line (aes(x=Time, y=Value)) + 
    facet_grid(~ Group, scales = "free_x") 

enter image description here

+1

Zdecydowanie najlepsze rozwiązanie, gdy masz tylko kilka bloków. – csgillespie

+0

Thx. Próbowałem to zrobić w ramach jednej fabuły, ale wydaje się, że twoja metoda jest nadal akceptowalna. Inne pakiety, takie jak quantmod, mogą zrobić to doskonale, ale myślę, że nie jest to, co powinien zrobić ggplot2. – billlee1231

9

Problemem jest to, że jak robi ggplot2 wiedzieć masz brakujących wartości? Widzę dwie opcje:

  1. Pad na swoich szeregów czasowych z NA wartości
  2. Dodaj dodatkowej zmiennej reprezentującej „grupy”. Na przykład,

    dd = data.frame(Time, Value) 
    ##type contains three distinct values 
    dd$type = factor(cumsum(c(0, as.numeric(diff(dd$Time) - 1)))) 
    
    ##Plot, but use the group aesthetic 
    ggplot(dd, aes(x=Time, y=Value)) + 
         geom_line (aes(group=type)) 
    

    daje

    enter image description here

+0

Dzięki. Ale wolałbym całkowicie pozbyć się pustych okresów pośrednich (co oznacza, że ​​nie były pokazywane na osi x). – billlee1231

+3

Nie umieściłeś tego w swoim pytaniu;) Ale odpowiedź, którą zaakceptowałeś, jest o wiele ładniejsza tylko na kilka bloków i to jest ta, którą chciałbym wybrać. – csgillespie

3

csgillespie wspomniane wypełnianie przez NA, ale prostszą metodą jest dodanie jednej NA po każdym bloku:

Value[seq(1,length(Value)-1,by=100)]=NA 

gdzie -1 unika ostrzeżenia.

Powiązane problemy