--- a +++ b/common_scripts/visualisation/oncoprint_memo.R @@ -0,0 +1,56 @@ +# This function sorts the matrix for better visualization of mutual exclusivity across genes +memoSort <- function(M) { + geneOrder <- sort(rowSums(M), decreasing=TRUE, index.return=TRUE)$ix; + scoreCol <- function(x) { + score <- 0; + for(i in 1:length(x)) { + if(x[i]) { + score <- score + 2^(length(x)-i); + } + } + return(score); + } + scores <- apply(M[geneOrder, ], 2, scoreCol); + sampleOrder <- sort(scores, decreasing=TRUE, index.return=TRUE)$ix; + return(M[geneOrder, sampleOrder]); +} + +# This is the plotting function +oncoPrint <- function(M, sort=TRUE) { + if(sort) { + alts <- memoSort(M); + } else { + alts <- M; + } + + ngenes <- nrow(alts); + nsamples <- ncol(alts); + coverage <- sum(rowSums(alts) > 0); + + ### OncoPrint + numOfOncos <- ngenes*nsamples; + oncoCords <- matrix( rep(0, numOfOncos * 5), nrow=numOfOncos ); + colnames(oncoCords) <- c("xleft", "ybottom", "xright", "ytop", "altered"); + + xpadding <- .01; + ypadding <- .01; + cnt <- 1; + for(i in 1:ngenes) { + for(j in 1:nsamples) { + xleft <- j-1 + xpadding; + ybottom <- ((ngenes-i+1) -1) + ypadding; + xright <- j - xpadding; + ytop <- (ngenes-i+1) -ypadding; + altered <- alts[i, j]; + + oncoCords[cnt, ] <- c(xleft, ybottom, xright, ytop, altered); + cnt <- cnt+1; + } + } + + colors <- rep("lightgray", cnt); + colors[ which(oncoCords[, "altered"] == 1) ] <- "black"; + plot(c(0, nsamples), c(0, ngenes), type="n", main=sprintf("Gene set altered in %.2f%%: %d of %d cases", coverage/nsamples*100, coverage, nsamples), xlab="Samples", ylab="", yaxt="n"); + rect(oncoCords[, "xleft"], oncoCords[, "ybottom"],oncoCords[, "xright"], oncoCords[, "ytop"], col=colors, border="white"); + axis(2, at=(ngenes:1)-.5, labels=rownames(alts), las=2); +}