Transparent equivalent of given color

RColorsAlpha Transparency

R Problem Overview


I've had this a few times, so here goes: I'm making some plots which hold curves with estimates of a parameter given a tuning parameter.

Typically, I also have SDs for each estimated value, so I could show error bars around each of them.

However, I don't like error bars, and would prefer some smoothed version of it. This is in itself no problem (ie I know how to do this). However, my plot contains several of these similar curves, each one in its own color. So I would like to add the 'smoothed errorregion' to each curve in a color that matches the color of the curve itself. Of course, I would like to do this somewhat transparently, so I can still see the other curves through the 'error region'.

So, my question is: given a color (specified by either a number, a name or an rgb value --- note the first two pose an extra problem, but this is occurring rather often, as the basic plotting functions take these as valid color values), how can I find find the matching color that has the same rgb but a different (given) alpha level (transparency). I would like a function like:

makeTransparent<-function(someColor, alpha=100)
{
  newColor<-someColor + alpha #I wish
  return(newColor)
}

This should work for things like:

makeTransparent(2)
makeTransparent("red")
makeTransparent(rgb(0,0,1))

Edit I hate it when I miss something obvious, but @themel pointed me to it (thx again). Here's a full solution (note: works vectorized, so you can pass more than one color; only one alpha is supported at this time though):

#note: always pass alpha on the 0-255 scale
makeTransparent<-function(someColor, alpha=100)
{
  newColor<-col2rgb(someColor)
  apply(newColor, 2, function(curcoldata){rgb(red=curcoldata[1], green=curcoldata[2],
    blue=curcoldata[3],alpha=alpha, maxColorValue=255)})
}

R Solutions


Solution 1 - R

There is a function adjustcolor in grDevices package, that works like this in your case:

    adjustcolor( "red", alpha.f = 0.2)

Solution 2 - R

Have you had a look at ?rgb?

> Usage: >
> rgb(red, green, blue, alpha, names = NULL, maxColorValue = 1) >
> An alpha transparency value can also be specified (as an opacity, > so ‘0’ means fully transparent and ‘max’ means opaque). If > alpha’ is not specified, an opaque colour is generated.

The alpha parameter is for specifying transparency. col2rgb splits R colors specified in other ways into RGB so you can feed them to rgb.

Solution 3 - R

I think is more common to specify alpha in [0,1]. This function do that, plus accept several colors as arguments:

makeTransparent = function(..., alpha=0.5) {
  
  if(alpha<0 | alpha>1) stop("alpha must be between 0 and 1")
  
  alpha = floor(255*alpha)  
  newColor = col2rgb(col=unlist(list(...)), alpha=FALSE)
  
  .makeTransparent = function(col, alpha) {
    rgb(red=col[1], green=col[2], blue=col[3], alpha=alpha, maxColorValue=255)
  }
  
  newColor = apply(newColor, 2, .makeTransparent, alpha=alpha)
  
  return(newColor)
  
}

And, to test:

makeTransparent(2, 4)
[1] "#FF00007F" "#0000FF7F"
makeTransparent("red", "blue")
[1] "#FF00007F" "#0000FF7F"
makeTransparent(rgb(1,0,0), rgb(0,0,1))
[1] "#FF00007F" "#0000FF7F"

makeTransparent("red", "blue", alpha=0.8)
[1] "#FF0000CC" "#0000FFCC"

Solution 4 - R

Converting valuable comment to answer:

Use alpha from package scales - first argument is colour, second alpha (in 0-1 range).

Or write function overt it:

makeTransparent <- function(someColor, alpha=100) scales::alpha(someColor, alpha/100)

Solution 5 - R

Easily convert hexidecimal colour codes like so

adjustcolor("#F8766D", alpha.f = 0.2)
[1] "#F8766D33"

To confirm it worked:

library(scales)
show_col(c("#F8766D", "#F8766D33"))

enter image description here

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNick SabbeView Question on Stackoverflow
Solution 1 - RStepan S. SushkoView Answer on Stackoverflow
Solution 2 - RthemelView Answer on Stackoverflow
Solution 3 - RRicardo Oliveros-RamosView Answer on Stackoverflow
Solution 4 - RMarekView Answer on Stackoverflow
Solution 5 - RstevecView Answer on Stackoverflow