2015-07-20 61 views
1

我是R编程的新手,并试图学习一些基本绘图。我有几个问题如何绘制两列“时间”,即数据帧的开始时间和结束时间R

我的数据帧看起来像这样

EVENT_TYPE DATE   TIME_START TIME_END 
event A  9/18/2014  14:47:01  16:53:07 
event B  9/18/2014  15:52:16  17:08:30 
event A  9/18/2014  16:26:19  16:53:58 
event C  9/20/2014  19:25:51  19:25:51 
event B  9/23/2014  3:40:39  4:38:07 
event D  9/25/2014  8:15:40  8:59:40 

疑问句1.我想数据绘制从2014年9月18日至2014年9月23日。我如何选择R中的DATE范围?

QUES 2.我想用“TIME_START”和“TIME_END”绘制EVENT_TYPE关于x轴的y轴和日期(或一个月列)绘制在曲线图,这样我可以看看事件之间的比较。

我搜索了这样的问题,但没有得到任何答案。

任何形式的帮助都非常感谢。请帮我在学习R.

+0

你只是想为EVENT_TYPE值的话就在同一水平在绘图区域行进呢? –

+0

我想在Y轴和日期范围(9/18/2014至9/23/2014)上显示事件A,事件B,事件C,事件D,2014年9月18日,2014年9月19日,9/20/2014,9/21/2014,9/22/2014,9/23/2014在X轴上。例如,我想说明事件A在2014年9月18日14:47开始,于16:53结束。 – Amrut

+0

请注意,如果您将这些全部绘制在一个绘图上,则您的线条看起来非常细,因为每个事件只有1或2个小时,但是您的x轴跨越多个*天*。 –

回答

2

首先转换您的开始和结束时间,以日期时间在R:

x <- transform(x, 
       start=as.POSIXct(paste(DATE, TIME_START), format='%m/%d/%Y %H:%M:%S'), 
       end=as.POSIXct(paste(DATE, TIME_END), format='%m/%d/%Y %H:%M:%S')) 

那么你可以使用ggplot并绘制一个矩形的时间轴上每一个事件:

  • x轴为datetime
  • 从开始绘制一个矩形,以每个事件
  • 自定义的原因的端3210和yend使得两个重叠的 相同类型的事件(例如, 2014年9月18日的两次事件A)在视觉上彼此分离出现 。 (我想你可以用geom_bar()position="jitter"做类似的事情,但我不知道如何)。
  • 订购y的原因仅仅是在Y轴上将类似的事件组合在一起,如果您不希望它只是使用1:nrow(x)而不是y
  • scale_y_discrete(breaks=NULL)只是为了抑制y值。您可以根据需要自定义它们。

,并提供:

library(ggplot2) 
ggplot(transform(x, y=order(EVENT_TYPE, start)), 
     aes(x=start, xend=end, y=y, yend=y, col=EVENT_TYPE)) + 
    geom_segment(size=3) + 
    scale_y_discrete(breaks=NULL) 

enter image description here

如前所述,因为你的X轴是非常大的(跨多天),每个事件只持续1-2个小时,你可以勉强看到了吧为每个事件。您将不得不考虑如何合理地显示数据,但这不是问题的关键。举个例子,如果你只是看前3个事件,它是更清楚:

x2 <- x[1:3,] 
ggplot(transform(x2, y=order(EVENT_TYPE, start)), 
     aes(x=start, xend=end, y=y, yend=y, col=EVENT_TYPE)) + 
    geom_segment(size=3) + 
    scale_y_discrete(breaks=NULL) 

enter image description here

+0

非常感谢。最后一个问题。如果我想给日期范围,我的意思是说我想要在2015年5月1日至2015年6月1日之间绘制两个数据之间的数据,那么我如何在R中使用它? 在SQL中,我这样做,就像 其中x BETWEEN TO_DATE('2015-05-01','yyyy/mm/dd') 和TO_DATE('2015-06-01','yyyy/mm/dd') ; – Amrut

+0

您可以在绘图之前对数据框进行分类,例如'subset(x,start> = as.POSIXct('2015-05-01 00:00:00')&end <= as.POSIXct('2015-06-01 23:59:59'))',或者简单地限制你的x轴,当你绘制例如将'+ scale_x_datetime(limits = c(as.POSIXct(...),as.POSIXct(...)))'添加到'ggplot'中。 –

+0

非常感谢您提供的信息。它为我工作。但是现在我面临另一个问题......我无法在Y轴上看到时间间隔,也无法正确标记y轴。它在y轴上仅显示为“Y”。 我的数据集中有2014年至2015年的1000多条记录。我试图绘制这些。 – Amrut

相关问题