I wonder if there is a function to plot ts object directly with ggplot2. In past, I was using the following strategy but now it is throwing an error.
set.seed(12345)
dat <- ts(data=runif(n=10, min=50, max=100), frequency = 4, start = c(1959, 2))
df <- data.frame(date=as.Date(time(dat)), Y=as.matrix(dat))
library(ggplot2)
ggplot(data=df, mapping=aes(x=date, y=Y))+geom_point()
Error
Error in as.Date.default(time(dat)) :
do not know how to convert 'time(dat)' to class “Date”
How can I directly plot ts object with ggplot2.
Try this:
library(zoo)
library(ggplot2)
library(scales)
autoplot(as.zoo(dat), geom = "point")
or maybe:
autoplot(as.zoo(dat), geom = "point") + scale_x_yearqtr()
See ?autoplot.zoo for more info.
Note: The code in the question works if you issue the command library(zoo) first.
Updates Added second solution, library(scales) and switched from yearmon to yearqtr.
Don't know why it worked before (since it would not seem to be valid under my understanding of Date functins) but you can fix it with the use of zoo::as.yearqtr
library(zoo)
?as.yearqtr
set.seed(12345)
dat <- ts(data=runif(n=10, min=50, max=100), frequency = 4, start = c(1959, 2))
df <- data.frame(date=as.Date(as.yearqtr(time(dat))), Y=as.matrix(dat))
library(ggplot2)
ggplot(data=df, mapping=aes(x=date, y=Y))+geom_point()
# No errors. The plot has YYYY-MM labeling as expected for a ggplot2-Date axis.
This code works for me
set.seed(12345)
dat <- ts(data=runif(n=10, min=50, max=100), frequency = 4, start = c(1959, 2))
library(ggfortify)
autoplot(dat, geom = "point", ts.colour = ('dodgerblue3')) #Option 1
library(zoo)
autoplot.zoo(as.zoo(dat), geom = "point") #Option 2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With