在R中按小时逐日绘制的最佳方法

时间:2018-06-26 09:35:48

标签: html r visualization

目前,我已经在R中创建了以下数据框,但是我的可视化遇到了麻烦。

数据框如下:

date   weekday   dayhour    amount
2017-06    0         1         100
2017-06    0         2         200
2017-06    0         3         150
2017-06    0         4         600
2017-06    0         5         75
....
2018-06    6         21        60
2018-06    6         22        90
2018-06    6         23        150
2018-06    6         24        110

金额是该月该工作日按小时的平均值。因此,例如,2017年6月在6月中每个星期一的第一个小时的平均金额为100。

现在的想法是将我的数据绘制在R中的几个图中,这些图将按小时按小时显示给定月份的数据。因此,有12个图,每个图的y轴为数量,小时+工作日为x轴。

我尝试了几种方法,例如循环浏览月份并使用par(mfrow = c(2,6))进行绘制。我也尝试一一画出它们。但是,我仍然是R的新秀,我找不到有关如何执行此操作的任何好的文档或教程。现在,我只能在工作日(而不是小时)内按一个循环堆叠数据点,方法是在不包括小时数的情况下对数据集执行以下操作:

increase = 7
for (i in (length(occupancy_by_day)/7)) {
  data = head(occupancy_by_day,increase:increase+increase)
  plot(average_occupancy ~ Weekday, data=data)
  increase = increase + 7
}

我目前最接近正确答案的猜测是这样的:

par(mfrow = c(2,6))

increase = 06
for (i in (length(occupancy_by_day)/30,5)) {
  data = occupancy_by_day[occupancy_by_day$date == paste(c('2017-',increase)), ]
  plot(amount ~ weekday, data=data)
  increase = increase + 1
}

这给了我错误:

Error in plot.window(...) : need finite 'xlim' values

有人知道在R中绘制数据的好方法吗?

在此先感谢您的帮助/评论!

编辑: 此帖子的优先事项是如何按工作日小时按小时绘制数据。我可以手动迭代几个月,但是仍然需要绘制它们。每个月的循环将增加奖金。现在,我有以下内容:

data =occupancy_by_day[occupancy_by_day$date == '2017-06', ]
plot(Amount ~ weekday+dayhour, data=data)

可悲的是,这仅按白天绘制数据。

添加的概念图: https://imgur.com/qKFbbmJ

答案:

最终,我做了一个小尝试,用以下方法绘制它们:

ggplot(data = data[data$date == '2017-12', ], aes(plotstamp, Amount, group=Weekday, col=Weekday)) + 
   geom_line() +
   geom_point() + 
   ggtitle("December 2017")

plotstamp是我添加到DF中的额外列/索引,它允许我连续绘制值。然后我每月分别绘制它们。

1 个答案:

答案 0 :(得分:0)

进行类似的数据

我认为这是您在编辑中要求的部分解决方案(如果我正确理解了您的任务),但是我相信您可以以相同的方式浏览数月。 我能想到的唯一方法是将日期转换为日期类。我使用了一些准备好的日期数据,但是您可以使用strptime()paste()命令来匹配我的数据。而且,我所做的数据只有两天。

date1 <- c(rep("2017-06-1",24),rep("2017-06-2",24))
weekday <- c(rep(0,24),rep(1,24))
dayhour <- c(1:24,1:24)
# Add dayhour to date
date <- paste(date1, dayhour, sep = " ")
date <- strptime(date, "%Y-%m-%d %H")
amount <- c(1:24,(48:25)*2)

dat <- data.frame(date,weekday,dayhour,amount)
View(dat)

plot(x=dat$date, y=dat$amount)

这就是我创建的数据的样子。

                 date weekday dayhour amount
1 2017-06-01 01:00:00       0       1      1
2 2017-06-01 02:00:00       0       2      2
3 2017-06-01 03:00:00       0       3      3
4 2017-06-01 04:00:00       0       4      4
....
46 2017-06-02 22:00:00       1      22     54
47 2017-06-02 23:00:00       1      23     52
48 2017-06-03 00:00:00       1      24     50

为情节圈。

如果您在R markdown文档中编写此代码,则每个图都会得到漂亮的页面,因此您不必使用par(mfrow = c(1,2))。您可能还需要修复循环参数以适合您的数据。

par(mfrow = c(1,2))
start <- 0
end <- 23
step = 1
for (i in 1:(length(dat$date)/24)) {
  data <- dat[(start+step) : (end+step), ]  # The parenteses at (start+step) and (end+step) are important!
  plot(x = data$date, y = data$amount)
  step = step + 23
}

希望对您有帮助。

P.S。这是我写的第一个答案,请随时编辑或改善我的答案。