# [R] Color cells of a matrix as in Excel

Wed Feb 15 01:01:39 CET 2012

```A minimum code to plot a coloured matrix with text labels could be the
following:

library(grid)
library(scales)
library(RColorBrewer)

diverging_palette <- function(d = NULL, centered = FALSE, midpoint = 0,
colors = brewer.pal(7,"PRGn")){

half <- length(colors)/2

if(!length(colors)%%2) stop("requires odd number of colors")

values <-  if(centered) {
low <- seq(min(d), midpoint, length=half)
high <- seq(midpoint, max(d), length=half)
c(low[-length(low)], midpoint, high[-1])
} else {
mabs <- max(abs(d - midpoint))
seq(midpoint-mabs, midpoint + mabs, length=length(colors))
}

}

matrixGrob <- function(d){

nc <- ncol(d)
nr <- nrow(d)

palet <- diverging_palette(d, center=FALSE)

fill.matrix <- palet(d)
dim(fill.matrix) <- dim(d)

## matrix of square tiles
rg <- rasterGrob(fill.matrix, width=unit(1, "npc"), height=unit(1,
"npc"), interpolate = FALSE)
## position of the labels
xy <- expand.grid(y = rescale(seq_len(nr), c(0.5/nr, 1 - 0.5/nr)   ),
x = rescale(seq_len(nc), c(0.5/nc, 1 - 0.5/nc))
)

## text
tg <- textGrob(label=round(d, 3), x=xy\$x, y= 1 - xy\$y, def="npc")

gTree(children=gList(rg, tg))
}

grid.matrix <- function(d)
grid.draw(matrixGrob(d))

d <- cbind(x=rnorm(10), y=rnorm(10))
grid.newpage()
grid.matrix(d)

I don't think it would be very hard to adapt to your needs, basically
you need to add rownames on top, apply() the scale to each column
independently (as opposed to the full matrix at the moment) and
combine the results in a fill.matrix. Having one colour scale across
the matrix makes more sense, imho.

HTH,

b.

On 15 February 2012 11:21, John Nicholas <jbnichola at gmail.com> wrote:
> All,
>
> I frequently make spreadsheets in Excel in which I rank values in columns
> by stop-light colors (red is bad, yellow is OK, green is good).
>
> Image and heatmap expect a matrix in which all the data are in the same
> scale, but I frequently have different scales in different columns. ie.
> Column one runs from 1-10 while column 2 runs from 1-100. I thus need to
> define a separate color ramp for each column. In addition, sometimes the
> smaller numbers are colored green, while sometimes the larger numbers are
> preferred and colored green. I also want to print in each cell the numeric
> value, and I need to show row names. A crude example without the color:
>
> RowNames        Col1     Col2
> ----------------------------------------------
> Row1                   1          1
> Row2                   5         50
> Row3                  7.5       80
> Row4                  10        99
> ......
>
> Is there any R package that can do something similar? Can I create a plot
> that is a matrix of rectangles and get color and text that way?
>
> Any help is greatly appreciated.
>
> Thanks,
>
> John
>
>        [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help