以R为单位绘制事件频率和时间

以R为单位绘制事件频率和时间,r,datetime,time,plot,histogram,R,Datetime,Time,Plot,Histogram,我有一个合理数量的时间数据,我想把它放在一个频率图中,其中X轴是几个时间间隔,Y轴是我在这段时间收集的数据量。请参见此示例: 假设我有以下列表: [10:17:55, 10:37:40, 10:40:26, 10:48:18, 11:00:17, 11:01:12, 11:06:58, 11:09:20, 11:43:41, 11:48:24, 11:49:14, 12:07:31, 12:10:52, 12:10:52, 12:19:00, 12:19:00, 12:19:43, 12:20:

我有一个合理数量的时间数据,我想把它放在一个频率图中,其中X轴是几个时间间隔,Y轴是我在这段时间收集的数据量。请参见此示例:

假设我有以下列表:

[10:17:55, 10:37:40, 10:40:26, 10:48:18, 11:00:17, 11:01:12, 11:06:58, 11:09:20, 11:43:41, 11:48:24, 11:49:14, 12:07:31, 12:10:52, 12:10:52, 12:19:00, 12:19:00, 12:19:43, 12:20:55, 12:38:27, 12:38:27, 12:55:09, 12:55:10, 12:57:31, 12:57:31, 13:04:16, 13:04:16, 13:06:51   13:06:51, 14:55:06, 14:56:10, 15:01:30, 15:28:42, 3:29:17, 15:35:33, 15:58:32, 16:05:07, 16:09:16, 16:10:36, 16:32:57, 16:32:57, 16:34:32, 16:38:16, 17:43:27, 17:53:01, 17:56:14, 18:08:21, 18:17:23, 18:37:23, 18:37:23, 18:43:13, 18:43:13   18:51:43, 18:51:43, 19:05:39, 19:05:39]
我想绘制一个柱状图,显示在1小时或30分钟的间隔内有多少个值,如:

10h - 11h: 4
11h - 12h: 7
.
.
.
19h - 20h: 2
但所有这些都用图表表示。我知道如何在R中绘制柱状图的基本知识,但我不知道如何绘制柱状图。我已经看到一些答案在一天中绘制图表,这不太适用,因为这些值是在不同的日子收集的。。。你们能帮帮我吗

编辑:以下是列表的dput:

structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 
13L, 13L, 14L, 14L, 15L, 16L, 17L, 17L, 18L, 19L, 20L, 20L, 21L, 
21L, 22L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 
33L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 41L, 42L, 42L, 
43L, 43L, 44L, 44L), .Label = c("10:17:55", "10:37:40", "10:40:26", 
"10:48:18", "11:00:17", "11:01:12", "11:06:58", "11:09:20", "11:43:41", 
"11:48:24", "11:49:14", "12:07:31", "12:10:52", "12:19:00", "12:19:43", 
"12:20:55", "12:38:27", "12:55:09", "12:55:10", "12:57:31", "13:04:16", 
"13:06:51", "14:55:06", "14:56:10", "15:01:30", "15:28:42", "15:29:17", 
"15:35:33", "15:58:32", "16:05:07", "16:09:16", "16:10:36", "16:32:57", 
"16:34:32", "16:38:16", "17:43:27", "17:53:01", "17:56:14", "18:08:21", 
"18:17:23", "18:37:23", "18:43:13", "18:51:43", "19:05:39"), class = "factor")`

这是我用来获得你想要的东西的方法

这将持续工作数小时半。不是最漂亮的,但我认为它符合你的目的。您需要对轴进行一些按摩,以便它们显示您想要的信息。希望这有帮助

hours <- as.numeric( format( strptime( times , format = "%H:%M:%S" ) , "%H" ) )
hist( hours , breaks = unique( hours ) )

half_hours <- hours + ( as.numeric( format( strptime( times , format = "%H:%M:%S" ) , "%M" ) ) /60 )
hist(half_hours , breaks = c( unique( hours ) , unique( hours ) + 0.5 ) )

这是我用来获得你想要的东西的方法

这将持续工作数小时半。不是最漂亮的,但我认为它符合你的目的。您需要对轴进行一些按摩,以便它们显示您想要的信息。希望这有帮助

hours <- as.numeric( format( strptime( times , format = "%H:%M:%S" ) , "%H" ) )
hist( hours , breaks = unique( hours ) )

half_hours <- hours + ( as.numeric( format( strptime( times , format = "%H:%M:%S" ) , "%M" ) ) /60 )
hist(half_hours , breaks = c( unique( hours ) , unique( hours ) + 0.5 ) )

POSIXt或日期对象有range、trunc和seq方法。假设您将该结构对象指定给一个名称,如tms,这将转换为POSIXct,然后构建一个范围,一个跨越小时的中断序列,然后在30分钟的间隔内构建bin:

> tms <- as.POSIXct(tms, format="%H:%M:%S")
> brks <- trunc(range(tms), "hours")
Warning message:
In if (isdst == -1) { :
  the condition has length > 1 and only the first element will be used
> hist(tms, breaks=seq(brks[1], brks[2]+3600, by="30 min") )
请注意,POSIXt对象的打印方法处理x轴标签:

我想你可以检查一下,看看第二个brks是否在30分钟绘图的半小时窗口内。因此,如果针对半小时垃圾箱,这将是避免空白垃圾箱的代码:

hist(tms, breaks=seq(brks[1], 
                     brks[2]+ if( as.numeric( max(tms)-brks[2] ) < 30) #diff time in mins
                                   {1800} else{3600},
                    by="30 min")
    )

POSIXt或日期对象有range、trunc和seq方法。假设您将该结构对象指定给一个名称,如tms,这将转换为POSIXct,然后构建一个范围,一个跨越小时的中断序列,然后在30分钟的间隔内构建bin:

> tms <- as.POSIXct(tms, format="%H:%M:%S")
> brks <- trunc(range(tms), "hours")
Warning message:
In if (isdst == -1) { :
  the condition has length > 1 and only the first element will be used
> hist(tms, breaks=seq(brks[1], brks[2]+3600, by="30 min") )
请注意,POSIXt对象的打印方法处理x轴标签:

我想你可以检查一下,看看第二个brks是否在30分钟绘图的半小时窗口内。因此,如果针对半小时垃圾箱,这将是避免空白垃圾箱的代码:

hist(tms, breaks=seq(brks[1], 
                     brks[2]+ if( as.numeric( max(tms)-brks[2] ) < 30) #diff time in mins
                                   {1800} else{3600},
                    by="30 min")
    )

假设它们是日期:histas.numericformathour_dat,%H,breaks=24基本上您希望首先隔离小时。格式会吐出一个字符,所以你需要转换成数字。当我收集它们时,我抑制了日期值。我猜现在它们是纯时间数据。。。如果是这样,我将如何进行?当我尝试应用您的解决方案时,它抛出无效的“trim”参数。请输入数据。请将png中的信息添加到您提出的问题中。dput的图片不允许用户将信息输入到他们的R会话中。简单地回答这个问题,然后我们可以进一步帮助您。假设它们是日期:histas.numericformathour\u dat,%H,breaks=24,基本上您希望首先隔离小时。格式会吐出一个字符,所以你需要转换成数字。当我收集它们时,我抑制了日期值。我猜现在它们是纯时间数据。。。如果是这样,我将如何进行?当我尝试应用您的解决方案时,它抛出无效的“trim”参数。请输入数据。请将png中的信息添加到您提出的问题中。dput的图片不允许用户将信息输入到他们的R会话中。简单地问这个问题,然后我们可以进一步帮助你。如果我想有一个不同的间隔,我只需要改变=30分钟?是的。我的目标是使用seq和/或cut-date-time方法的能力的代码,这些方法提供了额外的灵活性。我不太明白如何避免产生一个空的休息时间间隔,但我认为这种灵活性值得增加风险。round和trunc没有量化分钟或小时的选项,至少在我阅读他们的帮助页面时是这样。非常好@BondedDust。精确而简洁!如果我希望有一个不同的时间间隔,我只需要将时间更改为30分钟?没错。我的目标是使用seq和/或cut-date-time方法的能力的代码,这些方法提供了额外的灵活性。我不太明白如何避免产生一个空的休息时间间隔,但我认为这种灵活性值得增加风险。round和trunc没有量化分钟或小时的选项,至少在我阅读他们的帮助页面时是这样。非常好@BondedDust。精确而简洁!