目前,我已经在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中的额外列/索引,它允许我连续绘制值。然后我每月分别绘制它们。
答案 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。这是我写的第一个答案,请随时编辑或改善我的答案。