5

1日に行われた作業を積み上げ棒グラフとして表示し、各カテゴリで行ったアクティビティの量を毎日確認します。Y軸は0:00から23までの時間を表します。 59。

#   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

「timestart」を数値に変換する必要があることはわかっていますが、同じ日に複数の行を「マージ」して、プロット内の1つのバーのみを構成する方法がわかりません。

(非常に原始的な)ASCIIアートでは、私が期待しているのは次のようなものです。

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

(ここで、R、W、Cは、レクリエーション、仕事、家事など、さまざまな活動に対応するさまざまな色のバーになります)

実際、Rプロットの初心者であるため、私が見なければならないプロット関数(およびプロットパッケージ)はわかりません。さらに、それらはプロットの穴になるため、(たとえば)間にアクティビティは記録されません。 2012-10-03の0:00から09:09、その後11:40から13:33など...

4

2 に答える 2

6

これが簡単な解決策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"))

これは:

ここに画像の説明を入力してください

編集済み:最初の回答のy軸が間違っていました。

于 2013-02-07T10:41:41.740 に答える
4

私がこの投稿を書いている間、jubaはggplot2を使用して優れたソリューションを投稿しましたが、それでも代わりに私のソリューションを投稿します。

これは非常に大雑把な方法ですが、探していることを実現します。

hh:mm最初に、フォーマットの時間を10進表現に変換する小さな効用関数

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)

日を数値に変換し(長方形の幅を簡単に指定できるようにするため)、時間を10進数に変換します

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)

さまざまな長方形の色を取得する

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

グラフを一度に1ステップずつプロットします

#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)

結果はあなたが望むかもしれないいくらかあるはずです。

ここに画像の説明を入力してください

于 2013-02-07T10:46:39.207 に答える