--- /dev/null
+# MvA plotting for microarray data
+
+
+# Copyright 2003 By Don Armstrong
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# $Id: mva_plotting.R,v 1.5 2006/06/10 04:14:45 don Exp $
+
+
+# mva.plot
+# Plots a pairwise M versus A plot with a loess fit line
+mva.plot.pair <- function(array,title=F,small.positive=0.1){
+ size <- ncol(array)
+ npair <- size*(size-1)/2
+ height <- min(round((npair*3/4)^0.5),3)
+ width <- min(ceiling(npair/height),3)
+ ## print(c("width",width,"height",height))
+ def.par <- par(no.readonly = TRUE)
+ use.grid <- 0
+ if (NROW(array[,1]) > 1e4) {
+ use.grid <- 1
+ }
+ if (use.grid) {
+ mva.layout <- grid.layout(width,height)
+ pushViewport(viewport(layout=mva.layout))
+ }
+ else {
+ par(mfcol=c(width,height),ps=9,cex.main=1)
+ }
+ # we could also use combn here instead
+ num.plot <- 0
+ for(a in 1:(size-1)){
+ for(b in (a+1):size){
+# par(mfg=c(a,b-1))
+ num.plot <- num.plot + 1
+ array[array[,a]<=0,a] <- small.positive
+ array[array[,b]<=0,b] <- small.positive
+ A <- 0.5*log2(array[,a]*array[,b])
+ M <- log2(array[,a]/array[,b])
+ temp.frame <- data.frame(cbind(A,M))
+ temp.frame <- temp.frame[abs(temp.frame$M) < 7.8 & temp.frame$A < 15.8 & temp.frame$A > 0,]
+ if (use.grid) {
+ ## print(c("num.plot",num.plot))
+ ## print(c("row",floor((num.plot -1)/ width) %% height))
+ ## print(c("col",(num.plot-1) %% width))
+ if (num.plot > 1 && floor((num.plot -1)/ width) %% height == 0 && (num.plot-1) %% width == 0) {
+ popViewport(1)
+ grid.text(title,x=unit(0.0,"npc")+unit(1,"lines"),y=unit(0.5,"npc"),just="center",rot=90)
+ grid.newpage()
+ pushViewport(viewport(layout=mva.layout))
+ }
+ ## print(floor((num.plot -1)/ width) %% height+1)
+ ## print((num.plot - 1)%% width+1)
+ pushViewport(viewport(layout.pos.row=(floor((num.plot -1)/ width) %% height)+1, layout.pos.col=((num.plot - 1)%% width)+1))
+ hb <- hexbin(temp.frame,
+ ##xlab="A",ylab="M",
+ ##ybnds = c(-8,8),
+ ##xbnds = c(0,16)
+ );
+ # P <- plot(hb,type="n",
+ # ## main=paste(colnames(array)[a],colnames(array)[b],sep=" vs. "),
+ # xlab="",ylab="",newpage=FALSE,legend=FALSE)
+ hb.viewport <- hexViewport(hb,mar=unit(0.1,"npc"))
+ pushHexport(hb.viewport)
+ grid.hexagons(hb,style="colorscale",border=gray(.1),pen=gray(.6),minarea=.1,maxarea=1.5,colramp=BTY)
+ grid.xaxis()
+ grid.yaxis()
+ temp.loess <- loess.smooth(A,M,family="gaussian",
+ control=loess.control(surface="interpolate",statistics="approximate",
+ trace.hat="approximate",iterations=2,cell=0.6))
+ panel.loess(A,M,
+ col="red",lwd=2)
+ popViewport(1)
+ ## grid.rect()
+ grid.text(paste(colnames(array)[a],colnames(array)[b],sep=" vs. "),y=unit(0.9,"npc"),x=unit(0.5,"npc"),just="center")
+ popViewport(1)
+# grid.lines()
+ }
+ else {
+ plot(A,M,pch=".",main=paste(colnames(array)[a],colnames(array)[b],sep=" vs. "),xlab="A",ylab="M",ylim=c(-8,8),xlim=c(0,16))
+ lines(loess.smooth(A,M,family="gaussian",
+ control=loess.control(surface="interpolate",statistics="approximate",
+ trace.hat="approximate",iterations=2,cell=0.6)),
+ col="blue",lwd=2)
+ }
+ ## abline(h=0)
+ }
+ }
+ if (use.grid) {
+ popViewport(1)
+ grid.text(title,x=unit(0.0,"npc")+unit(1,"lines"),y=unit(0.5,"npc"),just="center",rot=90)
+ ## grid.newpage()
+ }
+ else {
+ title(title,outer=TRUE)
+ par(def.par)
+ }
+}