Transparent equivalent of given color
RColorsAlpha TransparencyR 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)