【问题标题】:Stacked bar plot in R with multiple rows per dayR中的堆积条形图,每天多行
【发布时间】:2013-01-22 17:22:32
【问题描述】:

我想将一天中完成的工作显示为堆积条形图,以便逐日查看我在每个类别中完成了多少活动,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

我知道我必须将“时间开始”转换为数字,但我不知道如何“合并”同一天的多行,以便它们只构成图中的一个条形.

在(非常原始的)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...

【问题讨论】:

  • 你在寻找Gantt chart吗?
  • 没有。这里的想法是得到一个图表,我们可以看到 - 每天 - 我们在哪些活动上工作了多少时间(从 13:40 开始,持续 36 分钟等)。它基于“计时”时间(记录的活动)。
  • OTOH,甘特图的单位是任务和子任务。有一个分解的概念,我们这里没有。

标签: r charts plot data-visualization bar-chart


【解决方案1】:

这是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 轴是错误的。

【讨论】:

  • (+1) 也许您应该包括 00:00 到 23:59 的范围来完成答案?
  • 上述评论+1,这是一个不错的选择(时钟分辨率-例如:Y轴图例的增量为0:15)。
  • 对于其余的,这是一个很棒的答案,让我进入了一个充满可能性的新世界(ggplot2,我不知道)
  • 其实这不是一个很好的答案,因为 y 轴都错了... Arun 让我意识到,我正在寻求解决方案...
  • 等待;不过,有一点“特征”:根据实时,Y 轴的刻度没有正确间隔。这可能吗?
【解决方案2】:

在我写这篇文章时,juba 使用 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)

将日期转换为数字(以便于指定矩形的宽度)并将时间转换为小数

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)

结果应该是你可能想要的。

【讨论】:

  • 很高兴有一个基本图形的解决方案!
  • 也是非常好的解决方案。正是我所要求的,而且如此之快......非常感谢!
猜你喜欢
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 2022-06-16
相关资源
最近更新 更多