2013-02-07 8 views
5

Ich möchte die an einem Tag geleistete Arbeit als gestapeltes Balkendiagramm darstellen, um Tag für Tag zu sehen, wie viel Aktivität ich in jeder Kategorie gemacht habe die Y-Achse repräsentiert die Zeit von 0:00 bis 23:59.Gestapeltes Balkendiagramm in R mit mehreren Zeilen pro Tag

# day    tstart tend duration category 
1 2012-10-01  13:40 14:16 36  Recreation 
2 2012-10-02  10:15 10:57 42  Work 
3 2012-10-02  13:23 13:47 24  Chores 
4 2012-10-02  13:47 14:48 61  Work 
5 2012-10-03  09:09 11:40 151  Work 
6 2012-10-03  13:33 14:04 31  Recreation 
7 2012-10-03  17:00 19:40 160  Recreation 

Ich weiß, ich muss „Zeitstart“ konvertieren als numerischer, aber ich weiß nicht, wie man die mehrere Zeilen für den gleichen Tag „verschmelzen“, so dass sie bilden nur eine Bar im Grundstück.

In (sehr primitiv) ASCII-Art, was ich erwarte, ist so etwas wie:

23:00 
22:00 
21:00 
20:00 
19:00    C 
18:00    C 
17:00    C 
16:00 
15:00 
14:00   W  R 
13:00 R  C 
12:00 
11:00    W 
10:00   W  W 
9:00    W 
8:00 
7:00 
6:00 
5:00 
4:00 
3:00 
2:00 
1:00 
0:00 
     01 02 03 

(wobei R, W und C Bars in verschiedenen Farben für die verschiedenen Aktivitäten würde: Freizeit, Arbeit und Aufgaben)

In der Tat, als Neuling in R-Plots, weiß ich nicht die Plot-Funktion (und das Plot-Paket) muss ich betrachten, außerdem wie sie sind Löcher in der Handlung - keine Aktivität aufgezeichnet (zum Beispiel) zwischen 0:00 und 09:09, dann zwischen 11:40 und 13:33 usw. am 2012-10-03 ...

+2

Suchen Sie eine Art von [Gantt-Diagramm] (http://en.wikipedia.org/wiki/Gantt_chart)? – A5C1D2H2I1M1N2O1R2T1

+0

Nein. Die Idee ist hier, eine Tabelle zu bekommen, wo wir sehen - Tag pro Tag - wie viel Zeit (ab 13:40, für 36 Minuten usw.) wir arbeiten an welcher Aktivität. Es basiert auf der "getakteten" Zeit (aufgezeichnete Aktivität). – fniessen

+0

OTOH, eine Gantt-Diagramm-Einheit ist Aufgaben und Teilaufgaben. Es gibt eine Vorstellung von Zersetzung, die wir hier nicht haben. – fniessen

Antwort

6

Hier ist eine schnelle Lösung mit ggplot2:

d <- read.table(textConnection(" 
day    tstart tend duration category 
2012-10-01  13:40 14:16 36  Recreation 
2012-10-02  10:15 10:57 42  Work 
2012-10-02  13:23 13:47 24  Chores 
2012-10-02  13:47 14:48 61  Work 
2012-10-03  09:09 11:40 151  Work 
2012-10-03  13:33 14:04 31  Recreation 
2012-10-03  17:00 19:40 160  Recreation"), header=TRUE) 

d$day <- as.Date(d$day) 
d$tstart <- as.POSIXct(d$tstart, format="%H:%M") 
d$tend <- as.POSIXct(d$tend, format="%H:%M") 

library(ggplot2) 
library(scales) 
g <- ggplot(data=d, aes()) + geom_segment(aes(x=day,xend=day,y=tstart,yend=tend,color=category),size=20) + scale_x_date(labels = date_format("%d")) 
g + scale_y_datetime(limits=c(as.POSIXct("00:00", format="%H:%M"),as.POSIXct("23:59", format="%H:%M")), labels = date_format("%H:%M")) 

Welche gibt:

enter image description here

EDITED: falsch war die y-Achse in der ersten Antwort.

+1

(+1) Vielleicht sollten Sie den Bereich 00:00 bis 23:59 einschließen, um die Antwort zu vervollständigen? – Arun

+0

+1 auf den obigen Kommentar, der ein nice-to-have (mit der Auflösung der Uhr - zum Beispiel: Inkrementen von 0:15 für die Legende der Y-Achse) ist. – fniessen

+0

Für den Rest ist dies eine wunderbare Antwort und eröffnet mir eine neue Welt der Möglichkeiten (ggplot2, die ich nicht kannte) – fniessen

4

Während ich diesen Beitrag schrieb, postte juba ausgezeichnete Lösung mit ggplot2, werde ich meine Lösung dennoch als Alternative posten.

Dies ist sehr grobe Art, es zu tun, aber es erfüllt, was Sie suchen.

Zuerst eine kleine Hilfsfunktion Zeit Format hh:mm zu Dezimaldarstellung konvertiert

decTime <- function(x) { 
    t <- as.numeric(strsplit(x, ":")[[1]]) 
    t <- t[1] + t[2]/60 
    return(t) 
} 

str <- 'n day  tstart tend duration category 
1 2012-10-01  13:40 14:16 36  Recreation 
2 2012-10-02  10:15 10:57 42  Work 
3 2012-10-02  13:23 13:47 24  Chores 
4 2012-10-02  13:47 14:48 61  Work 
5 2012-10-03  09:09 11:40 151  Work 
6 2012-10-03  13:33 14:04 31  Recreation 
7 2012-10-03  17:00 19:40 160  Recreation' 

df <- read.table(textConnection(str), header=T) 

Convert Tag numerisch (für eine einfache Breite der Rechtecke Angabe) und Zeiten

df$day <- gsub('2012-10-', "", df$day) 
df$day <- as.numeric(df$day) 
df$starttime <- sapply(as.character(df$tstart), decTime, USE.NAMES=F) 
df$endtime <- sapply(as.character(df$tend), decTime, USE.NAMES=F) 

in Dezimalzahlen Get Farben für verschiedene Rechtecke

df$color <- ifelse(df$category=='Recreation', 'RED', ifelse(df$category =='Chores', 'BLUE', 'GREEN')) 

Pl ot der Grafik ein Schritt um zur Zeit

#Plot empty graph 
plot(x=unique(df$day), y=c(0,0,0), axes=F, ylim=c(0,24), xlim=c(0.5,3.5), xlab='date', ylab='time', type='n') 
#Label axes properly 
axis(side=1, at=c(1,2,3), labels=c('01', '02', '03')) 
axis(side=2, at=seq(from=0,to=24,by=1), labels=seq(from=0,to=24,by=1)) 
#Draw required rectangles 
rect(df$day-0.25, df$starttime, df$day+0.25, df$endtime, col=df$color) 

Ergebnis sollte etwas sein, was Sie wollen.

enter image description here

+0

Schön, eine Lösung mit Basisgrafiken zu haben! – juba

+0

Sehr schöne Lösung. Genau das, wonach ich gefragt habe, und so schnell ... Danke vielmals! – fniessen