Search code examples
rdygraphs

r dygraphs shaded region by time of day across multiple days


In R dygraphs, how do I shade regions by time of day, across multiple days, without listing them each out? For example, I'd like to shade 07:00 - 08:15 each day in the following example (my full example has many more days).

#generate data
library(xts)
library(dygraphs)

#generate sample data
#http://stackoverflow.com/questions/9778632/r-xts-generating-1-minute-time-series-from-second-events
x <- xts(cumsum(rnorm(400000, 0, 0.2)), Sys.time() - 400000:1)
x <- to.minutes(x)

#display dygraph
dygraph(x) %>%
  dyCandlestick() %>%
  dyRangeSelector(height=20)

Thanks!


Solution

  • I was able to solve my problem. Code is below for reference:

    Also, thanks to the following for ideas:

    R xts: generating 1 minute time series from second events

    R How to shade week-end period with dygraphs?

    http://databasefaq.com/index.php/answer/20331/r-dygraphs-dyshading-r-dygraph


    #load libraries
    library(xts)
    library(dygraphs)
    
    #generate sample data
    x <- xts(cumsum(rnorm(400000, 0, 0.2)), Sys.time() - 400000:1)
    x <- to.minutes(x)
    
    #display dygraph without shading
    dygraph(x) %>%
      dyCandlestick() %>%
      dyRangeSelector(height=20)
    
    
    #####################
    #function to creating shading in a list
    add_shades <- function(x, periods, ...) {
      for( period in periods ) {
        x <- dyShading(x, from = period$from , to = period$to, ... )
      }
      x
    }
    
    #####################
    #creates the list that feeds into the "add_shades" function
    ok_periods<-0
    i=1
    j=1
    while (i<(length(index(x[(.indexhour(x)==9 & .indexmin(x)==30)])))){
      ok_periods[j] <- list(list(from = index(x[(.indexhour(x)==16 & .indexmin(x)==15)][i]), to = index(x[(.indexhour(x)==9 & .indexmin(x)==30)][i+1])))
      i=i+1
      j=j+1
    }
    
    #####################
    #graph with shading
    dygraph(x) %>%
      dyCandlestick() %>%
      add_shades(ok_periods, color = "#FFFFCC" ) %>%
      dyRangeSelector(height=20)