"drawSagatStory" <- function(scores.orig,scores.new,U,cutoff,Names,names,noplot=FALSE,layout=NULL,full=FALSE,label.neigh=FALSE,cent.size=7,neigh.size=3,size.by.score=TRUE,font=5) { # Transform weights into adjacency matrix U[abs(U) < cutoff] <- 0 U <- Matrix(U, sparse=TRUE) U@x[] <- 1 adj.mat <- tcrossprod(U) rm(U); gc() adj.mat@x[] <- 1 diag(adj.mat) <- 0 adj.mat <- drop0(adj.mat) # Subsetting graph.sub <- as.logical(rowSums(adj.mat)) names <- unique(names) Names <- Names[graph.sub] if(is.null(names) || !length(names) || !all(names %in% Names)) stop("Invalid names (includes genes that have no associated knowledge)") # Build graph Sim <- adj.mat[graph.sub,graph.sub] rm(adj.mat); gc() centers <- as.numeric(sapply(names,function(x) which(Names == x))) neighbors <- unique(unlist(lapply(centers,function(x) which(as.numeric(Sim[x,])==1)))) neighbors <- neighbors[!(neighbors %in% centers)] allnodes <- c(centers,neighbors) if(noplot) { if(full) return(sum(graph.sub)) else return(length(allnodes)) } rank.diff <- rank(-1*scores.orig,ties.method="min")[graph.sub] - rank(-1*scores.new,ties.method="min")[graph.sub] nodecolors <- rep("Gray",sum(graph.sub)) nodecolors[allnodes] <- "Orange" nodecolors[centers][rank.diff[centers] > 0] <- "Red" nodecolors[centers][rank.diff[centers] <= 0] <- "SkyBlue2" nodesizes <- rep(3,sum(graph.sub)) if(size.by.score) { m.factor <- abs(cent.size-neigh.size)/diff(range(scores.new,na.rm=TRUE)) nodesizes[allnodes] <- (scores.new[graph.sub][allnodes]-min(scores.new,na.rm=TRUE))*m.factor + min(c(cent.size,neigh.size)) } else { nodesizes[centers] <- cent.size nodesizes[neighbors] <- neigh.size } nodelabels <- rep(NA,sum(graph.sub)) if(label.neigh) nodelabels[allnodes] <- Names[allnodes] else nodelabels[centers] <- Names[centers] plot.mat <- matrix(0,nrow=sum(graph.sub),ncol=sum(graph.sub)) plot.mat[allnodes,allnodes] <- as.matrix(Sim[allnodes,allnodes]) rm(Sim); gc() if(!full) { nodecolors <- nodecolors[allnodes] nodesizes <- nodesizes[allnodes] nodelabels <- nodelabels[allnodes] plot.mat <- plot.mat[allnodes,allnodes] } plot.graph <- graph.adjacency(plot.mat,mode="undirected") if(is.null(layout)) layout <- layout.fruchterman.reingold(plot.graph) else if(!is.matrix(layout) || !is.numeric(layout) || any(layout < 0) || (nrow(layout) != nrow(plot.mat)) || (ncol(layout) != 2)) stop("Bad layout") require(tcltk,quietly=TRUE) label.font <- tkfont.create(family="helvetica",size=font,weight="bold") # Plot tkplot(plot.graph, layout=layout, vertex.size=nodesizes, vertex.color=nodecolors, edge.width=1, vertex.label=nodelabels, vertex.label.font=label.font) }