0

我有一张这样的桌子:

> workingtime
         DATE TIME_START TIME_END    SHIFT
1  2013-06-04      00:00    08:00  noshift
2  2013-06-04      08:00    16:00       I0
3  2013-06-04      16:00    20:00 callduty
4  2013-06-04      20:00    22:30 overtime
5  2013-06-04      22:30    24:00 callduty
6  2013-06-05      00:00    07:00 callduty
7  2013-06-05      07:00    08:00 overtime
8  2013-06-05      08:00    16:00       I0
9  2013-06-05      16:00    20:00 callduty
10 2013-06-05      20:00    22:30 overtime
11 2013-06-05      22:30    24:00 callduty

我需要的是类似于这篇文章的情节:情节时间(x轴)和一天中的时间和持续时间(y轴)

但:

  • 我想在 x 轴上显示的时间范围仅为一周
  • y 轴旁边每天应该有一个箱线图(一周中的每一天) - 显示不同的颜色(每个工作时间 $SHIFT)
  • 结果应该有点像日历周视图(iCal、Google 日历等)
4

2 回答 2

1

对于任何情节,你总是可以从头开始做,因为在 R 中几乎所有东西都有原语。在你的情况下,我会这样做。具体来说,我会使用日期转换工具和polygon功能。这是一个超级快速的版本,它并没有真正处理好时间。

workingtime$s <- as.numeric( gsub( ":.*", "", workingtime$TIME_START ) ) + as.numeric( gsub( ".*:", "", workingtime$TIME_START ) ) / 60
workingtime$e <- as.numeric( gsub( ":.*", "", workingtime$TIME_END ) ) + as.numeric( gsub( ".*:", "", workingtime$TIME_END ) ) / 60
plot( NULL, xlim= c( 0.5, 7.5 ), ylim= c( 24, 0 ), xaxt= "n", xlab= "Week", ylab= "Hour" )
axis( 1, at=seq( 0.5, 7.5 ), labels= rep( "", 8 ) )
workingtime$day <- as.numeric( factor( workingtime$DATE ) )
for( i in 1:nrow( workingtime ) ) { 
  x <- c( -0.5, 0.5, 0.5, -0.5 ) + workingtime[i, "day"]
  y <- rep( c( workingtime[i,"s"], workingtime[i,"e"] ), each= 2 )
  polygon( x, y, col= workingtime[i,"SHIFT"]  ) 
}

这可以通过使用 和 得到strptime很大strftime改善as.Date

于 2013-07-09T13:52:15.680 回答
0

TeachingDemos 包中的cal功能可用于在当前设备上绘制日历,然后将绘图添加到特定日期。这可能会完成你想要的。如果您只想显示 1 周而不是整个月,那么您可以修改cal函数的代码以仅显示您想要的周。

于 2013-07-09T14:09:28.137 回答