https://github.com/cran/CluMix
Revision b6ad4d474d5865090b0bfabf2570aa79580237a4 authored by Manuela Hummel on 16 May 2017, 09:19:23 UTC, committed by cran-robot on 16 May 2017, 09:19:23 UTC
1 parent dd414a4
Raw File
Tip revision: b6ad4d474d5865090b0bfabf2570aa79580237a4 authored by Manuela Hummel on 16 May 2017, 09:19:23 UTC
version 2.0
Tip revision: b6ad4d4
visualization.R

# functions for heatmap and color bars, thanks to Martin Sill

heat <- function(x, cols=maPalette(low="blue", mid="lightgrey", high="red", k=50), ylab, cex=1.5){
  # prevent outlier values to dominate the color scale -> restrict "maximal colors" to 2.5% and 97.5% quantiles
  qu <- quantile(x, c(0.025, 0.975), na.rm=TRUE)
  breaks <- seq(qu[1], qu[2], length.out=length(cols)+1)
  x[x < qu[1]] <- qu[1]
  x[x > qu[2]] <- qu[2]
  
  image(t(x)[1:ncol(x), nrow(x):1, drop=FALSE], col=cols, breaks=breaks, xlim=0.5 + c(0, ncol(x)),
        ylim = 0.5 + c(0, nrow(x)), x=c(1:ncol(x)), y=c(1:nrow(x)), axes=F, ylab="", xlab="", useRaster=TRUE)
  if(!missing(ylab))
    text(x=par("usr")[2], y=nrow(x):1, labels=ylab, xpd=T, cex=cex, pos=4)
}

fac2col <- function(x, cols=c("darkorange","darkred","thistle","cornflowerblue","olivedrab")){
  x <- as.factor(x)
  out <- rep("gray",length(x))
  lev <- levels(x)
  for(i in 1:length(lev)) 
    out[x==lev[i]] <- cols[i]
  out[is.na(x)] <- "white"
  names(out) <-  names(x)
  return(out)  
}

addfac <- function(x, ylab, cex=1.5){
  plot(y=c(0,ncol(x)), x=c(0,nrow(x)), type="n", ann=FALSE, xaxt="n", yaxt="n", xaxs="i", yaxs="i")
  for(i in ncol(x):1){
    ytop <- (ncol(x):1)[i]
    rect(xleft=seq(1, nrow(x))-1, xright=seq(1,nrow(x)), ytop=ytop, ybottom=ytop-1, border=NA, col=x[,i])
  }
  if(!missing(ylab))
    text(x=par("usr")[2], y=(ncol(x):1)-0.5, labels=ylab, xpd=T, cex=cex, pos=4)
}



## function to create a color legend matrix
legendmat <- function(data, Names, col.cont=maPalette(low="blue", mid="lightgrey", high="red", k=50),
                      cont.range=c("min", "max"),
                      lab.cex=1, col.ord=list(low="lightgreen", high="darkgreen"),
                      col.cat=c("darkorange","darkred","thistle","cornflowerblue","olivedrab","darkgrey","purple4","indianred","yellow2","darkseagreen4")){
  
  dc <- sapply(data, data.class)
  n.cont <- sum(dc == "numeric")
  n.ord <- sum(dc == "ordered")
  n.cat <- sum(dc == "factor")
  
  if(missing(Names))
    Names <- names(data)
  
  y <- max(n.ord, n.cat)
  K <- sapply(data[,dc == "factor"], function(x) length(levels(x)))
  mK <- 0
  if(n.cat != 0) 
    mK <- max(K)
  plot(0, xlim=c(-.5, 8 + mK), ylim=c(-.2, y), type="n", axes=FALSE, xlab="", ylab="")
  
  # legend for quantitative variables - just show 'min' and 'max' for any of them
  if(n.cont != 0){
    #rect(.7, y-.7, 1.3, y+.2, col=col.cont[1])
    #rect(1.7, y-.7, 2.3, y+.2, col=col.cont[length(col.cont)])
    pnts <- cbind(x=c(.7, .7, 2.3, 2.3), y=c(y-.7, y+.2, y+.2, y-.7))
    #SDMTools::legend.gradient(pnts, cols=col.cont, limits=c("min","max"))
    xvals <- seq(min(pnts[, 1]), max(pnts[, 1]), length=length(col.cont) + 1)
    for (i in 1:length(col.cont)) {
      polygon(x=c(xvals[i], xvals[i], xvals[i+1], xvals[i+1]), y=pnts[,2], 
              col=col.cont[i], border=FALSE)
    }
    text(.5, y-1, "quantitative", font=2, pos=2, xpd=TRUE, cex=lab.cex)
    text(c(.8, 2.2), rep(y-1, 2), cont.range, cex=lab.cex)
  }
  
  # ordinal variables - also only show minimal and maximal categories (because color scheme is always developed within the low' and 'high' colors)
  if(n.ord != 0){
    rect(4.7, y-.7, 5.3, y+.2, col=col.ord$low)
    rect(5.7, y-.7, 6.3, y+.2, col=col.ord$high)
    
    N.cat <- names(data)[dc == "ordered"]    
    N.cat2 <- Names[dc == "ordered"]    
    for(i in 1:n.ord){
      L <- levels(data[,N.cat[i]])
      text(4.7, y-i, N.cat2[i], font=2, pos=2, cex=lab.cex)
      text(c(5,6), rep(y-i, 2), c(L[1],L[length(L)]), cex=lab.cex)
    }
  }
  
  # categorical variables
  if(n.cat != 0){
    N.cat <- names(data)[dc == "factor"]    
    N.cat2 <- Names[dc == "factor"]    
    for(i in 1:n.cat){
      rect(seq(8.7, length.out=mK), y-.7, seq(9.3, length.out=mK), y+.2, col=col.cat[1:mK])
      L <- levels(data[,N.cat[i]])
      l <- length(L)
      text(8.7, y-i, N.cat2[i], font=2, pos=2, cex=lab.cex)
      text(seq(9, length.out=l), rep(y-i, 2), L, cex=lab.cex)      
    }
  }
}
back to top