如何在时间序列图中使用 geom_bar stat="identity" 设置 Bin Width?
Posted
技术标签:
【中文标题】如何在时间序列图中使用 geom_bar stat="identity" 设置 Bin Width?【英文标题】:How to set Bin Width With geom_bar stat="identity" in a time Series plot? 【发布时间】:2015-08-31 16:46:10 【问题描述】:我想使用条形图绘制时间序列,并将 Bin Width 设置为 0.9。然而,我似乎无法做到这一点。我四处寻找,但到目前为止找不到任何有用的东西。如果 stat="identity ,这是一个限制吗?
这是一个示例数据和图表。 干杯!
time <- c('2015-06-08 00:59:00','2015-06-08 02:48:00','2015-06-08 06:43:00','2015-06-08 08:59:00','2015-06-08 10:59:00','2015-06-08 12:59:00','2015-06-08 14:58:00','2015-06-08 16:58:00','2015-06-08 18:59:00','2015-06-08 20:59:00','2015-06-08 22:57:00','2015-06-09 00:59:00','2015-06-09 01:57:00','2015-06-09 03:22:00','2015-06-09 06:14:00','2015-06-09 08:59:00','2015-06-09 10:59:00','2015-06-09 12:59:00','2015-06-09 14:59:00','2015-06-09 16:59:00','2015-06-09 18:59:00','2015-06-09 20:59:00','2015-06-09 22:58:00','2015-06-10 00:57:00','2015-06-10 02:34:00','2015-06-10 04:45:00','2015-06-10 06:24:00','2015-06-10 08:59:00','2015-06-10 10:59:00','2015-06-10 12:59:00','2015-06-10 14:59:00','2015-06-10 16:59:00','2015-06-10 18:59:00','2015-06-10 20:58:00','2015-06-10 22:52:00','2015-06-11 00:59:00','2015-06-11 02:59:00','2015-06-11 04:59:00','2015-06-11 06:59:00','2015-06-11 08:59:00','2015-06-11 10:59:00','2015-06-11 12:59:00','2015-06-11 14:59:00','2015-06-11 16:58:00','2015-06-11 18:58:00','2015-06-11 20:56:00','2015-06-11 21:49:00','2015-06-12 00:59:00','2015-06-12 02:59:00','2015-06-12 04:20:00','2015-06-12 08:55:00','2015-06-12 10:55:00','2015-06-12 12:59:00','2015-06-12 14:59:00','2015-06-12 16:59:00','2015-06-12 18:59:00','2015-06-12 20:55:00','2015-06-12 22:50:00','2015-06-13 00:16:00','2015-06-13 12:59:00','2015-06-13 14:35:00','2015-06-13 16:56:00','2015-06-13 18:59:00','2015-06-13 20:59:00','2015-06-13 22:44:00','2015-06-13 23:19:00','2015-06-14 08:53:00','2015-06-14 10:14:00','2015-06-14 12:59:00','2015-06-14 14:59:00','2015-06-14 16:56:00','2015-06-14 18:58:00','2015-06-14 20:57:00','2015-06-14 22:31:00','2015-06-14 23:59:00')
count <- c(59,63,9,13,91,80,97,210,174,172,167,74,43,18,18,29,136,157,126,170,188,135,207,216,163,163,126,111,172,213,209,265,203,205,195,201,171,157,153,176,187,252,227,223,171,162,146,161,136,124,155,239,233,157,158,125,138,45,45,1,2,6,6,46,48,4,1,1,12,56,65,122,81,110,42)
level <- c('low','low','low','low','low','low','low','high','normal','normal','normal','low','low','low','low','low','low','normal','low','normal','normal','low','high','high','normal','normal','low','low','normal','high','high','high','high','high','normal','high','normal','normal','normal','normal','normal','high','high','high','normal','normal','low','normal','low','low','normal','high','high','normal','normal','low','low','low','low','low','low','low','low','low','low','low','low','low','low','low','low','low','low','low','low')
DF = data.frame(time, count, level)
DF$time = as.POSIXct(DF$time)
ggplot(DF, aes(x=time, y=count, fill=level), width=0.9) +
geom_bar(stat="identity") +
scale_x_datetime(labels = date_format("%D"), breaks = date_breaks("day")) +
xlab("myXlabel") +
ylab("myYlabel") +
ggtitle("myTitle")
【问题讨论】:
当您说要设置bin宽度时,您的意思是要调整条的宽度(水平尺寸)吗? @tegancp,是的,这正是我想要的! 【参考方案1】:如果您想要实现的是扩大情节中的条形,ggplot 似乎不支持geom_bar
。但是,使用geom_rect
实现条形图非常简单。
由于许多数据点似乎相隔大约两个小时,我在这里假设您想要达到的 0.9 宽度是给定时间两侧的 0.9 小时(因此基本上消除了酒吧。
如果这是你想要的,下面的代码应该可以工作:
library(lubridate)
ggplot(DF, aes(xmin=time-minutes(54), xmax=time+minutes(54), ymin=0, ymax=count,
fill=level)) +
geom_rect(color="#666666")
【讨论】:
奇怪的是geom_bar不支持width选项,我确定有办法...【参考方案2】:找到了!实际上,宽度是受支持的,尽管比例以秒为单位,因为我正在绘制一个时间序列,其中 X 轴被格式化为 POSIX 日期。因此,width=0.9 意味着 bin 宽度为 0.9 秒。因为我的垃圾箱是每个 2 小时,所以“1”的宽度实际上是 7200。所以这是有效的代码。
ggplot(DF, aes(x=time, y=count, width=6000, fill=level)) +
geom_bar(stat="identity", position="identity", color="grey") +
scale_x_datetime(labels = date_format("%D"), breaks = date_breaks("day")) +
xlab("myXlabel") +
ylab("myYlabel") +
ggtitle("myTitle")
结果如下。条形图中有一些平均重叠,我只需要对我的数据进行比对,比如下一个小时。
【讨论】:
以上是关于如何在时间序列图中使用 geom_bar stat="identity" 设置 Bin Width?的主要内容,如果未能解决你的问题,请参考以下文章
使用 geom_bar 和 stat="identity" 在均值处绘制 hline