ggplot2: highlight chart area

前端 未结 1 1351
我在风中等你
我在风中等你 2020-12-19 07:28

I am working with some time series data and would like to highlight chart area whenever certain conditions become true. For example:

require(ggplot2)
requir         


        
相关标签:
1条回答
  • 2020-12-19 08:09

    Based on code in the TA.R file of the quantmod package, here is code that uses rle to find the starts and ends of the rectangles.

    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 that with some ggplot2 code from the accepted answer to the question you linked to:

    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)
    

    And you get:

    enter image description here

    If you reverse the order of plotting and use alpha=1 in geom_rect it may (or may not) look more like you desire:

    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


    Since you have an xts object. You may not even want to convert to a data.frame. Here is how you could plot it using the brand new plot.xts method in the xtsExtra package created by Michael Weylandt as part of a 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 讨论(0)
提交回复
热议问题