我有早上和下午的日期数据。我想创建一个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?
答案 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")
给出了
当然,您不必在上午/下午为半天着色,但我喜欢它。