(This article was first published on

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.**everyday analytics**, and kindly contributed to R-bloggers)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.ca

library(MASS)

library(RColorBrewer)

# Source the colorRampAlpha file

source ('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 example

x <- seq.int(0, 2*pi, length=1000)

y <- sin(x)

plot(x, y, col=addalpha(rep("red", 1000), abs(sin(y))))

# with RColorBrewer

x <- 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 data

x <- rnorm(1000)

y <- rnorm(1000)

k <- kde2d(x,y,n=250)

# Sample colors with alpha channel

col1 <- addalpha("red", 0.5)

col2 <-"green"

col3 <-addalpha("blue", 0.2)

cols <- c(col1,col2,col3)

# colorRampPalette ditches the alpha channel

# colorRampPaletteAlpha does not

cr1 <- 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 interpolation

cr1 <- colorRampPaletteAlpha(cols, 32, interpolate='linear') # default

cr2 <- 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.

To

**leave a comment**for the author, please follow the link and comment on his blog:**everyday analytics**.R-bloggers.com offers

**daily e-mail updates**about R news and tutorials on topics such as: visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...