[R] heatmap.3
joonR
joonair at gmail.com
Tue Feb 23 22:33:04 CET 2010
Hello again,
lately I have been playing a lot with heatmap functions,
in particular I complemented heatmap.2 with a nice feature from
heatmap.plus,
i.e. the possibility of assigning a matrix to ColSideColors so to take into
account more annotations.
Below is the code I introduced in heatmap.2, everything else is maintained
equal to heatmap.2:
if (!missing(ColSideColors)) {
#if (!is.matrix(ColSideColors))
#stop("'ColSideColors' must be a matrix")
if (!is.character(ColSideColors) || dim(ColSideColors)[1] !=
nc)
stop("'ColSideColors' dim()[2] must be of length ncol(x)")
lmat <- rbind(lmat[1, ] + 1, c(NA, 1), lmat[2, ] + 1)
lhei <- c(lhei[1], 0.2, lhei[2])
}
if (!missing(RowSideColors)) {
#if (!is.matrix(RowSideColors))
#stop("'RowSideColors' must be a matrix")
if (!is.character(RowSideColors) || dim(RowSideColors)[1] !=
nr)
stop("'RowSideColors' must be a character vector of length
nrow(x)")
lmat <- cbind(lmat[, 1] + 1, c(rep(NA, nrow(lmat) - 1),
1), lmat[, 2] + 1)
lwid <- c(lwid[1], 0.2, lwid[2])
}
lmat[is.na(lmat)] <- 0
}
if (length(lhei) != nrow(lmat))
stop("lhei must have length = nrow(lmat) = ", nrow(lmat))
if (length(lwid) != ncol(lmat))
stop("lwid must have length = ncol(lmat) =", ncol(lmat))
op <- par(no.readonly = TRUE)
on.exit(par(op))
layout(lmat, widths = lwid, heights = lhei, respect = FALSE)
if (!missing(RowSideColors)) {
if (!is.matrix(RowSideColors)){
par(mar = c(margins[1], 0, 0, 0.5))
image(rbind(1:nr), col = RowSideColors[rowInd], axes = FALSE)
}
else{
par(mar = c(margins[1], 0, 0, 0.5))
rsc = RowSideColors[rowInd, ]
rsc.colors = matrix()
rsc.names = names(table(rsc))
rsc.i = 1
for (rsc.name in rsc.names) {
rsc.colors[rsc.i] = rsc.name
rsc[rsc == rsc.name] = rsc.i
rsc.i = rsc.i + 1
}
rsc = matrix(as.numeric(rsc), nrow = dim(rsc)[1])
image(t(rsc), col = as.vector(rsc.colors), axes = FALSE)
if (length(colnames(RowSideColors)) > 0) {
axis(1, 0:(dim(rsc)[2] - 1)/(dim(rsc)[2] - 1),
colnames(RowSideColors),
las = 2, tick = FALSE)
}
}
}
if (!missing(ColSideColors)) {
if (!is.matrix(ColSideColors)){
par(mar = c(0.5, 0, 0, margins[2]))
image(cbind(1:nc), col = ColSideColors[colInd], axes = FALSE)
}
else{
par(mar = c(0.5, 0, 0, margins[2]))
csc = ColSideColors[colInd, ]
csc.colors = matrix()
csc.names = names(table(csc))
csc.i = 1
for (csc.name in csc.names) {
csc.colors[csc.i] = csc.name
csc[csc == csc.name] = csc.i
csc.i = csc.i + 1
}
csc = matrix(as.numeric(csc), nrow = dim(csc)[1])
image(csc, col = as.vector(csc.colors), axes = FALSE)
if (length(colnames(ColSideColors)) > 0) {
axis(2, 0:(dim(csc)[2] - 1)/(dim(csc)[2] - 1),
colnames(ColSideColors),
las = 2, tick = FALSE)
}
}
}
What is weird is the fact that the dimension of histogram plotted above the
heatmap, accounting for the annotations, is always the same (fixed!), so
when you have 3 or more annotations, the same length of the bars is divided
by 3 or more, making the reading of the figure impossibile..
Does anyone know how to fix this? Thanks!
g
--
View this message in context: http://n4.nabble.com/heatmap-3-tp1566584p1566584.html
Sent from the R help mailing list archive at Nabble.com.
More information about the R-help
mailing list