[英]Ordering Week numbers as factors in moving time periods
我有一個很好的小圖,可以隨時間跟蹤數據。 數據涵蓋過去12周的滾動數據,每天收集一次,按周分組,每周輸出一次。 直到一年的變化將我的因子(周)排除在外,並開始在2018年第43周之前開始繪制2019年第1周,它才能正常工作。隨着訂單在新的一年內變化,我如何自動實現因子水平? 我可以手動調整因子水平,直到第12周,但這似乎是一個創可貼。 這是我試圖在沒有人工干預的情況下實現的輸出。
data <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L,
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L,
8L), .Label = c("58", "66", "68", "77", "79", "80", "84", "98"
), class = "factor"), Year = c(2019, 2019, 2019, 2018, 2018,
2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018,
2018, 2019, 2019, 2019, 2018, 2018, 2018, 2018, 2018, 2018, 2018,
2018, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2018, 2018, 2018,
2018, 2018, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2018, 2018,
2018, 2018, 2018, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2018,
2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018,
2018, 2018), Week = c(1L, 2L, 3L, 43L, 44L, 45L, 46L, 47L, 48L,
49L, 50L, 51L, 43L, 44L, 45L, 46L, 47L, 1L, 2L, 3L, 46L, 47L,
48L, 49L, 50L, 51L, 44L, 45L, 46L, 47L, 48L, 49L, 1L, 2L, 3L,
43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 1L, 2L, 3L, 43L,
44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 1L, 2L, 3L, 43L, 44L,
45L, 46L, 47L, 48L, 49L, 50L, 51L, 43L, 44L, 45L, 46L, 47L),
Output = c(49.9, 67.42, 31.27, 65.8925, 79.2925, 103.47,
120.1125, 122.645, 109.3925, 91.3125, 81.06, 78.38, 119.13,
93.71, 149.74, 122.8775, 117.1075, 32.81, 29.49, 16.71, 42.8725,
60.6425, 71.2, 86.155, 78.6225, 81.605, 73.51, 84.42, 105.4,
74.515, 57.825, 42.8475, 11.26, 44.34, 22.83, 41.695, 75.77,
80.785, 118.175, 131.2875, 124.2375, 124.905, 85.7275, 61.7525,
188.23, 108.42, 42.42, 111.41, 79.8825, 70.4075, 72.695,
61.235, 58.7825, 47.9275, 46.5275, 48.1775, 11.09, 10.13,
0, 21.3375, 30.1275, 32.97, 53.51, 51.09, 40.385, 35.9025,
23.44, 21.1125, 111.94, 102.76, 105.71, 112.36, 115.7875)), class = "data.frame", row.names = c(NA,
-73L))
ggplot(data,
aes(factor(Week,
levels = c(43, 44, 45, 46, 47, 48, 49, 50, 51, 1, 2, 3)),
Output)) +
geom_line(size = 1.5,
aes(colour = ID,
group = ID)) +
geom_point(aes(y = Output,
colour = ID),
size = 4,
shape = 21,
fill = "black",
stroke = 2) +
labs(x = "Week Number",
y = "output") +
scale_y_continuous(breaks = pretty_breaks(n = 20),
limits = c(0, NA))
對於基數R,請考慮創建一個日期列,其中涉及格式化年份,然后在轉換后的日期中添加相應的星期。 從那里開始,將scale_x_date()
格式化為周號:
data$Date <- with(data, as.Date(paste0(Year, "-01-01"), format="%Y-%m-%d", origin="1970-01-01") +
as.difftime(Week, unit="weeks")
)
head(data)
# ID Year Week Output Date
# 1 58 2019 1 49.9000 2019-01-08
# 2 58 2019 2 67.4200 2019-01-15
# 3 58 2019 3 31.2700 2019-01-22
# 4 58 2018 43 65.8925 2018-10-29
# 5 58 2018 44 79.2925 2018-11-05
# 6 58 2018 45 103.4700 2018-11-12
ggplot(data,
aes(Date,
Output)) +
geom_line(size = 1.5,
aes(colour = ID,
group = ID)) +
geom_point(aes(y = Output,
colour = ID),
size = 4,
shape = 21,
fill = "black",
stroke = 2) +
labs(x = "Week Number",
y = "output") +
scale_y_continuous(breaks = pretty_breaks(n = 20),
limits = c(0, NA)) +
scale_x_date(breaks = pretty_breaks(n = 20),
labels = date_format("%W"))
根據我的評論,我將周/年的組合更改為日期,創建了繪圖,然后將x軸格式化為一周:
library(tidyverse)
library(lubridate)
data %>%
mutate(date = dmy(paste0("0101", Year)) + days(7*(Week)),
date = floor_date(date, "weeks", week_start = 1)) %>% # spoof week/year into date
ggplot(aes(date, Output)) +
geom_line(size = 1.5,
aes(colour = ID,
group = ID)) +
geom_point(aes(y = Output,
colour = ID),
size = 4,
shape = 21,
fill = "black",
stroke = 2) +
labs(x = "Week Number",
y = "output") %>%
scale_x_date(date_breaks = "weeks", date_labels = "%W")
希望您有原始日期,而不必花很多時間把星期幾放回日期,因為這有點混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.