Прямо нарисовать объект ts с помощью ggplot2

Интересно, если есть функция для построения ts объекта непосредственно ggplot2. Раньше я использовал следующую стратегию, но теперь она выдает ошибку.

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 in as.Date.default(time(dat)) : 
  do not know how to convert 'time(dat)' to class "Date"

Как я могу непосредственно построить ts объект с ggplot2.

Ответ 1

Попробуйте следующее:

library(zoo)
library(ggplot2)
library(scales)

autoplot(as.zoo(dat), geom = "point")

или возможно:

autoplot(as.zoo(dat), geom = "point") + scale_x_yearqtr()

Подробнее см. ?autoplot.zoo.

Примечание.. Кстати, код в вопросе работает, если вы сначала выполните команду library(zoo).

Обновления Добавлено второе решение, library(scales) и переключено с yearmon на yearqtr.

Ответ 2

Не знаю, почему это сработало раньше (так как это не показалось бы действительным при моем понимании функционалов Date), но вы можете исправить его с помощью 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.

Ответ 3

Этот код работает для меня

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