[英]Best way to plot by hour by day by month in r
目前,我已經在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中的一個額外的列/索引,它允許我連續繪制值。 然后,我每月單獨繪制它們。
我認為這是您在編輯中要求的部分解決方案(如果我正確地理解了您的任務),但是我相信您可以以相同的方式瀏覽幾個月。 我能想到的唯一方法是將日期轉換為日期類。 我使用了一些准備好的日期數據,但是您可以使用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
}
希望對您有所幫助。
PS:這是我寫的第一個答案,請隨時編輯或改善我的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.