Thomas Lumley wrote:

See the help pages for color() and palette(), and perhaps the RColorBrewer
package.

Splus lets you define colour palettes in its Gui, using a nice little notation where you specify something like "black 8 white 6 red" to get a 17-colour palette with 8 colours between balck and white and then 6 colours up to red (linearly interpolating RGB values). Here's a little R function to do something similar:


smoothColours <-
function(...){
###
### usage: smoothColours(colour,[n|colour],...)
### like smoothColours("white",10,"black") 12 colours, white to black
###
  args <- list(...)
  r <- g <- b <- NULL
  while(length(args)>0){
    if(!is.character(args[[1]])){
      stop("bad args")
    }

    if(length(args)>1){
      if(is.numeric(args[[2]])){
        ## do interpolate:
        from <- col2rgb(args[[1]])
        too <- col2rgb(args[[3]])
        ## generate args[[2]] colours between specified colours:
        n <- args[[2]]+2 # add 2 for start and finish

        ## chop off last one since it will be added on the next iteration:
        r <- c(r,seq(from[1,],too[1,],length=n))
        i <- length(r)
        r <- r[-i]
        g <- c(g,seq(from[2,],too[2,],length=n))
        g <- g[-i]
        b <- c(b,seq(from[3,],too[3,],length=n))
        b <- b[-i]
        ## cut colour and n from list and back we go
        args <- args[-(1:2)]

      }else{
        ## insert colour, chop off 1
        cc <- col2rgb(args[[1]])
        r <- c(r,cc[1,])
        g <- c(g,cc[2,])
        b <- c(b,cc[3,])
        args <- args[-1]
      }
    }else{
      ## insert colour, chop off 1
      cc <- col2rgb(args[[1]])
      r <- c(r,cc[1,])
      g <- c(g,cc[2,])
      b <- c(b,cc[3,])
      args <- args[-1]
    }
   }
  rgb(r,g,b,max=255)
 }

You can then do something like:

image(matrix(runif(100),10,10),col=smoothColours("red",5,"green",6,"blue"))

You can use as many "colour",n,"colour" things as you like, as long as it starts and ends with a colour name. You can even do:

smoothColours("red","green",10,"white")

And you can use "#abcdef" notation too.

Of course, linearly interpolating in RGB might not be the right thing to do...

Baz

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help

Reply via email to