[R] rgb and col2rgb color conversion/modification/shading

Paul Murrell p.murrell at auckland.ac.nz
Wed Aug 2 04:13:46 CEST 2006


Hi


Earl F. Glynn wrote:
> <ccarey at fhcrc.org> wrote in message 
> news:1154392412.44cea15c0c1fa at webmail.fhcrc.org...
>> I want to get a lighter shade of a color...I have a lot of colored objects 
>> and
>> want each one printed as a foreground against a slightly lighter 
>> background.
>>
>> I thought I could try something like changing the alpha channel by first
>> converting it to rgb.
> 
> I'm not sure what you want to do with the alpha channel - it's sometimes 
> used for transparency, especially on Macs, but is not used much on PCs 
> (AFAIK).
> 
> 
> 
> Let's say you want different shades of gold:
> 
>> colors()[142]
> 
> [1] "gold"
> 
> 
> 
> Instead of RGB color space perhaps you should consider HSV 
> (Hue-Saturation-Value) color space.


Or, use a perceptually-based colour space like HCL (Hue Chroma
Luminance);  see the hcl() function and the 'colorspace' package for one
way to convert from RGB.

Paul


> Let's convert "gold" to rgb to hsv:
> 
> 
> 
>> col2rgb( colors()[142] )
> 
>       [,1]
> 
> red    255
> 
> green  215
> 
> blue     0
> 
> 
> 
>> rgb2hsv( col2rgb( colors()[142] ) )
> 
>        [,1]
> 
> h 0.1405229
> 
> s 1.0000000
> 
> v 1.0000000
> 
> 
> 
> The "hue" (h) is the color ranging from 0 to 1 around a color circle (with 
> red= 0 or 1).  Find h = 0.140 ("gold") in this color circle:
> 
> 
> 
> hue <- seq(0.0, 1.0, by=1/40)
> 
> 
> 
> pie(rep(1,40),
> 
>     labels=formatC(hue, digits=3, format="f"), cex=0.75,
> 
>     col=hsv(hue, 1.0, 1.0),
> 
>     radius=1.0,
> 
>     main="HSV (S=1, V=1)" )
> 
> 
> 
> 
> Hues range from 0.0 to 1.0.
> 
> 
> 
> 
> A color is saturated (s=1) when it is "far" from a shade of gray (ranging 
> from black to white).  Grays are unsaturated (no color) colors with s = 0. 
> Saturation ranges from 0.0 to 1.0.
> 
> 
> 
> The value (v) is the brightness of the color.  Low values appear quite dark 
> but still have color.  v=1 is as bright as possible.   Values range from 0.0 
> to 1.0.
> 
> 
> 
> You can get different "shades" of the same color by varying changing the 
> saturation and value for a given hue.  The hsv function returns the RGB 
> color in hex form.
> 
> 
> 
> Consider:
> 
>> hsv(0.1405, 1, 1)
> 
> [1] "#FFD700"
> 
> 
> 
> Hex FF = decimal 255 = red
> 
> Hex D7 = decimal 215 = green
> 
> Hex 00 = decimal 0 = blue
> 
> 
> 
> Let's vary Saturation from 0.0 to 1.0 and Value from 0.0 to 1.0 in this 
> plot:
> 
> 
> 
> 
> 
> MakeHSVRectangle <- function(saturation, value)
> 
> {
> 
>   GoldHue <- 0.140
> 
>   color <- hsv(GoldHue, saturation, value)
> 
>   rect(100*saturation, 100*value, 100*saturation+4, 100*value+4, col=color)
> 
> }
> 
> 
> 
> 
> 
> plot(0:110,0:110, type="n",
> 
>      xlab="Saturation[%]", ylab="Value[%]",
> 
>      main="Shades of Gold, H=0.140")
> 
> outer(seq(0.0, 1.0, 0.05), seq(0.0, 1.0, 0.05), MakeHSVRectangle)
> 
> 
> 
> 
> 
> With Value = 0, all colors are "black".  With Saturation=0, the only 
> "colors" along the y axis are the shades of gray.  The original "gold" 
> rectangle is at the upper right.
> 
> 
> 
> So, given a starting color, you have a number of "shades" (various 
> saturations and values) with the same color hue.
> 
> 
> 
> I hope this helps.
> 
> 
> 
> efg
> 
> Earl F. Glynn
> 
> Scientific Programmer
> 
> Stowers Institute for Medical Research
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

-- 
Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
Auckland
New Zealand
64 9 3737599 x85392
paul at stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/



More information about the R-help mailing list