[R] Opposite color in R

Franklin Bretschneider bretschr at xs4all.nl
Sun Jul 26 17:53:05 CEST 2015


Dear Atte Tenkanen,


Re:
> Hi,
> 
> I have tried to find a way to find opposite or complementary colors in R.
> 
> I would like to form a color circle with R like this one: http://nobetty.net/dandls/colorwheel/complementary_colors.jpg
> 
> If you just make a basic color wheel in R, the colors do not form complementary color circle:
> 
> palette(rainbow(24))
> Colors=palette()
> pie(rep(1, 24), col = Colors)
> 
> There is a package ”colortools” where you can find function opposite(), but it doesn’t work as is said. I tried
> 
> library(colortools)
> opposite("violet") and got green instead of yellow and
> 
> opposite("blue") and got yellow instead of orange.
> 
> Do you know any solutions?
> 
> Atte Tenkanen


Actually, yellow and blue are complementary colours, but red and green aren't. 

The human visual system has three types of cones: red-sensitive, green-sensitive and blue-sensitive.
(the labels are approximate, e.g. red-sensitive cones have their optimum sensitivity at a wavelength we might call orange, but for understanding colours, R-G-B is the useful standard designation).
A certain combination of these three together, such as in sunlight, is seen as white. In the digital domain, the three "colour channels" of an image are usually scaled to 8-bit numbers, i.e. from zero up to and including 255. So, all three channels 255 makes white.

Leaving one of the three colors out yields yellow (no blue), magenta (no green) and cyan (no red). The pairs yellow-blue, magenta-green and cyan-red  are truly complementary colours.

Colours are the result of the wavelength of the light, so one would expect colours to lie on a linear scale, from about 700 nm (red), through 550 (green) to about 440 nm (blue).

There is a complication, however: the photosensitive pigment of our red cones has a second action peak past that of the blue cones, so past pure blue we see a sort of reddish blue, in other words violet or purple. Therefore, the colours can be plotted in a circle, where violet and purple fill the gap between blue and red.

Using a combination of the three ground colors R, G and B, any desired colour shade can be composed. Orange, for example, consists of (approximately) all red and half green. 

- - - - - - - - -

R has ample possibilities to compose colours or colour palettes, with which one can create (almost continuous) gradients or stepwise colour patches.
Examples are col2rgb():

>col2rgb("orange")
      [,1]
red    255
green  165
blue     0

>col2rgb("violet")
      [,1]
red    238
green  130
blue   238

Cindy Brewer wrote a fine set of colour functions, adapted to R by Erich Neuwirth. See package "RColorBrewer".

And much can be done with the standard R distribution:
 
The following code plots a some colours in a circle, with the complementary colours at opposite sides (so crudely what you're after):


# define colour triplets
reds =   c( 255, 255,  255,    0,    0,    0,    0,  128)
greens = c(   0, 127,  255,  255,  255,  127,    0,    0)
blues=   c(   0,   0,    0,    0,  255,  255,  255,  255)
n = length(reds)
#  compute circle to plot in
stp = 2*pi/n
th = seq(0,2*pi-stp, length.out=n)
x = cos(th); y=sin(th)
#  plot (on a Mac, for other OSses call the appropriate grahics window
quartz(w=5, h=5)
par(xpd=NA)
plot(x,y,pch=15, cex=8, col=rgb(reds, greens, blues, maxColorValue = 255), asp=1, axes=FALSE, xlab='', ylab='')
points(x,y,pch=0, cex=8, col="black")
# arrows connect the complementary colours
arrows(0,0, 0.7*x, 0.7*y, length = 0.25, col = "grey")

Hope this helps;
Best wishes,


Frank
------

Franklin Bretschneider
Dept of Biology
Utrecht University
bretschr at xs4all.nl



More information about the R-help mailing list