[R] grDevices- Feature proposal: color interpolation in color spaces of convertColor

Samuel Granjeaud IR/Inserm @@mue|@gr@nje@ud @end|ng |rom |n@erm@|r
Thu Aug 28 21:07:32 CEST 2025


Hi,

I needed to interpolate in the CIE XYZ color space, but the default 
colorRamp function does not exploit the color spaces available in 
colorConvert function. Please find below a few changes to colorRamp that 
permits to extend the choice of color spaces.

Best,
Samuel

colorRamp <- function(
     colors, bias = 1,
     space = c("rgb","Lab", "XYZ", "Apple RGB", "CIE RGB", "Luv"),
     interpolate = c("linear","spline"), alpha = FALSE)
{
   if (bias <= 0) stop("'bias' must be positive")
   if (!missing(space) && alpha)
     stop("'alpha' must be false if 'space' is specified")

   colors <- t(col2rgb(colors, alpha = alpha)/255)
   space <- match.arg(space)
   interpolate <- match.arg(interpolate)

   if (space != "rgb")
     colors <- convertColor(colors, from = "sRGB", to = space)

   interpolate <- switch(interpolate,
                         linear = stats::approxfun,
                         spline = stats::splinefun)

   if((nc <- nrow(colors)) == 1L) {
     colors <- colors[c(1L, 1L) ,]
     nc <- 2L
   }
   x <- seq.int(0, 1, length.out = nc)^bias
   palette <- c(interpolate(x, colors[, 1L]),
                interpolate(x, colors[, 2L]),
                interpolate(x, colors[, 3L]),
                if(alpha) interpolate(x, colors[, 4L]))

   roundcolor <- function(rgb) ## careful to preserve matrix:
     pmax(pmin(rgb, 1), 0)

   if (space != "rgb")
     function(x)
       roundcolor(convertColor(cbind(palette[[1L]](x),
                                     palette[[2L]](x),
                                     palette[[3L]](x),
                                     if(alpha) palette[[4L]](x)),
                               from = space, to = "sRGB"))*255
   else
     function(x)
       roundcolor(cbind(palette[[1L]](x),
                        palette[[2L]](x),
                        palette[[3L]](x),
                        if(alpha) palette[[4L]](x)))*255
}



More information about the R-help mailing list