[英]ggplot2 comparation of time period
我需要可視化並比較兩個同樣長的銷售期的差異。 2018/2019 和 2019/2020。 兩個時期都從第 44 周開始,到次年的第 36 周結束。 如果我創建一個圖表,兩個周期都是連續的並且排列整齊。 如果我只使用周數,則這些值將被排序為連續的,並且圖表沒有意義。 你能想出解決辦法嗎?
謝謝你
數據:
set.seed(1)
df1 <- data.frame(sells = runif(44),
week = c(44:52,1:35),
YW = yearweek(seq(as.Date("2018-11-01"), as.Date("2019-08-31"), by = "1 week")),
period = "18/19")
df2 <- data.frame(sells = runif(44),
week = c(44:52,1:35),
YW = yearweek(seq(as.Date("2019-11-01"), as.Date("2020-08-31"), by = "1 week")),
period = "19/20")
# Yearweek on x axis, when both period are separated
ggplot(df1, aes(YW, sells)) +
geom_line(aes(color="Period 18/19")) +
geom_line(data=df2, aes(color="Period 19/20")) +
labs(color="Legend text")
# week on x axis when weeks are like continuum and not splited by year
ggplot(df1, aes(week, sells)) +
geom_line(aes(color="Period 18/19")) +
geom_line(data=df2, aes(color="Period 19/20")) +
labs(color="Legend text")
另一種選擇是刻面。 這需要將兩個集合合二為一,同時保留數據源。 (無論如何,這通常是一種更好的處理方式。)
(我沒有tstibble
,所以我的YW
只有seq(...)
,沒有yearweek
。它應該翻譯。)
ggplot(dplyr::bind_rows(tibble::lst(df1, df2), .id = "id"), aes(YW, sells)) +
geom_line(aes(color = id)) +
facet_wrap(id ~ ., scales = "free_x", ncol = 1)
代替dplyr::bind_rows
,也可以使用data.table::rbindlist(..., idcol="id")
或do.call(rbind, ...)
,盡管使用后者你需要分配id
外部。
還有一點需要注意:x 軸的默認格式會掩蓋數據的“年份”。 如果這是相關/重要的(並且在其他地方不明顯),則使用ggplot2
的強制標簽的正常機制,例如,
... +
scale_x_date(labels = function(z) format(z, "%Y-%m"))
雖然在沒有tibble::lst
可用的情況下您不太可能做到這一點,但您可以將其替換為list(df1=df1, df2=df2)
或類似的。
嘗試這個。 您可以將您的周變量格式化為一個因素並保持所需的順序。 這里的代碼:
library(ggplot2)
library(tsibble)
#Data
df1$week <- factor(df1$week,levels = unique(df1$week),ordered = T)
df2$week <- factor(df2$week,levels = unique(df2$week),ordered = T)
#Plot
ggplot(df1, aes(week, sells)) +
geom_line(aes(color="Period 18/19",group=1)) +
geom_line(data=df2, aes(color="Period 19/20",group=1)) +
labs(color="Legend text")
Output:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.