R:如何将一天分成半天

时间:2014-07-25 20:43:17

标签: r

我有早上和下午的日期数据。我想创建一个geom_bar,将日期分为AM和PM。现在我的函数有geom_bar重叠。我的图形功能如下所示:

ggplot(DF, aes(x = DATE, y = value)) + geom_bar(position = "dodge", stat = "identity") +
  + scale_fill_manual(values=unique(DF$DATE))

DF还有属性dt(代表日期时间),它具有年,月,日,小时,分钟,秒。

DATE只是该日期的年 - 月 - 日部分。

如果我将x = dt放在aes而不是x = DATE中,我会得到非常瘦的geom_bars。我怎样才能将x_axis分成半天而dt分为半天,以便我有两个跨越每个日期的大型geom_bars?

1 个答案:

答案 0 :(得分:0)

以下是我根据您的描述编写的一些示例数据

DF<-data.frame(
    dt=as.POSIXct(runif(500,as.numeric(as.POSIXct("2012-01-01")),
        as.POSIXct(as.Date("2012-01-31"))), 
        origin="1970-01-01", tz="GMT"),
    value = rnorm(500, 100, 6)
)
DF<-transform(DF, DATE=as.Date(dt))

现在,为了获得半天的价值,我实际上只会对这些值进行一些伪装,因为它们自哨兵日期以秒的形式存储起来。

DF<-transform(DF, HALFDAY=dt -(as.numeric(dt) %% (60*60*12)))
DF<-transform(DF, PART=ifelse(as.numeric(HALFDAY) %% (60*60*24) > 0,"PM","AM"))

基本上我只是将每个日期/时间截断为12小时。在GMT时间内进行这些转换很重要,这样您就不必担心当地的时间变化。同样使用DATE执行position=dodge会很糟糕,因为你并没有真正按任何方式进行分组。这只是绘制彼此前面的值,如果你有一天的多次观察,这可能不是你想要的。你真的想要堆叠它们。以下是此数据的三个不同图

ggplot(DF, aes(x = dt, y = value)) + 
    geom_bar(position="dodge", stat = "identity", width=60*60*2) +
    ggtitle("dt")

ggplot(DF, aes(x = DATE, y = value)) + 
    geom_bar(position="stack", stat = "identity") +
    ggtitle("DATE")

ggplot(DF, aes(x = HALFDAY, y = value, fill=PART)) + 
    geom_bar(position="stack", stat = "identity") +
    ggtitle("HALFDAY")

给出了

enter image description here

当然,您不必在上午/下午为半天着色,但我喜欢它。