2012-08-26 92 views
6

Estoy trabajando con algunos datos de series de tiempo y me gustaría resaltar el área del gráfico siempre que ciertas condiciones se cumplan. Por ejemplo:ggplot2: resaltar el área del gráfico

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

El código anterior parcelas los datos, pero ¿cómo puedo resaltar la sección estrecha, cuando cada vez está por encima de SMA? Esta pregunta es similar a How to highlight time ranges on a plot?, pero luego es manual. ¿Hay una función en ggplot2 para el trazado condicional?

+3

La pregunta se vincula a _es_ la manera de hacer esto. ** ggplot2 ** todavía no tiene la funcionalidad para entender algo como 'geom_shade_the_region_that_I_have_in_mind_you_know_that_one()'. Tienes que decirle realmente qué región quieres sombrear. – joran

+1

Aumentará sus posibilidades de obtener elementos no esenciales para experimentar con su código si realiza llamadas de biblioteca adecuadas para indicar qué paquetes son necesarios para ejecutar ese código. –

+0

@joran muchas gracias por la perspicaz respuesta ~ trabajará duro para encontrar algo útil. – user1234440

Respuesta

13

Según el código en el archivo TA.R del paquete quantmod, aquí está el código que usa rle para encontrar los inicios y los extremos de los rectángulos.

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) 

Combine eso con un poco de ggplot2 código de la accepted answer a la pregunta se ha vinculado a:

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) 

Y se obtiene:

enter image description here

Si se invierte el orden de trazado y use alpha=1 en geom_rect puede (o no) verse más de lo que desea:

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


Puesto que usted tiene un objeto xts. Puede que incluso no desee convertir a data.frame. Así es como se podría trazar usando el nuevo método plot.xts en el paquete xtsExtra creado por Michael Weylandt como parte de un 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 que está caliente. ¡Michael hizo un gran trabajo! –

Cuestiones relacionadas