Using geom_rect for time series shading in R

后端 未结 4 1926
粉色の甜心
粉色の甜心 2020-12-02 23:45

I am trying to shade a certain section of a time series plot (a bit like recession shading - similarly to the graph at the bottom of this article on recession shading in exc

相关标签:
4条回答
  • 2020-12-03 00:19

    To use geom_rect you need to define your rectangle coordinate through a data.frame:

    shade = data.frame(x1=c(1918,1930), x2=c(1921,1932), y1=c(-3,-3), y2=c(4,4))
    
    #    x1   x2 y1 y2
    #1 1918 1921 -3  4
    #2 1930 1932 -3  4
    

    Then you give ggplot your data and the shade data.frame:

    ggplot() + 
      geom_line(aes(x=month, y=big), color='red',data=a_series_df)+
      geom_rect(data=shade, 
                mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2), color='grey', alpha=0.2)
    

    enter image description here

    0 讨论(0)
  • 2020-12-03 00:22
    library(xts)
    library(zoo)
    library(ggts)
    

    Creating an xts object

    data<-as.xts(x=runif(228,20,40),order.by = seq(as.Date("2000/01/01"), by = "month", length.out = 228))
    

    Creating data frame of dates for which you want to crate shades

    date<-data.frame(as.Date("2008-01-01"),as.Date("2009-01-01"))
    

    Now create plot with shaded area

    plot_data<-ggts(data)+geom_cycle(date)
    
    0 讨论(0)
  • 2020-12-03 00:25

    Its a bit easier using annotate and also note that the bounds for the rectange can be specified as shown:

    ggplot(a_series_df, aes(month, big)) + 
        geom_line() +
        annotate("rect", fill = "red", alpha = 0.5, 
            xmin = 1924, xmax = 1928 + 11/12,
            ymin = -Inf, ymax = Inf) +
        xlab("time")
    

    This would also work:

    library(zoo)
    
    z <- read.zoo(a_series_df, index = 2)
    autoplot(z) + 
        annotate("rect", fill = "red", alpha = 0.5, 
            xmin = 1924, xmax = 1928 + 11/12,
            ymin = -Inf, ymax = Inf) + 
        xlab("time") +
        ylab("big")
    

    Either one gives this:

    enter image description here

    0 讨论(0)
  • 2020-12-03 00:26

    Code works fine, conversion to decimal date is needed for xmin and xmax, see below, requires lubridate package.

    library("lubridate")
    library("ggplot2")
    
    ggplot(a_series_df)+
      geom_line(mapping = aes_string(x = "month", y = "big")) +
      geom_rect(
        fill = "red", alpha = 0.5, 
        mapping = aes_string(x = "month", y = "big"), 
        xmin = decimal_date(as.Date(c("1924-01-01"))),
        xmax = decimal_date(as.Date(c("1928-12-31"))),
        ymin = 0,
        ymax = 2
      )
    

    Cleaner version, shading plotted first so the line colour doesn't change.

    ggplot() +
      geom_rect(data = data.frame(xmin = decimal_date(as.Date(c("1924-01-01"))),
                                  xmax = decimal_date(as.Date(c("1928-12-31"))),
                                  ymin = -Inf,
                                  ymax = Inf),
                aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax),
                fill = "grey", alpha = 0.5) +
      geom_line(data = a_series_df,aes(month, big), colour = "blue") +
      theme_classic()
    

    enter image description here

    0 讨论(0)
提交回复
热议问题