Search code examples
rggplot2xts

Turning a Standard XTS Object Into a Seasonal Plot


The package fpp2 has a wonderful function ggseaonplot(). I would like to make use of it by turning my xts object into a matrix where "Years" are the row names and the 12 months are the columns names.

#here is the data. This is stock data from yahoo finance
library(quantmod)
getSymbols("SPY")
adjusted = Ad(SPY)
head(adjusted)

enter image description here

#here is an example of what I would like the data to look like using the  
AirPassengers matrix.
dput(AirPassengers)
structure(c(112, 118, 132, 129, 121, 135, 148, 148, 136, 119, 
104, 118, 115, 126, 141, 135, 125, 149, 170, 170, 158, 133, 114, 
140, 145, 150, 178, 163, 172, 178, 199, 199, 184, 162, 146, 166, 
171, 180, 193, 181, 183, 218, 230, 242, 209, 191, 172, 194, 196, 
196, 236, 235, 229, 243, 264, 272, 237, 211, 180, 201, 204, 188, 
235, 227, 234, 264, 302, 293, 259, 229, 203, 229, 242, 233, 267, 
269, 270, 315, 364, 347, 312, 274, 237, 278, 284, 277, 317, 313, 
318, 374, 413, 405, 355, 306, 271, 306, 315, 301, 356, 348, 355, 
422, 465, 467, 404, 347, 305, 336, 340, 318, 362, 348, 363, 435, 
491, 505, 404, 359, 310, 337, 360, 342, 406, 396, 420, 472, 548, 
559, 463, 407, 362, 405, 417, 391, 419, 461, 472, 535, 622, 606, 
508, 461, 390, 432), .Tsp = c(1949, 1960.91666666667, 12), class = "ts")

enter image description here

Here is what the final project should look similar to.

library(fpp2)
ggseasonplot(AirPassengers)

enter image description here


Solution

  • class(adjusted) 
    #[1] "xts" "zoo"
    

    adjusted is of type xts but ggseasonplot needs object of type ts.

    Here is an alternative with ggplot2 though

    Prepare the data

    library(zoo)
    df <- data.frame(date = index(adjusted),value = coredata(adjusted),row.names = NULL)
    df$month <- factor(format(df$date, "%b"), levels = month.abb)
    df$year <- format(df$date, "%Y")
    

    Plot the data

    library(ggplot2)
    
    ggplot(df) +
       aes(month, SPY.Adjusted, group = year, color = year) + 
       geom_line()
    

    enter image description here