[BioC] colors on heatmap

Warnes, Gregory R gregory_r_warnes at groton.pfizer.com
Fri Sep 12 15:06:08 MEST 2003

In the next release of the gregmisc packages I'll be including a  couple of
functions to make colorizing heatmaps easier.  (As well as an enhanced
heatmap function.)

First the code:

# detect odd/even integers
odd <- function(x) x!=as.integer(x/2)*2
even <- function(x) x==as.integer(x/2)*2

# Generat a set of n colors which smoothly transition from 'low' to 'mid' to
'high'.
colorpanel <- function(n,low='green',mid='black',high='red')
{
if(even(n)) warning("n is even: colors panel will not be symmetric")

# convert to rgb
low <- col2rgb(low)
mid <- col2rgb(mid)
high <- col2rgb(high)

# determine length of each component
lower <- floor(n/2)
upper <- n - lower

red  <- c(
seq(low[1,1], mid [1,1], length=lower),
seq(mid[1,1], high[1,1], length=upper)
)/255

green <- c(
seq(low[3,1], mid [3,1], length=lower),
seq(mid[3,1], high[3,1], length=upper)
)/255

blue <- c(
seq(low[2,1], mid [2,1], length=lower),
seq(mid[2,1], high[2,1], length=upper)
)/255

rgb(red,blue,green)
}

# Generate red-black-green colorscale
redgreen <- function(n) colorpanel(n, 'red', 'black', 'green')

# Generate green-black-red colorscale
greenred <- function(n) colorpanel(n, 'green', 'black', 'red' )

# Generate blue white red colorscale
bluered  <- function(n) colorpanel(n, 'blue','white','red')

----

The use is straightforward.  To colorize a heatmap green-black-red, simply
do:

x <- matrix(runif(1000), 50, 20)
hv <- heatmap(x, col = redgreen(32))

-Greg

> -----Original Message-----
> From: Johannes Freudenberg [mailto:mai98ftu at studserv.uni-leipzig.de]
> Sent: Friday, September 12, 2003 1:16 PM
> To: Sean Davis
> Cc: Bioconductor at stat.math.ethz.ch
> Subject: Re: [BioC] colors on heatmap
>
>
> Sean,
>
> I'm not quite sure what the standard green/black/red color
> map is but i'm
> assuming that green means low values, red means high values
> and black is in the
> middle?
>
> You could define a function which returns colors following
> that scheme as
> follows:
>
> > my.colors <- function(n = 50, low.col = 0.45, high.col=1,
> saturation = 1) {
>   if (n < 2) stop("n must be greater than 2")
>   n1 <- n%/%2
>   n2 <- n - n1
>   c(hsv(low.col, saturation, seq(1,0,length=n1)),
>      hsv(high.col, saturation, seq(0,1,length=n2)))
> }
>
> You could then use this function within the heatmap function:
>
> > x <- matrix(runif(1000), 50)
> > hv <- heatmap(x, col = my.colors(), main = "Random U[0,1] heatmap")
>
> I hope that helps,
> Johannes
>
>
> Quoting Sean Davis <Sean.Davis at dcb.cit.nih.gov>:
>
> > I would like to use "heatmap" to display my data and
> wondered if anyone
> > had any suggestions on making a color scheme that works to
> create the
> > standard green/black/red color map.
> >
> > Thanks
> >
> > _______________________________________________
> > Bioconductor mailing list
> > Bioconductor at stat.math.ethz.ch
> > https://www.stat.math.ethz.ch/mailman/listinfo/bioconductor
> >
>
> _______________________________________________
> Bioconductor mailing list
> Bioconductor at stat.math.ethz.ch
> https://www.stat.math.ethz.ch/mailman/listinfo/bioconductor
>

LEGAL NOTICE\ Unless expressly stated otherwise, this messag...{{dropped}}