2013-01-08 12 views
8

mam ramki danych tak:wykreślenie tylko raz przy użyciu ggplot2

head(yy) 
    Team  Date STime ETime 
1 A 2012-03-06 07:03 10:13 
2 A 2012-03-06 07:03 10:13 
3 A 2012-03-06 07:03 10:13 
4 A 2012-03-06 07:03 10:13 
5 A 2012-03-06 07:03 10:13 
6 A 2012-03-06 07:03 10:13 

dput (YY)

dput(yy) 
structure(list(Team = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "A", class = "factor"), 
Date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "2012-03-06", class = "factor"), 
STime = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "07:03", class = "factor"), 
ETime = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "10:13", class = "factor")), .Names = c("Team", 
"Date", "STime", "ETime"), class = "data.frame", row.names = c(NA, 
-50L)) 

że chciał zobaczyć oś y od 00:00 do 23:59, w 2-godzinny przyrost i być w stanie narysować czerwoną linię na wartości STime.

muszę somthing tak, ale to nie wygląda dobrze:

ggplot(yy, aes(Date, ETime, group="Team")) + geom_jitter(size=0.05) + facet_wrap(~ Team) + geom_hline(yintercept=yy$Stime, colour="red", size=2) 

enter image description here jak można to zrobić w ggplot2? Czy ktoś może mi wskazać/zacząć mnie we właściwym kierunku?

Pozdrawiam,

+2

Czy możesz podać wynik 'dput (df)' (lub 'dput (head (df))' jeśli jest zbyt duży), abyśmy mogli odtworzyć twoje dane? –

+0

@DavidRobinson, Właśnie umieściłem wyjście dput. – user1471980

+0

Nie ma różnic w danych. Jeśli próbujesz po prostu stworzyć ilustrację, powinieneś rzucić okiem [inkscape] (http://inkscape.org/), to świetny kawałek wolnego oprogramowania - jak R. –

Odpowiedz

6

trzeba formatować razy do rzeczywistych czasów. W tej chwili są to czynniki (sprawdź ramkę danych pod numerem str(yy)). Kiedy ETime jest nanoszone, pojedynczy czas jest narysowany jako 1 i oznaczony "10:13". Zatem poniższe rozwiązanie najpierw konwertuje ciąg "10:13" na czas (strptime), a następnie konwertuje go na POSIXct lub sekundy od początku (1/1/1970).

library(ggplot2); library(scales) 

#Convert date string into POSIXct format 
yy$STime <- as.POSIXct(strptime(yy$STime, format = "%H:%M", tz = "UTC")) 
yy$ETime <- as.POSIXct(strptime(yy$ETime, format = "%H:%M", tz = "UTC")) 

#Define y-axis limits 
lims <- as.POSIXct(strptime(c("0:00","23:59"), format = "%H:%M", tz= "UTC"))  

ggplot(yy, aes(Date, ETime, group="Team")) + geom_jitter(size=1) + facet_wrap(~ Team) + 
    geom_hline(data = yy, aes(yintercept= as.numeric(STime)), colour="red", size=2) + 
    scale_y_datetime(limits =lims, breaks=date_breaks("2 hour"), 
        labels=date_format("%H:%M", tz = "UTC")) 

datetime y-axis Uwaga na geom_line to date axis.

Należy również zwrócić uwagę na strefy czasowe. W przeciwnym razie R/ggplot będzie formatować rzeczy zgodnie z lokalną strefą czasową.

Powiązane problemy