1

I've successfully been running breakout function using breakoutDetection package in r. One of the possible products of this function is the $plot. Is that possible to combine multiple plots that are embedded in a list after running breakout? I've tried the par( ) function with no success. Any ideas before i reproduce the time series with ggplot?

Reproducible example:

require(BreakoutDetection)
df.date = c("01-01-2017", "02-01-2017", "03-01-2017", "04-01-2017", "05-01-2017", "06-01-2017", "07-01-2017", "08-01-2017", "09-01-2017", "10-01-2017")
df.values = c(1,2,1,1,3,22,34,45,22, 10)
ts = data.frame(df.date, df.values)
ts.b = breakout(ts$df.values, min.size=3, method='multi', beta=.008, degree=1, plot=TRUE, xlab = "time")
ts.b$plot

I want to be able to combined the ts.b$plot element together with other plots (based on other data) in a a 2*2 matrix or other 3*1 matrix... in addition i want to rename the x-axis to show dates and not integers (at the size of the time series)

Dmitry Leykin
  • 485
  • 1
  • 7
  • 14
  • Try providing a [reproducible example](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) with sample input data and code so we can see what you are trying to do. – MrFlick Apr 24 '17 at 17:45

1 Answers1

1

If you go see the source code of this package, it's just using ggplot2 to plot your df and things in the output of breakout detection.

Here's a working example following your code

# your code
require(BreakoutDetection)
df.date = c("01-01-2017", "02-01-2017", "03-01-2017", "04-01-2017", "05-01-2017", "06-01-2017", "07-01-2017", "08-01-2017", "09-01-2017", "10-01-2017")
df.values = c(1,2,1,1,3,22,34,45,22, 10)
ts = data.frame(df.date, df.values)
ts.b = breakout(ts$df.values, min.size=3, method='multi', beta=.008, degree=1, plot=TRUE, xlab = "time")
ts.b$plot



# start:
library(ggplot2)

# the code in this function is copied from the source code of breakout detection (with small adjustment)
# you can adjust things
plot_breakout_detection = function(Z, retList, dateTime = T, x_lab = '', y_lab = '', title0 = ''){

    if(class(Z)%in%c('numeric','integer') || ncol(Z) == 1){
        dateTime = F
        Z = data.frame(timestamp=1:length(Z), count = Z)
    }


    g = ggplot2::ggplot(Z, ggplot2::aes(x=timestamp, y=count)) + ggplot2::theme_bw() + 
        ggplot2::theme(panel.grid.minor=ggplot2::element_blank(), panel.grid.major=ggplot2::element_blank())


    g = g + ggplot2::xlab(x_lab) + ggplot2::ylab(y_lab) + ggplot2::ggtitle(title0)

    g = g + ggplot2::geom_line()

    if(!is.null(retList$loc)&& length(retList$loc)>0){
        v = retList$loc
        v = c(0,v)
        for(j in 2:length(v)){
            M = mean(Z$count[(v[j-1]+1):v[j]])
            df2 = data.frame(Z$timestamp[v[j]], Z$timestamp[v[j]], -Inf, M)
            names(df2) = c('x','xend','y','yend')
            g = g + ggplot2::geom_segment(data=df2,ggplot2::aes(x=x,y=y,xend=xend,yend=yend,color='2'),linetype=2,size=1.2)
            g = g + ggplot2::guides(color=FALSE)
        }
    }

    if(dateTime){
        g = g + scale_x_datetime(expand=c(0,0)) + scale_y_continuous(expand=c(0,0))
    } else {
        g = g + scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0))
    }

}



df = data.frame(timestamp = as.POSIXct(df.date, format = '%m-%d-%Y'), count = df.values)
g = plot_breakout_detection(df, ts.b)
g

enter image description here

YJZ
  • 3,934
  • 11
  • 43
  • 67