簡體   English   中英

ggplot2時間段對比

[英]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)

刻面ggplot2

代替dplyr::bind_rows ,也可以使用data.table::rbindlist(..., idcol="id")do.call(rbind, ...) ,盡管使用后者你需要分配id外部。

還有一點需要注意:x 軸的默認格式會掩蓋數據的“年份”。 如果這是相關/重要的(並且在其他地方不明顯),則使用ggplot2的強制標簽的正常機制,例如,

... +
  scale_x_date(labels = function(z) format(z, "%Y-%m"))

帶有更新的 x 軸標簽的多面 ggplot2

雖然在沒有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:

在此處輸入圖像描述

如果要將 x 軸保持為數字刻度,可以執行以下操作:

ggplot(df1, aes((week + 9) %% 52, sells)) +
  geom_line(aes(color="Period 18/19")) + 
  geom_line(data=df2, aes(color="Period 19/20")) +
  scale_x_continuous(breaks = 1:52,
                     labels = function(x) ifelse(x == 9, 52, (x - 9) %% 52), 
                     name = "week") +
  labs(color="Legend text")

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM