2011-03-02 16 views
8

Powiedzmy, że mamy następującą prostą ramkę danych dla par wartości daty i czasu, gdzie brakuje niektórych dat w sekwencji (tj. Od 12 stycznia do 14 stycznia). Kiedy rysuję punkty, pokazuje te brakujące daty na osi X, ale nie ma punktów odpowiadających tym datom. Chcę zapobiec wyświetlaniu brakujących dat na osi X, aby sekwencja punktów nie zawierała żadnych przerw. Wszelkie sugestie, jak to zrobić? Dzięki!R + ggplot2: jak ukryć brakujące daty na osi X?

dts <- c(as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16'))) 
df <- data.frame(dt = dts, val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() + 
     scale_x_date(format = '%d%b', major='days') 

enter image description here

Odpowiedz

8

Turn dane date na czynnik czasu. W tej chwili ggplot interpretuje dane w takim sensie, w jakim powiedziałeś im, że dane znajdują się w ciągłej skali dat. Nie chcesz tego skalę, chcesz kategoryczne skala:

require(ggplot2) 
dts <- as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16')) 
df <- data.frame(dt = dts, val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() + 
     scale_x_date(format = '%d%b', major='days') 

kontra

df <- data.frame(dt = factor(format(dts, format = '%d%b')), 
        val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

która produkuje: enter image description here

Czy tego chcesz?

+0

@Gavin, dzięki ... ale że zmienia daty bycia wyświetlany: Miałem 10 do 16 Jan, teraz mamy 2 Jan przez 5 Jan. Jakikolwiek sposób to naprawić? Sądzę, że mógłbym traktować daty jako łańcuchy i całkowicie stracić semantykę daty, ale czy istnieje sposób, w którym nie tracę semantyki dat? –

+0

Ale to są kolejne daty, a nie te z pierwotnego pytania. –

+0

Zauważyłem, że, zapomniałem sformatować daty według oryginalnej skali. Moja wina - zobacz odpowiedź teraz. –

5

Pierwsze pytanie brzmi: dlaczego chcesz to zrobić? Nie ma sensu pokazywać wykresu współrzędnych, jeśli twoje osie nie są współrzędnymi. Jeśli naprawdę chcesz to zrobić, możesz przekonwertować na współczynnik. Bądź ostrożny na celu choć:

dts <- c(as.Date(c('31-10-2011', '01-11-2011', '02-11-2011', 
      '05-11-2011'),format="%d-%m-%Y")) 
dtsf <- format(dts, format= '%d%b') 
df <- data.frame(dt=ordered(dtsf,levels=dtsf),val=seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

enter image description here

Z czynników trzeba być ostrożnym, ponieważ kolejność jest dowolna w czynnik, chyba że czynią go zamawiać czynnikiem. Ponieważ czynniki są uporządkowane alfabetycznie domyślnie, możesz mieć kłopoty z niektórymi formatami dat. Uważaj więc, co robisz. Jeśli nie brać pod uwagę kolejność, otrzymasz:

df <- data.frame(dt=factor(dtsf),val=seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

enter image description here

+0

W finansowych seriach czasowych dość często nie ma danych w weekendy, więc wizualnie nie jest fajnie mieć przerwy w działkach, w których są weekendy. –

+0

@Prasad: Rozumiem. Wolę dodać coś takiego jak "dni pracy", a następnie na osi X, ponieważ teraz daje wrażenie ciągłej funkcji, która w rzeczywistości nie jest ciągła na osi X. Brzmi jak nitpicking, ale może to być dość mylące. –

+0

+1 punkty za czynniki zamówienia –

7

Zrobiłem pakiet że to robi. Nazywa się bdscale i jest dostępny pod CRAN i github. Bezwstydna wtyczka.

Aby replikować swój przykład:

> library(bdscale) 
> library(ggplot2) 
> library(scales) 
> dts <- as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16')) 
> ggplot(df, aes(x=dt, y=val)) + geom_point() + 
    scale_x_bd(business.dates=dts, labels=date_format('%d%b')) 

replicate example

Ale co prawdopodobnie chcesz załadować znanych ważnych dat, a następnie wykreślić swoje dane za pomocą ważnych dat na osi x:

> nyse <- bdscale::yahoo('SPY') # get valid dates from SPY prices 
> dts <- as.Date('2011-01-10') + 1:10 
> df <- data.frame(dt=dts, val=seq_along(dts)) 
> ggplot(df, aes(x=dt, y=val)) + geom_point() + 
    scale_x_bd(business.dates=nyse, labels=date_format('%d%b'), max.major.breaks=10) 

Warning message: 
Removed 3 rows containing missing values (geom_point). 

better

ostrzeżenie z informacją, że jest ona usuwana trzech terminach:

  • 15th = sobota
  • 16-te = niedziela
  • 17-ty = MLK Day
+1

Po drobnej korekcie stworzyłeś * pakiet *, który to robi (nie biblioteka). –

+1

Mam pakiet _ dla ciebie ** tutaj **, kolego. Aww yiss. Ale masz rację, poprawię. – dvmlls

Powiązane problemy