【问题标题】:ggplot2 comparation of time periodggplot2时间段比较
【发布时间】:2021-03-25 02:43:35
【问题描述】:

我需要可视化并比较两个同样长的销售期的差异。 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")

【问题讨论】:

    标签: r ggplot2 time period


    【解决方案1】:

    试试这个。您可以将您的周变量格式化为一个因素并保持所需的顺序。代码如下:

    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")
    

    输出:

    【讨论】:

    • 谢谢,这很好用。我尝试了类似的东西。我将一周作为 ggplot 中的一个因素,但它没有用。再次感谢您
    【解决方案2】:

    如果要将 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")
    

    【讨论】:

    • 我正在使用您的解决方案,但我注意到一件事。 x 轴显示 0 insted 52。仍然无法找出解决方案。
    【解决方案3】:

    另一种选择是刻面。这需要将两个集合合二为一,同时保留数据源。 (无论如何,这通常是一种更好的处理方式。)

    (我没有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)
    

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

    还有一点需要注意:x 轴的默认格式会遮盖数据的“年份”。如果这是相关/重要的(并且在其他地方不明显),则使用 ggplot2 的正常机制来强制标签,例如,

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

    虽然没有tibble::lst 可用,您不可能做到这一点,但您可以将其替换为list(df1=df1, df2=df2) 或类似名称。

    【讨论】:

    • 是的,我认为这对眼睛最好,并且有最清晰的 x 轴标签。
    • 我同意......而且我知道有时需要直接重叠以查看线条之间的微小垂直差异。尽管在 y 轴限制相同的情况下,宏观差异应该很明显,但我们会稍微失去这个维度。
    • 糟糕,tibble::lst,谢谢。固定/注明。
    • @r2evans 谢谢,您的解决方案在视觉上是最简洁的,但在数据的性质上,客户 =DI 必须在一个图表中使用比较来清楚地看到销售期间的差异
    • 我认为可能是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2011-01-19
    • 2020-12-16
    • 2010-11-06
    相关资源
    最近更新 更多