R/DrawHLines.r

#' @title Draw Horizontal Lines
#'
#' @description Given ylim, draws approximately 10 horizonal lines to existing plot.
#'
#' @param ylim
#'
#' @export DrawHLines
#'
#' @examples
#'   ylim <- c(1,100)
#'   DrawHLines(ylim)

DrawHLines <- function(ylim, num.lines=10){

  if(ylim[1]>=0){ # All values positive
    unit.scale <- AxisScaling(ylim[1],ylim[2], num.lines)
    abline(h=c(0:(num.lines*5))*unit.scale, col=gray.f(0.05))
    abline(h=c(0:num.lines)*5 * unit.scale, col=gray.f(0.1))

  } else if (ylim[2]<=0){ # All values negative
    unit.scale <- AxisScaling((-1)*ylim[2],(-1)*ylim[1], num.lines)
    abline(h= (-1) * c(0:(num.lines*5))*unit.scale, col=gray.f(0.05))
    abline(h= (-1) * c(0:num.lines)*5 * unit.scale, col=gray.f(0.1))

  } else { # Values range between positive and negative

    # Negative
    num.neg.lines <- round((-1)*ylim[1]*num.lines/(ylim[2]-ylim[1]))
    unit.scale <- AxisScaling(0,(-1)*ylim[1], num.neg.lines)
    abline(h= (-1) * c(0:(num.neg.lines*5))*unit.scale, col=gray.f(0.05))
    abline(h= (-1) * c(0:num.neg.lines) *5* unit.scale, col=gray.f(0.1))

    # Positive
    num.lines <- num.lines-num.neg.lines
    unit.scale <- AxisScaling(0,ylim[2], num.lines)
    abline(h=c(0:(num.lines*5))*unit.scale, col=gray.f(0.05))
    abline(h=c(0:num.lines) *5* unit.scale, col=gray.f(0.1))
  }
}


# Given ymin and ynax, gived the size of a unit
AxisScaling <- function(ymin, ymax, num.ticks){

  returnValue = -1
  scaleRange <- ymax - ymin
  tickRange <- scaleRange/num.ticks
  for (scaleCoeff in -5:10)
  {
    if (tickRange >= 10^scaleCoeff){returnValue <- 10^scaleCoeff}
  }
  multFactor <- floor((scaleRange/returnValue)/num.ticks)

  return(returnValue * multFactor)
}
einaooka/tea.eo.plots documentation built on May 16, 2019, 1:25 a.m.