Skip to content
Snippets Groups Projects
OneProportionSource.R 3.29 KiB
Newer Older
#theme for plots
plaintheme <- theme_bw() + 
  theme(plot.background = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank() ) +
  theme(axis.line.x = element_line(color="black", size = 1),
        axis.line.y = element_line(color="black", size = 1))+
  theme(legend.position = "none")

#axis theme for plots
axistheme <- theme(plot.title = element_text(hjust = 0.5, color = "black", face = "bold", size=20)) +
  theme(axis.title = element_text(color = "black", size = 16)) +
  theme(axis.text.x = element_text(size = 14, color = "black")) +
  theme(axis.text.y = element_text(size = 14, color = "black")) 

#determines the number of decimal places of a number
decimalcount<-function(x){stopifnot(class(x)=="character")
  x<-gsub("(.*)(\\.)|([0]*$)","",x)
  as.numeric(nchar(x))
}

# create dotplot locations from data x
dotplot_locs <- function(x, n, cutoff, cutoff.color, dot.fill.color, inequality, Mean){
  counts <- table(x)
  x.locs <- as.numeric(names(counts))
  
  # find minimum difference between points, with an exeption for a single point
  if (length(names(counts)) == 1){
    point_dist <- min(diff(c(0, as.numeric(names(counts)))))/(n+2)
  } else {
    point_dist <- min(diff(as.numeric(names(counts))))/(n+2)
  }
  
  # define the standard x coordinates to be used
  x.coord <- sapply(x.locs, function(x) x + ((1:n)-(n+1)/2)*point_dist)
  
  x.coords <- vector()
  y.coords <- vector()
  to.color <- vector()
  names.counts <- as.numeric(names(counts))
  # loop through each count, defining new x and y coordinates for "dotplot"
  for (i in 1:length(counts)){ 
    if (n == 1){
      x.coords <- c(x.coords, rep(x.coord[i], counts[i]/n))
    } else {
      x.coords <- c(x.coords, rep(x.coord[, i], counts[i]/n),
                    x.coord[0:(counts[i] %% n), i])
    }
    
    if (counts[i] > n){
      y.coords <- c(y.coords, sort(rep(1:(counts[i]/n), n)),
                    rep(ceiling(counts[i]/n), counts[i] %% n))
    } else {
      y.coords <- c(y.coords, sort(rep(1:(counts[i]/n), counts[i])))
    }
    # defines color of dots when cutoff defined
    if(!is.na(as.numeric(cutoff))){
      num.decimals <- decimalcount(as.character(cutoff))
      # error term for rounded cutoff values
      error <- ifelse(num.decimals <= 2, 0, 0.1^num.decimals/2) 
      if (inequality == "greater than"){
        if (names.counts[i] >= as.numeric(cutoff)-error){
          to.color <- c(to.color, rep(cutoff.color, counts[i]))
        } else {
          to.color <- c(to.color, rep(dot.fill.color, counts[i]))
        }
      } else if (inequality == "less than") {
        if (names.counts[i] <= as.numeric(cutoff)+error){
          to.color <- c(to.color, rep(cutoff.color, counts[i]))
        } else {
          to.color <- c(to.color, rep(dot.fill.color, counts[i]))
        }
      } else {
        dist <- abs(Mean - (abs(as.numeric(cutoff))-error))
        if ((names.counts[i] <= Mean - dist) |
            (names.counts[i] >= Mean + dist)){
          to.color <- c(to.color, rep(cutoff.color, counts[i]))
        } else {
          to.color <- c(to.color, rep(dot.fill.color, counts[i]))
        }
      }
    } else {
      to.color <- c(to.color, rep(dot.fill.color, counts[i]))
    }
  }
  return(data.frame("x" = x.coords, "y" = y.coords*n,
                    "fill.color" = to.color))
}