colorRampPaletteAlpha() and addalpha() – helper functions for adding transparency to colors in R

colorRampPalette is a very useful function in R for creating colors vectors to use as the palette, or to pass as an argument to a plotting function; however, a weakness lies in that it disregards the alpha channel of the colors passed to it when creating the new vector.

I have also found that working with the alpha channel in R is not always the easiest, but is something that scientists and analysts may often have to do – when overplotting, for example.

To address this I’ve quickly written the helper functions addalpha and colorRampPaletteAlpha, the former which makes passing a scalar or vector to a vector of colors as the alpha channel easier, and the latter as a wrapper for colorRampPalette which preserves the alpha channel of the colors provided.

Using the two functions in combination it is easy to produce plots with variable transparency such as in the figure below:

The code is on github.

I’ve also written examples of usage, which includes the figure above.

`# addalpha() and colorRampPaletteAlpha() usage examples# Myles Harrison# www.everydayanalytics.calibrary(MASS)library(RColorBrewer)# Source the colorRampAlpha filesource ('colorRampPaletteAlpha.R')# addalpha()# ----------# scalars:col1 <- "red"col2 <- rgb(1,0,0)addalpha(col2, 0.8)addalpha(col2,0.8)# scalar alpha with vector of colors:col3 <- c("red", "green", "blue", "yellow")addalpha(col3, 0.8)plot(rnorm(1000), col=addalpha(brewer.pal(11,'RdYlGn'), 0.5), pch=16)# alpha and colors vector:alpha <- seq.int(0, 1, length.out=4)addalpha(col3, alpha)# Simple examplex <- seq.int(0, 2*pi, length=1000)y <- sin(x)plot(x, y, col=addalpha(rep("red", 1000), abs(sin(y))))# with RColorBrewerx <- seq.int(0, 1, length.out=100)z <- outer(x,x)c1 <- colorRampPalette(brewer.pal(11, 'Spectral'))(100)c2 <- addalpha(c1,x)par(mfrow=c(1,2))image(x,x,z,col=c1)image(x,x,z,col=c2)# colorRampPaletteAlpha()# Create normally distributed datax <- rnorm(1000)y <- rnorm(1000)k <- kde2d(x,y,n=250)# Sample colors with alpha channelcol1 <- addalpha("red", 0.5)col2 <-"green"col3 <-addalpha("blue", 0.2)cols <- c(col1,col2,col3)# colorRampPalette ditches the alpha channel# colorRampPaletteAlpha does notcr1 <- colorRampPalette(cols)(32)cr2 <- colorRampPaletteAlpha(cols, 32)par(mfrow=c(1,2))plot(x, y, pch=16, cex=0.3)image(k\$x,k\$y,k\$z,col=cr1, add=T)plot(x, y, pch=16, cex=0.3)image(k\$x,k\$y,k\$z,col=cr2, add=T)# Linear vs. spline interpolationcr1 <- colorRampPaletteAlpha(cols, 32, interpolate='linear') # defaultcr2 <- colorRampPaletteAlpha(cols, 32, interpolate='spline')plot(x, y, pch=16, cex=0.3)image(k\$x,k\$y,k\$z,col=cr1, add=T)plot(x, y, pch=16, cex=0.3)image(k\$x,k\$y,k\$z,col=cr2, add=T)`

Hopefully other R programmers who work extensively with color and transparency will find these functions useful.

4 thoughts on “colorRampPaletteAlpha() and addalpha() – helper functions for adding transparency to colors in R”

1. Have you considered the function alpha in the package scales? May be of use in the described situations…
-s

2. Ah, from Wickham, of course. Strangely that did not come up in my searches. Thanks!

3. Sir, will you please write how to make an example barchart / any chart with these functions, it would help me very much, Dr.Samuel, Bangalore, India

4. I believe that R 3.1.0 will include an alpha option to do this type of functionality (http://stat.ethz.ch/R-manual/R-devel/doc/html/NEWS.html). Specifically: "colorRamp() and colorRampPalette() now allow non-opaque colours and a ramp in opacity via the new argument alpha = TRUE. (Suggested by Alberto Krone-Martins, but optionally as there are existing uses which expect only RGB values.)"