2013-03-06 17 views
5

Mam data.frame z szeregów czasowych. Są tam również NA s, a także istnieje czynnik, który chciałbym wykorzystać do wyróżnienia różnych segmentów linii.Jak narysować linię rzadką (z przerwami) z segmentami pokolorowanymi według pewnego współczynnika w R?

flow.mndnr <- function(id, start, end) { 
    uri <- sprintf("http://maps1.dnr.state.mn.us/cgi-bin/csg.pl?mode=dump_hydro_data_as_csv&site=%s&startdate=%s&enddate=%s", id, start, end) 
    dat <- read.csv(url(uri), colClasses=c(Timestamp="Date")) 
    rng <- range(dat$Timestamp) 
    d <- data.frame(Timestamp=seq(rng[1], rng[2], by='day')) 
    merge(d, dat, all.x=TRUE) 
} 
dat <- flow.mndnr("28062001", as.Date("2002-04-02"), as.Date("2011-10-05")) 

mogę wykreślić ją bezwarunkowo

library(lattice) 
xyplot(Discharge..cfs. ~ Timestamp, dat, type='l', cex=0.5, auto.key=TRUE) 

enter image description here

Ale nie mogę pozbyć się linie łączące się przy próbie wprowadzenia czynnika

xyplot(Discharge..cfs. ~ Timestamp, dat, type='l', 
    groups=dat$Discharge..cfs..Quality, cex=0.5, auto.key=TRUE) 

enter image description here

samo z ggplot2

dat$quality <- dat$Discharge..cfs..Quality 
ggplot(dat, aes(x=Timestamp, y=Discharge..cfs.)) + 
    geom_path(aes(colour=quality)) + theme(legend.position='bottom') 

enter image description here

Próbowałem geom_line bez powodzenia. Przeczytałem w ggplot2 mailing archive, że droga do pracy to geom_path. Ale nie działa to dla mnie.

P.S. Dlaczego ggplot2 nie lubi kropek w nazwie, więc musiałem użyć innego?

+0

+1! ponieważ wypróbowałeś ggplot2 i kratę! powtarzalny przykład i jasne pytanie. – agstudy

+0

Re: kropki, aby działać poprawnie, ggplot musi zrobić sporo fantazyjnej oceny swoich argumentów, więc coś prawdopodobnie pójdzie nie tak. Ogólnie rzecz biorąc, dobrą praktyką byłoby czyszczenie nazw kolumn. Prosty "gsub" do usuwania kropek, na przykład. – joran

Odpowiedz

2

Problem dotyczy grupy. Możesz użyć year, aby pominąć te skoki. Wystarczy zrobić:

dat$grp <- format(dat$Timestamp, "%Y") 
ggplot(dat, aes(x=Timestamp, y=Discharge..cfs.)) + 
    geom_path(aes(colour = quality, group = grp)) + 
    theme(legend.position='bottom') 

Otrzymasz:

enter image description here

Edit: Aby odpowiedzieć na komentarz w szczegółach: Tak długo, jak nie wiem, która zmienna do grupy przez, nie można zgrupuj poprawnie. Jeśli brakuje ci kilku miesięcy w ciągu roku, oczywiście ten kod wygeneruje skoki. W tym przypadku proponuję robić coś takiego:

dat$grp <- paste(format(dat$Timestamp, "%Y"), format(dat$Timestamp, "%m")) 
ggplot(dat, aes(x=Timestamp, y=Discharge..cfs.)) + 
    geom_path(aes(colour = quality, group = grp)) + 
    theme(legend.position='bottom') 

Dostajesz to:

enter image description here

+0

To nie jest solidne. To może działać w tym przypadku. Ale niewiele pomoże, jeśli w ciągu roku nie będzie danych z czujnika. – mlt

+0

Zawsze będziesz musiał wiedzieć, do której zmiennej należy się grupować. Jeśli w ciągu roku wystąpi ogromna luka, musisz osobno pobrać miesiąc i rok i wkleić je jako "grp". – Arun

+0

@mlt, prawdopodobnie alternatywny (edycja) daje pomysł utworzenia zmiennej grupującej dla brakujących danych w ciągu roku (lub innych alternatywnych sytuacjach). – Arun