代码之家  ›  专栏  ›  技术社区  ›  Soldalma

为什么我不能在ggplot2图表上获得正确的水平轴标签?

  •  0
  • Soldalma  · 技术社区  · 3 年前

    我试图使用geom_line()用ggplot2绘制一个分组数据帧的分面图。我的数据框有一个日期列,我想在水平轴上显示日期。如果我只在aes中使用Date(x=Date,…),我会在水平轴上得到很好的标签。然而,这条线有一个几乎水平的部分,日期从一组的末尾跳到下一组的开头。此代码和图表显示:

    dts <- seq.Date(as.Date("2020-01-01"), as.Date("2021-12-31"), by="day")
    
    mos <- sapply(dts, month)
    
    df <- data.frame(Date=dts, Month=mos)
    
    nr <- nrow(df)
    
    df$X <- rep(1, nr)
    
    df %>%
      group_by(Month) -> dfgrp
    dfgrp %>%
      group_by(Month) %>%
      mutate(Time = Date[1:n()],
             Z = cumsum(X)) %>%
      ggplot(aes(x=Date, y=Z)) +
      geom_line(color="darkgreen", size=0.5) +
      facet_grid(. ~ Month, scale="free_x") +
      theme(axis.text.x = element_text(angle=45, size=7))
    

    Chart using Date on the horizontal axis

    我不希望我的图表在日期大幅变化时出现那些几乎水平的线条。我能够使用aes()上的整数生成一个没有这些行的图表,如下所示:

    dfgrp %>%
      mutate(Time = 1:n() %>% as.integer(),
             Z = cumsum(X)) %>%
      ggplot(aes(x=Time, y=Z)) +
      geom_line(color="darkgreen", size=0.5) +
      facet_grid(. ~ Month, scale="free_x") +
      scale_x_continuous(breaks = seq(from=1, to=nr, by=10) %>% as.integer(),
                         labels = function(x) as.character(dfgrp$Date[x])) +
      theme(axis.text.x = element_text(angle=45, size=7))
    

    图表上的线条看起来像我想要的,但横轴上的日期不正确:它们在每个方面都在2020年2月结束,而数据框中的日期在2021年12月结束,第一张图表中的日期从不同方面的不同月份开始和结束。

    enter image description here

    我尝试了很多方法,但都没有奏效。对于如何制作一个日期如上图第一张所示、线条如上图第二张所示的图表,您有什么建议吗?

    我们将非常感谢您的帮助。

    1 回复  |  直到 3 年前
        1
  •  0
  •   Jon Spring    3 年前

    您可能希望将日期调整为同一年,但请注意将原始年份作为变量:

    library(lubridate)
    dfgrp %>%
      group_by(Month) %>%
      mutate(year = year(Date),
             adj_date = ymd(paste(2020, month(Date), day(Date)))) %>%
             # 2020 was leap year so 2/29 won't be lost
      mutate(Time = Date[1:n()],
             Z = cumsum(X)) %>% 
      ggplot(aes(x=adj_date, y=Z, color = year, group = year)) +
      geom_line(size=0.5) +
      facet_grid(. ~ Month, scale="free_x") +
      theme(axis.text.x = element_text(angle=45, size=7))
    

    enter image description here