R中的堆叠条形图,每天有多行
我想将一天中完成的工作显示为堆叠条形图,以便逐日查看我在每个类别中完成了多少活动,Y轴表示从0:00到23:59的时间R中的堆叠条形图,每天有多行,r,charts,plot,data-visualization,bar-chart,R,Charts,Plot,Data Visualization,Bar Chart,我想将一天中完成的工作显示为堆叠条形图,以便逐日查看我在每个类别中完成了多少活动,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 1
# 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
我知道我必须将“时间开始”转换为数字,但我不知道如何在同一天“合并”多行,以便它们在绘图中只组成一个条形图
在(非常原始的)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绘图的新手,我不知道我必须查看的绘图功能(和绘图包),而且因为它们在绘图中会有洞——在0:00到09:09之间,然后在11:40到13:33之间,没有记录活动(例如)。2012-10-03…这里有一个关于
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"))
d在我写这篇文章的时候,朱巴用ggplot2发布了一个优秀的解决方案,尽管如此,我还是会发布我的解决方案作为替代方案
这是一种非常粗糙的方法,但它可以实现您可能需要的功能
首先是一个小的实用函数,用于将格式时间hh:mm
转换为十进制表示
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)
结果应该是你想要的
你是在寻找某种答案吗?不是。这里的想法是得到一张图表,我们可以看到每天有多少时间(从13:40开始,36分钟,等等)我们从事哪项活动。它基于“计时”时间(记录的活动)。OTOH,甘特图的单位是任务和子任务。有一个分解的概念,我们这里没有。很高兴有一个基本图形的解决方案!非常好的解决方案。正是我所要求的,很快就被拒绝了。。。谢谢!(+1)也许你应该包括00:00到23:59的范围来完成答案?+1在上面的评论中,这是一个很好的选择(具有时钟的分辨率——例如:Y轴图例的增量为0:15)。对于其余的,这是一个很好的答案,为我打开了一个新的可能性世界(ggplot2,我不知道)事实上,这不是一个很好的答案,因为y轴都错了。。。阿伦让我意识到,我正在寻找解决方案……等等;不过,有一点“特征”:根据实时数据,Y轴的刻度间距不正确。可能吗?
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'))
#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)