Often I need to map a numeric vector on a palette, e.g. create a gradient in which the lowest value is blue, highest is red, and everything in between nicely spread. I found this function useful.
smoothPalette <- function( x, max= NULL, min= NULL, palfunc= NULL, n= 10, symmetrical= FALSE ) {
require( RColorBrewer )
if( missing( palfunc ) ) {
palfunc <- colorRampPalette( c( "blue", "white", "red" ) )
}
pal <- palfunc( n )
nas <- which( is.na( x ) )
x[ nas ] <- mean( x, na.rm= T )
if( missing( max ) ) max <- max( x )
x[ x >= max ] <- max
if( missing( min ) ) min <- min( x )
x[ x <= min ] <- min
if( symmetrical ) {
mm <- max( abs( c( min, max ) ) )
max <- mm
min <- -mm
}
ret <- findInterval( x, seq( min, max, length.out= n + 1 ), rightmost.closed= T )
ret <- pal[ ret ]
ret[ nas ] <- "white"
return( ret )
}
Usage is simple:
> a <- sort( rnorm( 1000 ) ) > plot( 1:length( a ), a, col= smoothPalette( a, n= 100 ), pch= 19, cex= 2 )
The result:
