2012-08-26 5 views
6

Pracuję z pewnymi danymi szeregów czasowych i chcę podkreślić obszar wykresu, gdy tylko zostaną spełnione określone warunki. Na przykład:ggplot2: wyróżnij obszar wykresu

require(ggplot2) 
require(quantmod) 
initDate <- "1993-01-31" 
endDate <- "2012-08-10" 
symbols <- c("SPY") 
getSymbols(symbols, from=initDate, to=endDate, index.class=c("POSIXt","POSIXct")) 
spy<-SPY$SPY.Adjusted 
spy$sma<-SMA(spy$SPY.Adjusted,200) 
spy<-spy[-(1:199),] 
spy<-as.data.frame(spy) 
ggplot(spy,aes(x=index(spy),y=spy$SPY.Adjusted))+geom_line()+geom_line(aes(x=index(spy),y=spy$sma)) 

Powyższy kod kreśli dane, ale jak mogę podświetlić sekcję, kiedy jest blisko jest powyżej sma? To pytanie jest podobne do How to highlight time ranges on a plot?, ale jest to ręczne. Czy w ggplot2 istnieje funkcja do drukowania warunkowego?

+3

Pytanie link do _jest_ drogę do Zrób to. ** ggplot2 ** nie ma jeszcze funkcji umożliwiającej zrozumienie czegoś takiego jak 'geom_shade_the_region_that_I_have_in_mind_you_know_that_one()'. Musisz powiedzieć, jaki region chcesz zacieniony. – joran

+1

Zwiększysz swoje szanse na to, że ci, którzy nie będą kwantami, będą eksperymentować z twoim kodem, jeśli umieścisz odpowiednie wywołania biblioteki, aby wskazać, które pakiety są potrzebne do uruchomienia tego kodu. –

+0

@joran dzięki za wnikliwą odpowiedź ~ będzie ciężko pracować, aby wymyślić coś pożytecznego. – user1234440

Odpowiedz

13

Na podstawie kodu w pliku TA.R pakietu quantmod, tutaj jest kod, który używa rle, aby znaleźć początki i końce prostokątów.

runs <- rle(as.logical(spy[, 1] > spy[, 2])) 
l <- list(start=cumsum(runs$length)[which(runs$values)] - runs$length[which(runs$values)] + 1, 
      end=cumsum(runs$lengths)[which(runs$values)]) 
rect <- data.frame(xmin=l$start, xmax=l$end, ymin=-Inf, ymax=Inf) 

Łącząc to z pewnym ggplot2 kodu z accepted answer na pytanie ty związane z:

ggplot(spy,aes(x=index(spy),y=spy$SPY.Adjusted))+geom_line()+geom_line(aes(x=index(spy),y=spy$sma))+geom_rect(data=rect, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), color="grey20", alpha=0.5, inherit.aes = FALSE) 

I masz:

enter image description here

Jeśli odwrócić kolejność kreślenia i użyj alpha=1 w geom_rect może (lub nie musi) wyglądać bardziej, jak chcesz:

ggplot(spy,aes(x=index(spy),y=spy$SPY.Adjusted))+geom_rect(data=rect, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), border=NA, color="grey20", alpha=1, inherit.aes = FALSE)+geom_line()+geom_line(aes(x=index(spy),y=spy$sma)) 

enter image description here


Skoro masz obiekt xts. Możesz nawet nie chcieć konwertować na data.frame. Oto w jaki sposób można go wykreślić używając nowy plot.xts metody w pakiecie xtsExtra stworzonej przez Michaela Weylandt w ramach Google Summer of Code project.

spy <- as.xts(spy) 
require(xtsExtra) 
plot(spy, screens=1, 
    blocks=list(start.time=paste(index(spy)[l$start]), 
       end.time=paste(index(spy)[l$end]), col='lightblue'),      
    legend.loc='bottomright', auto.legend=TRUE) 

enter image description here

+0

+1 gorąco. Michael z pewnością wykonał świetną robotę! –