2010-07-27 13 views
5

Próbuję oddzielić dane szeregów czasowych od kilku lat obserwacji według miesiąca, używając funkcji stat_bin w ggplot2. Kod wygląda następująco:Używanie seq.Date jako przerwy w stat_bin dla szeregów czasowych

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) 

Kiedy nakładzie jednak, pojawia się następujący błąd:

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

Jeśli czytam to poprawnie, operator Plus nie jest zdefiniowana dla Date obiektów i w związku z tym nie można wykonać tego rodzaju binningu?

+1

Szybki pomysł: przymus przerwy na numeryczne. – hadley

Odpowiedz

1

mogę odtworzyć swój błąd w następujący sposób:

> 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 

To nie ma sensu, aby dodać dwie daty razem, ponieważ nie ma naturalnego "zero" w skali daty. Jednak operator + jest zdefiniowany dla obiektów Date w sytuacjach, w których ma to sens.

+0

Wierzę, że ggplot2 rzuca błąd, ponieważ używam dat jako skali osi X. – DrewConway

1

Wydaje mi się, że możesz uzyskać taki sam wynik, jeśli najpierw przekształcasz dane, , a następnie przekazujesz je do metody wykresu.

Na przykład (dane szeregów czasowych w miesiącach binned przez rok):

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 
+0

Nie jestem pewien, czy to rozwiązanie działa dla mnie; po pierwsze dlatego, że dane mają jedną kolumnę z datą; i po drugie, nie sądzę, że obiekty xts są kompatybilne z ggplot2. – DrewConway

3

Kiedy dostałem ten błąd z ggplot2 w innych okolicznościach, udało mi się uciec przy użyciu as.numeric() wokół sekwencji, której używam do przerw. Na przykład:

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'))) 
+0

To jest świetne, ale tak, że inni mogą go używać bez znacznika 1- użyj biblioteki (skale), inaczej date_format ("% b") nie zadziała 2- tygodniówki powinny być nazywane miesiącbins? 3- koniec przerwy powinna być taka sama jak data. ("2014-01-01"), więc masz przerwę na miesiąc grudzień: monthbins <- as.numeric (seq (as.Date (' 2013-01-01 "), data. (" 2014-01-01 ")," 1 miesiąc ")) –

Powiązane problemy