[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