【问题标题】:Plot time(x axis) and time of day & duration(y axis) of episodes情节时间(x 轴)和一天中的时间和持续时间(y 轴)剧集
【发布时间】:2012-05-27 02:56:00
【问题描述】:

我正在测量一个事件的持续时间,我想绘制持续时间,以及事件在每个观察日发生的时间。

我的数据集如下

> str(question.stack)
'data.frame':   398 obs. of  6 variables:
 $ id              : Factor w/ 1 level "AA11": 1 1 1 1 1 1 1 1 1 1 ...
 $ begin.recording : Factor w/ 1 level "8/15/2007": 1 1 1 1 1 1 1 1 1 1 ...
 $ begin.of.episode: Factor w/ 111 levels "1/1/2009","1/11/2009",..: 86 86 86 87 88 90 90 96 96 103 ...
 $ episode.day     : int  12 12 12 13 14 15 15 17 17 18 ...
 $ start.time      : Factor w/ 383 levels "0:06:01","0:17:12",..: 324 15 18 179 269 320 379 281 287 298 ...
 $ duration        : num  278 14 1324 18 428 ...

我想在 x 轴上显示 episode.day。 y 轴应该从 00:00 到 23:59:59(start.time)。例如,对于数据集的第二个条目,我想要一个从 (x=12,y=10:55:12) 到 (x=12, y=11:09:12) 的黑条,表示 14 分钟第 12 天的剧集持续时间。一集可以跨越 1 天以上。

R 可以做到这一点吗?如果可能,请仅使用 baseR 解决方案

类似的东西是Plot dates on the x axis and time on the y axis with ggplot2,但不是我想要的。

非常感谢

【问题讨论】:

  • 我给了它不止一个“去”,但我无法让 R 在 y 轴上处理时间(我发现 R 中的日期操作通常很困难),我看不出如何在日期更改期间绘制剧集。
  • 这只是如果你展示你已经尝试过然后它更容易帮助。例如,如果日期是个问题,并且您不担心以时间格式保存数据,您可以随时将其转换为简单的数字、绘图,然后更改 yaxis 实验室,例如:axis(2, at = Value, labels = paste(newlabs))

标签: r date graph time time-series


【解决方案1】:

好的,我终于找到了。

在 x 轴上,我想将日期绘制为 POSIXct 或记录的天数(整数)。在 y 轴上,我想要一天中的时间,以便图表在每一天(x 轴)和情节发生的时间(y 轴)之间呈现一个黑条。

R 可以绘制 POSIX,但在我的情况下,剧集的开始和结束时间(对于 y 轴)应该是 date-"less"

我是这样做的

#Cleaning the Dataset
qs<-question.stack
qs$id<-as.character(qs$id)
qs$begin.recording<-as.character(qs$begin.recording)
qs$begin.of.episode<-as.character(qs$begin.of.episode)
qs$start.time<-as.character(qs$start.time)
qs$start<-as.character(paste(qs$begin.of.episode,qs$start.time))
qs$duration<-round(qs$duration,0)

#Convert time and dates to POSIXct
qs$start<-as.POSIXct(qs$start,format="%m/%d/%Y %H:%M:%S",tz="UTC")
qs$start<-round(qs$start,"mins")
qs$end<-as.POSIXct(qs$start+qs$duration*60)
qs$start<-as.POSIXct(qs$start)

现在我们有

str(qs)
'data.frame':   398 obs. of  8 variables:
 $ id              : chr  "AA11" "AA11" "AA11" "AA11" ...
 $ begin.recording : chr  "8/15/2007" "8/15/2007" "8/15/2007" "8/15/2007" ...
 $ begin.of.episode: chr  "8/27/2007" "8/27/2007" "8/27/2007" "8/28/2007" ...
 $ episode.day     : int  12 12 12 13 14 15 15 17 17 18 ...
 $ start.time      : chr  "6:15:12" "10:55:12" "11:15:12" "18:19:12" ...
 $ duration        : num  278 14 1324 18 428 ...
 $ start           : POSIXct, format: "2007-08-27 06:15:00" "2007-08-27 10:55:00" ...
 $ end             : POSIXct, format: "2007-08-27 10:53:00" "2007-08-27 11:09:00" ...

下面创建了一个向量,其中包括有剧集的所有分钟数。可以按秒微调或按小时升级

tmp<-do.call(c, apply(qs, 1, function(x) seq(from=as.POSIXct(x[7]), to=as.POSIXct(x[8]),by="mins")))

下面创建一个数据框。将一天中的时间从 POSIX 切换到 (date-"less"),然后再回到 POSIX,保证在 time.of.day 的所有时间都会有相同的日期。也许也可以使用 origin 参数来做到这一点。

ep <- data.frame(sqs=tmp, date=as.Date(tmp,"%Y-%m-%d"),time.of.day=as.POSIXct(as.character(format(tmp,"%H:%M")),format="%H:%M"))

剧情

plot(ep$date, ep$time.of.day,pch=".")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多