Использование seq.Date в качестве перерывов в stat_bin для временных рядов - PullRequest
5 голосов
/ 27 июля 2010

Я пытаюсь связать данные временных рядов за несколько лет наблюдения по месяцам, используя функцию stat_bin в ggplot2.Код выглядит следующим образом:

month.breaks<-seq.Date(from=min(afg$DateOccurred),to=max(afg$DateOccurred),by="month")  # All months, for breaks
report.region<-ggplot(afg,aes(x=DateOccurred))+stat_bin(aes(y=..density..,fill=Type),breaks=month.breaks)+facet_wrap(~Region)
print(report.region)

Однако, когда я запускаю печать, я получаю следующую ошибку:

Error in `+.Date`(left, right) : binary + is not defined for Date objects

Если я правильно читаю, оператор плюс не определендля Date объектов и, следовательно, невозможно выполнить этот тип биннинга?

Ответы [ 3 ]

3 голосов
/ 01 января 2014

Когда я получил эту ошибку от ggplot2 в других обстоятельствах, я смог избежать использования as.numeric () в последовательности, которую я использую для перерывов.Например,

library(lubridate)
library(ggplot2)
library(scales)

somedates <- ymd(20130101) + ddays(runif(100, 0, 364)) #generate some fake event dates
somedatesformatted <- data.frame(Dates=as.Date(somedates)) #format them as data ggplot likes
monthbins <- as.numeric(seq(as.Date('2013-01-01'), as.Date('2014-01-01'), '1 month')) # generate breaks for binning event dates and wrap in as.numeric()

ggplot(somedatesformatted, aes(x=Dates)) + 
    stat_bin(breaks=monthbins) +
    ylab("Events per Month") +
    ylim(c(0,30)) +
    scale_x_date(breaks = '1 month',
             labels = date_format("%b"),
             limits = c(as.Date('2013-01-01'), as.Date('2013-12-31')))
1 голос
/ 27 июля 2010

Я могу воспроизвести вашу ошибку следующим образом:

> break.dates <- seq.Date(from=as.Date('2001-01-01'),
                          to=as.Date('2001-04-01'),
                          by="month") 
> break.dates
[1] "2001-01-01" "2001-02-01" "2001-03-01" "2001-04-01"
## add an offset, which increases the dates by a day
> break.dates + 1
[1] "2001-01-02" "2001-02-02" "2001-03-02" "2001-04-02"
## try to add two date objects together - this does not make sense!
> break.dates + break.dates
Error in `+.Date`(break.dates, break.dates) :
  binary + is not defined for Date objects

Нет смысла добавлять две даты вместе, поскольку в шкале даты нет естественного «нуля». Однако оператор + определен для Date объектов в ситуациях, где это имеет смысл.

1 голос
/ 27 июля 2010

Мне кажется, вы можете получить тот же результат, если сначала просто преобразуете данные, , а затем передаете их в метод построения.

Например (данные временных рядов в месяцах с разбивкой по годам):

data(AirPassengers)   # time series in months (supplied w/ default R install)
AP = AirPassengers
library(xts)
X = as.xts(AP)      # need xts object to pass to xts binning method
ndx = endpoints(X, on="years")    # binning method requires indices for desired bin freq
X_yr = period.apply(x=X, INDEX=ndx, FUN=sum)   # X_yr is the binned data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...