Используя ggplot, как автоматически настроить оси X временных рядов? - PullRequest
3 голосов
/ 08 февраля 2010

Есть ли способ построения одномерного временного ряда класса "ts" с использованием ggplot, который автоматически устанавливает ось времени? Я хочу что-то похожее на plot.ts () базовой графики.

Также мне кажется, что самая грубая гранулярность времени - это день. Это правильно? В моей работе мне приходится работать с ежемесячными и квартальными данными, и назначение каждого наблюдения на начало / конец месяца / квартала приведет к неравномерному распределению наблюдений по горизонтали, поскольку месяцы / кварталы имеют неодинаковую длину. Это может иметь больше смысла, но моя аудитория привыкла видеть месяцы / кварталы на регулярной основе.

Я знаю, что могу решить все вышеперечисленное, вручную установив ось х в качестве оси времени или в виде числовой оси со своими собственными метками. Я специально ищу метод, который делает это автоматически, используя информацию о времени в объекте ts.

Ответы [ 4 ]

4 голосов
/ 09 февраля 2010

Моя грубая попытка функции генерировать даты POSIX из объекта ts, предполагая, что периоды - это годы:

tsdates <- function(ts){
  dur<-12%/%frequency(ts)
  years<-trunc(time(ts))
  months<-(cycle(ts)-1)*dur+1
  yr.mn<-as.data.frame(cbind(years,months))
  dt<-apply(yr.mn,1,function(r){paste(r[1],r[2],'01',sep='/')})
  as.POSIXct(dt,tz='UTC')
}

Это можно использовать с ggplot как:

qplot(tsdates(presidents),presidents,geom='line')

Более полное решение должно быть в состоянии выложить несколько временных рядов. Также было бы неплохо иметь возможность автоматически выравнивать точки по времени наблюдения, чтобы мы могли делать такие вещи, как:

qplot(presidents,lag(presidents))
4 голосов
/ 08 февраля 2010

ggplot2 не поддерживает ts-объекты: поддерживаются только даты даты класса и время класса POSIXct. Поэтому вам нужно сначала преобразовать ваши данные в подходящий класс.

Посмотрите на http://had.co.nz/ggplot2/scale_date.html для примеров.

2 голосов
/ 10 февраля 2010

Данные временных рядов из примера? Ts.

gnp <- ts(cumsum(1 + round(rnorm(100), 2)), start = c(1954, 7), frequency = 12)

new.date <- seq(as.Date(paste(c(start(gnp),1), collapse = "/")), by = "month", length.out = length(gnp))

Функция seq может работать с объектами даты. В приведенном выше примере указывается дата начала, указывается ежемесячная частота и указывается продолжительность создания вектора даты.

Надеюсь, это полезно при подготовке данных перед использованием ggplot2 или чего-то еще.

Вы можете объединить приведенный выше пример в data.frame следующим образом:

dat <- data.frame(date=new.date, value=gnp) 

Это можно построить в ggplot так:

ggplot(data=dat) + geom_line(aes(date, gnp))

Всего наилучшего,

Jay

0 голосов
/ 18 августа 2014

Как насчет этого?


код


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()

выход


enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...