1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
color.scale<-function(x,redrange=c(0,1),greenrange=c(0,1),bluerange=c(0,1),
extremes=NA,na.color=NA,xrange=NULL) {
naxs<-is.na(x)
if(!is.na(extremes[1])){
# calculate the color ranges from the extremes
colmat<-col2rgb(extremes)
redrange<-colmat[1,]/255
greenrange<-colmat[2,]/255
bluerange<-colmat[3,]/255
}
ncolors<-length(x)
if(is.null(xrange)) xrange<-range(x,na.rm=TRUE)
else {
if(xrange[1] > min(x,na.rm=TRUE) || xrange[2] < max(x,na.rm=TRUE))
stop("An explicit range for x must include the range of x values.")
}
nreds<-length(redrange)
if(nreds>1) {
reds<-rep(redrange[nreds],ncolors)
xstart<-xrange[1]
xinc<-diff(xrange)/(nreds-1)
for(seg in 1:(nreds-1)){
segindex<-which((x >= xstart) & (x <= (xstart+xinc)))
reds[segindex]<-rescale(x[segindex],redrange[c(seg,seg+1)])
xstart<-xstart+xinc
}
if(min(reds) < 0 || max(reds) > 1) reds<-rescale(reds,c(0,1))
}
else reds<-rep(redrange,ncolors)
ngreens<-length(greenrange)
if(ngreens>1) {
greens<-rep(greenrange[ngreens],ncolors)
xstart<-xrange[1]
xinc<-diff(xrange)/(ngreens-1)
for(seg in 1:(ngreens-1)){
segindex<-which((x >= xstart) & (x <= (xstart+xinc)))
greens[segindex]<-rescale(x[segindex],greenrange[c(seg,seg+1)])
xstart<-xstart+xinc
}
if(min(greens) < 0 || max(greens) > 1)
greens<-rescale(greens,c(0,1))
}
else greens<-rep(greenrange,ncolors)
nblues<-length(bluerange)
if(length(bluerange)>1) {
blues<-rep(bluerange[nblues],ncolors)
xstart<-xrange[1]
xinc<-diff(xrange)/(nblues-1)
for(seg in 1:(nblues-1)){
segindex<-which((x >= xstart) & (x <= (xstart+xinc)))
blues[segindex]<-rescale(x[segindex],bluerange[c(seg,seg+1)])
xstart<-xstart+xinc
}
if(min(blues) < 0 || max(blues) > 1)
blues<-rescale(blues,c(0,1))
}
else blues<-rep(bluerange,ncolors)
xdim<-dim(x)
if(is.null(xdim)) colors<-rgb(reds,greens,blues)
else colors<-matrix(rgb(reds,greens,blues),nrow=xdim[1])
if(length(naxs)) colors[naxs]<-na.color
return(colors)
}
|