‘Previously in FES 720…’ we considered briefly how to change the colour of points and bars from the default of black to red. We also mentioned that there were several ways to refer to colours in R.
In this lesson, we will consider colour in more detail.
Most plotting functions, including the ones that we have used so far,
have an argument for color (usually col =
) that allows you to set the color/s of whatever you are plotting. As we have saw before, the easiest way to specify colour in R is by name.
Let’s make a simple plot to illustrate the use of colours. Plot a y
of 1:10 on a x
of 1:10. To make it easier to see the colours, set pch = 20
(filled circles), and cex = 4
, to make the points larger.
plot(1:10, 1:10, pch = 20, cex = 4)
The default colour is black. Make a new plot, but change the points to red.
plot(1:10, 1:10, pch = 20, cex = 4, col = 'red')
R has all the regularly-named colours, but also many others with more interesting names, such as ‘seashell’, ‘burlywood’, and ‘papayawhip’. You can see all the named colours with the functions colors()
and colours()
(See, R is bilingual, at least in some instances … ). Check them all out!
colours()
## [1] "white" "aliceblue" "antiquewhite"
## [4] "antiquewhite1" "antiquewhite2" "antiquewhite3"
## [7] "antiquewhite4" "aquamarine" "aquamarine1"
## [10] "aquamarine2" "aquamarine3" "aquamarine4"
## [13] "azure" "azure1" "azure2"
## [16] "azure3" "azure4" "beige"
## [19] "bisque" "bisque1" "bisque2"
## [22] "bisque3" "bisque4" "black"
## [25] "blanchedalmond" "blue" "blue1"
## [28] "blue2" "blue3" "blue4"
## [31] "blueviolet" "brown" "brown1"
## [34] "brown2" "brown3" "brown4"
## [37] "burlywood" "burlywood1" "burlywood2"
## [40] "burlywood3" "burlywood4" "cadetblue"
## [43] "cadetblue1" "cadetblue2" "cadetblue3"
## [46] "cadetblue4" "chartreuse" "chartreuse1"
## [49] "chartreuse2" "chartreuse3" "chartreuse4"
## [52] "chocolate" "chocolate1" "chocolate2"
## [55] "chocolate3" "chocolate4" "coral"
## [58] "coral1" "coral2" "coral3"
## [61] "coral4" "cornflowerblue" "cornsilk"
## [64] "cornsilk1" "cornsilk2" "cornsilk3"
## [67] "cornsilk4" "cyan" "cyan1"
## [70] "cyan2" "cyan3" "cyan4"
## [73] "darkblue" "darkcyan" "darkgoldenrod"
## [76] "darkgoldenrod1" "darkgoldenrod2" "darkgoldenrod3"
## [79] "darkgoldenrod4" "darkgray" "darkgreen"
## [82] "darkgrey" "darkkhaki" "darkmagenta"
## [85] "darkolivegreen" "darkolivegreen1" "darkolivegreen2"
## [88] "darkolivegreen3" "darkolivegreen4" "darkorange"
## [91] "darkorange1" "darkorange2" "darkorange3"
## [94] "darkorange4" "darkorchid" "darkorchid1"
## [97] "darkorchid2" "darkorchid3" "darkorchid4"
## [100] "darkred" "darksalmon" "darkseagreen"
## [103] "darkseagreen1" "darkseagreen2" "darkseagreen3"
## [106] "darkseagreen4" "darkslateblue" "darkslategray"
## [109] "darkslategray1" "darkslategray2" "darkslategray3"
## [112] "darkslategray4" "darkslategrey" "darkturquoise"
## [115] "darkviolet" "deeppink" "deeppink1"
## [118] "deeppink2" "deeppink3" "deeppink4"
## [121] "deepskyblue" "deepskyblue1" "deepskyblue2"
## [124] "deepskyblue3" "deepskyblue4" "dimgray"
## [127] "dimgrey" "dodgerblue" "dodgerblue1"
## [130] "dodgerblue2" "dodgerblue3" "dodgerblue4"
## [133] "firebrick" "firebrick1" "firebrick2"
## [136] "firebrick3" "firebrick4" "floralwhite"
## [139] "forestgreen" "gainsboro" "ghostwhite"
## [142] "gold" "gold1" "gold2"
## [145] "gold3" "gold4" "goldenrod"
## [148] "goldenrod1" "goldenrod2" "goldenrod3"
## [151] "goldenrod4" "gray" "gray0"
## [154] "gray1" "gray2" "gray3"
## [157] "gray4" "gray5" "gray6"
## [160] "gray7" "gray8" "gray9"
## [163] "gray10" "gray11" "gray12"
## [166] "gray13" "gray14" "gray15"
## [169] "gray16" "gray17" "gray18"
## [172] "gray19" "gray20" "gray21"
## [175] "gray22" "gray23" "gray24"
## [178] "gray25" "gray26" "gray27"
## [181] "gray28" "gray29" "gray30"
## [184] "gray31" "gray32" "gray33"
## [187] "gray34" "gray35" "gray36"
## [190] "gray37" "gray38" "gray39"
## [193] "gray40" "gray41" "gray42"
## [196] "gray43" "gray44" "gray45"
## [199] "gray46" "gray47" "gray48"
## [202] "gray49" "gray50" "gray51"
## [205] "gray52" "gray53" "gray54"
## [208] "gray55" "gray56" "gray57"
## [211] "gray58" "gray59" "gray60"
## [214] "gray61" "gray62" "gray63"
## [217] "gray64" "gray65" "gray66"
## [220] "gray67" "gray68" "gray69"
## [223] "gray70" "gray71" "gray72"
## [226] "gray73" "gray74" "gray75"
## [229] "gray76" "gray77" "gray78"
## [232] "gray79" "gray80" "gray81"
## [235] "gray82" "gray83" "gray84"
## [238] "gray85" "gray86" "gray87"
## [241] "gray88" "gray89" "gray90"
## [244] "gray91" "gray92" "gray93"
## [247] "gray94" "gray95" "gray96"
## [250] "gray97" "gray98" "gray99"
## [253] "gray100" "green" "green1"
## [256] "green2" "green3" "green4"
## [259] "greenyellow" "grey" "grey0"
## [262] "grey1" "grey2" "grey3"
## [265] "grey4" "grey5" "grey6"
## [268] "grey7" "grey8" "grey9"
## [271] "grey10" "grey11" "grey12"
## [274] "grey13" "grey14" "grey15"
## [277] "grey16" "grey17" "grey18"
## [280] "grey19" "grey20" "grey21"
## [283] "grey22" "grey23" "grey24"
## [286] "grey25" "grey26" "grey27"
## [289] "grey28" "grey29" "grey30"
## [292] "grey31" "grey32" "grey33"
## [295] "grey34" "grey35" "grey36"
## [298] "grey37" "grey38" "grey39"
## [301] "grey40" "grey41" "grey42"
## [304] "grey43" "grey44" "grey45"
## [307] "grey46" "grey47" "grey48"
## [310] "grey49" "grey50" "grey51"
## [313] "grey52" "grey53" "grey54"
## [316] "grey55" "grey56" "grey57"
## [319] "grey58" "grey59" "grey60"
## [322] "grey61" "grey62" "grey63"
## [325] "grey64" "grey65" "grey66"
## [328] "grey67" "grey68" "grey69"
## [331] "grey70" "grey71" "grey72"
## [334] "grey73" "grey74" "grey75"
## [337] "grey76" "grey77" "grey78"
## [340] "grey79" "grey80" "grey81"
## [343] "grey82" "grey83" "grey84"
## [346] "grey85" "grey86" "grey87"
## [349] "grey88" "grey89" "grey90"
## [352] "grey91" "grey92" "grey93"
## [355] "grey94" "grey95" "grey96"
## [358] "grey97" "grey98" "grey99"
## [361] "grey100" "honeydew" "honeydew1"
## [364] "honeydew2" "honeydew3" "honeydew4"
## [367] "hotpink" "hotpink1" "hotpink2"
## [370] "hotpink3" "hotpink4" "indianred"
## [373] "indianred1" "indianred2" "indianred3"
## [376] "indianred4" "ivory" "ivory1"
## [379] "ivory2" "ivory3" "ivory4"
## [382] "khaki" "khaki1" "khaki2"
## [385] "khaki3" "khaki4" "lavender"
## [388] "lavenderblush" "lavenderblush1" "lavenderblush2"
## [391] "lavenderblush3" "lavenderblush4" "lawngreen"
## [394] "lemonchiffon" "lemonchiffon1" "lemonchiffon2"
## [397] "lemonchiffon3" "lemonchiffon4" "lightblue"
## [400] "lightblue1" "lightblue2" "lightblue3"
## [403] "lightblue4" "lightcoral" "lightcyan"
## [406] "lightcyan1" "lightcyan2" "lightcyan3"
## [409] "lightcyan4" "lightgoldenrod" "lightgoldenrod1"
## [412] "lightgoldenrod2" "lightgoldenrod3" "lightgoldenrod4"
## [415] "lightgoldenrodyellow" "lightgray" "lightgreen"
## [418] "lightgrey" "lightpink" "lightpink1"
## [421] "lightpink2" "lightpink3" "lightpink4"
## [424] "lightsalmon" "lightsalmon1" "lightsalmon2"
## [427] "lightsalmon3" "lightsalmon4" "lightseagreen"
## [430] "lightskyblue" "lightskyblue1" "lightskyblue2"
## [433] "lightskyblue3" "lightskyblue4" "lightslateblue"
## [436] "lightslategray" "lightslategrey" "lightsteelblue"
## [439] "lightsteelblue1" "lightsteelblue2" "lightsteelblue3"
## [442] "lightsteelblue4" "lightyellow" "lightyellow1"
## [445] "lightyellow2" "lightyellow3" "lightyellow4"
## [448] "limegreen" "linen" "magenta"
## [451] "magenta1" "magenta2" "magenta3"
## [454] "magenta4" "maroon" "maroon1"
## [457] "maroon2" "maroon3" "maroon4"
## [460] "mediumaquamarine" "mediumblue" "mediumorchid"
## [463] "mediumorchid1" "mediumorchid2" "mediumorchid3"
## [466] "mediumorchid4" "mediumpurple" "mediumpurple1"
## [469] "mediumpurple2" "mediumpurple3" "mediumpurple4"
## [472] "mediumseagreen" "mediumslateblue" "mediumspringgreen"
## [475] "mediumturquoise" "mediumvioletred" "midnightblue"
## [478] "mintcream" "mistyrose" "mistyrose1"
## [481] "mistyrose2" "mistyrose3" "mistyrose4"
## [484] "moccasin" "navajowhite" "navajowhite1"
## [487] "navajowhite2" "navajowhite3" "navajowhite4"
## [490] "navy" "navyblue" "oldlace"
## [493] "olivedrab" "olivedrab1" "olivedrab2"
## [496] "olivedrab3" "olivedrab4" "orange"
## [499] "orange1" "orange2" "orange3"
## [502] "orange4" "orangered" "orangered1"
## [505] "orangered2" "orangered3" "orangered4"
## [508] "orchid" "orchid1" "orchid2"
## [511] "orchid3" "orchid4" "palegoldenrod"
## [514] "palegreen" "palegreen1" "palegreen2"
## [517] "palegreen3" "palegreen4" "paleturquoise"
## [520] "paleturquoise1" "paleturquoise2" "paleturquoise3"
## [523] "paleturquoise4" "palevioletred" "palevioletred1"
## [526] "palevioletred2" "palevioletred3" "palevioletred4"
## [529] "papayawhip" "peachpuff" "peachpuff1"
## [532] "peachpuff2" "peachpuff3" "peachpuff4"
## [535] "peru" "pink" "pink1"
## [538] "pink2" "pink3" "pink4"
## [541] "plum" "plum1" "plum2"
## [544] "plum3" "plum4" "powderblue"
## [547] "purple" "purple1" "purple2"
## [550] "purple3" "purple4" "red"
## [553] "red1" "red2" "red3"
## [556] "red4" "rosybrown" "rosybrown1"
## [559] "rosybrown2" "rosybrown3" "rosybrown4"
## [562] "royalblue" "royalblue1" "royalblue2"
## [565] "royalblue3" "royalblue4" "saddlebrown"
## [568] "salmon" "salmon1" "salmon2"
## [571] "salmon3" "salmon4" "sandybrown"
## [574] "seagreen" "seagreen1" "seagreen2"
## [577] "seagreen3" "seagreen4" "seashell"
## [580] "seashell1" "seashell2" "seashell3"
## [583] "seashell4" "sienna" "sienna1"
## [586] "sienna2" "sienna3" "sienna4"
## [589] "skyblue" "skyblue1" "skyblue2"
## [592] "skyblue3" "skyblue4" "slateblue"
## [595] "slateblue1" "slateblue2" "slateblue3"
## [598] "slateblue4" "slategray" "slategray1"
## [601] "slategray2" "slategray3" "slategray4"
## [604] "slategrey" "snow" "snow1"
## [607] "snow2" "snow3" "snow4"
## [610] "springgreen" "springgreen1" "springgreen2"
## [613] "springgreen3" "springgreen4" "steelblue"
## [616] "steelblue1" "steelblue2" "steelblue3"
## [619] "steelblue4" "tan" "tan1"
## [622] "tan2" "tan3" "tan4"
## [625] "thistle" "thistle1" "thistle2"
## [628] "thistle3" "thistle4" "tomato"
## [631] "tomato1" "tomato2" "tomato3"
## [634] "tomato4" "turquoise" "turquoise1"
## [637] "turquoise2" "turquoise3" "turquoise4"
## [640] "violet" "violetred" "violetred1"
## [643] "violetred2" "violetred3" "violetred4"
## [646] "wheat" "wheat1" "wheat2"
## [649] "wheat3" "wheat4" "whitesmoke"
## [652] "yellow" "yellow1" "yellow2"
## [655] "yellow3" "yellow4" "yellowgreen"
Did you see how long that vector is? 657! That is a lot of colours. However, there are not actually quite that many: As with colo[u]r, R also uses ‘gray’ and ‘grey’ equally (there are over 100 colours with grey/gray in their name), so these colour names are essentially duplicates. Even so, there are a lot.
The colours and names are derived from the X-Window System (X11), the GUI window system that most Macs and Linux OSs use. R uses the same colours on the MS Windows version of R, too.
We can use this vector of colours to randomly select a color for our points. Sample a single colour from the colors() vector for the col =
argument in the previous plot.
plot(1:10, 1:10, pch = 20, cex = 4, col = sample(colors(), 1))
Remember how we plotted each plot as a different colur in the Plotting_More_Data lesson? (col = 1:8
). Try that here.
plot(1:10, 1:10, pch = 20, cex = 4, col = 1:8)
We have ten points and eight colours. Once R goes through the eight colours 1:8, it recycles the vector and starts again at 1 (black). Ok, how about we pull out 8 random colours from colors()? Try that.
plot(1:10, 1:10, pch = 20, cex = 4, col = sample(colors(), 8))
Ok, so we have several hundred different colours to chouse from. What if your journal or book publisher of choice only prints in black and white or grayscale? There is a handy-dandy function to help you out: ‘gray()’!
The function gray()
takes two arguments, level =
, which varies from 1 (totally white) to 0 (totally black); and alpha =
, which varies from 0 (totally transparent) to 1 (totlay opaque). Use seq()
to plot the points ranging evenly from almost white (level = 0.9) to black over the ten points.
plot(1:10, 1:10, pch = 20, cex = 4, col = gray(level = seq(0.9, 0, length.out = 8)) )
So far, we have used names that link to specific pre-defined colours. But colour is more complex than that. Humans perceive colour when cone cells in the eye are stimulated by electomagnetic radiation in the visible spectrum of light. Humans usually have three kinds of cone cells, sensitive to different wavelengths of light: short (blue), medium (green), and long (red).
The color of any one thing therefore depends on the wavelength of light that is reflected by that object, and influenced by physical properties of the object, such as its surface, transmission, and/or emission properties.
‘Spectral colours’, therefore, are defined by a specific wavelength, ranging from 400 nm (violet) to 700 nm (red). Reproducing specific wavelengths in print, photography, television, and other media, would be incredibly technologically challenging and expensive.
However, many light sources are defined not by single wavelength, but by a mixture of wavelengths of light. The human eye cannot distinguish these mixtures from single-wavelength sources. Thus, red and green mixed in the right proportions stimulates human eye cone cells identically to the spectral color orange.
Most human color perceptions can therefore be generated with a mixture of the three primary colors: either red, green, and blue (for additive colouring, used on TVs and computer screens), or yellow, magenta, cyan and black (under subtractive coloring, used in printing).
For example, in a computer, a color is a mix between 3 main colors: Red, Green and Blue. Each pixel on the screen is constituted with 3 points that are too small for the Human eye to see, one of each colors, each color being more or less strong.
There are a number of different color models used to define color. The RGB model is based on the relative proportions of the three primary colours, red, green, and blue. The most common implementation of the RGB model uses 256 levels of color each for red, green, and blue. Because each of R, G, and B can have one of these 256 levels, the total number of colours available in this system is 256 × 256 × 256 ≈ 16.7 million colors. That’s a few more than 657 named colours in R …
However, each named colour in the 657 available colours is defined by a specific RGB value.
The R function col2rgb()
can be used to extract the RGB components of a named color. Try that for the named colour ‘yellow’.
col2rgb('yellow')
## [,1]
## red 255
## green 255
## blue 0
And ‘papayawhip’ …
col2rgb('papayawhip')
## [,1]
## red 255
## green 239
## blue 213
Because this RGB notation is not very user-friendly, computer scientists decided to use an even less user-friendly system, based on hexidecimal (a numbering system with a base of 16, in contrast to our decimal numbering system with base 10).
Each three-digit color value (000–256) is represented by a two-digit hexidecimal number ranging from 00 to FF. So, the nine-digit RGB value can be represented by a six-digit ‘hex triplet’.
This hex triplet is returned if we use the rgb()
function to generate the color yellow. The rgb()
requires the r
, g
, and b
values, and also the maxColorValue =
set to 255. Try that now.
rgb(255, 255, 0, maxColorValue = 255)
## [1] "#FFFF00"
Many of the lists of R colours you will find online list their names, hex triplet, and RGB values. This one is a good example: http://research.stowers.org/mcm/efg/R/Color/Chart/ColorChart.pdf.
You can also define any one of the 16 million other colours you like … But how on earth do you go about doing that?
Luckily, as described in the lecture, some folks have made up some nice palettes of colours. A palette is essentially a vector of colours defined as a special palette
object. We will begin by looking at the default palette that is loaded when R starts up. Type palette()
in the Console.
palette()
## [1] "black" "red" "green3" "blue" "cyan" "magenta" "yellow"
## [8] "gray"
This gives you a vector of eight colours, that match the colors plotted in our previous use of col = 1:8
. Because this palette is loaded in R, we can access the colours within it using numbers (i.e., we can index the palette).
The default palette is not that exciting, although it does illustrate all the colours of the RGB and CYMK colours.
We can define a palette of any colors that we like. Using the palette()
function, set a palette of red, papayawhip, seashell, and burlywood.
palette(c('red', 'papayawhip', 'seashell', 'burlywood'))
Now use numbers to pass these colours to the points in the example plot. You will need to change the maximum value from 8 to 4 (because we only have 4 colours in the new palette).
plot(1:10, 1:10, pch = 20, cex = 4, col = 1:4)
Changing the default palette applies to all future palettes. To reset to the default palette, run palette('default')
.
palette('default')
Now, we could instead assign our new palette to another object name, such as pal_new. Try that.
pal_new <- palette(c('red', 'papayawhip', 'seashell', 'burlywood'))
Now was can access this new palette by passing the palette name to the col =
argument of plot()
. Try that, reversing the order of colors, from 4:1, so that the plot looks different to the previous one.
plot(1:10, 1:10, pch = 20, cex = 4, col = pal_new[4:1])
Great, so you can set up a palette of a set of colours. These colours can either be the pre-defined named colours, or s vector of hex-triplets.
However, what about if you want to actually generate a series of colours that follow a specific pattern, or are not in the pre-defined named list?
R has several pre-defined palettes from which you can generate a set of colours. These palettes include rainbow()
, heat.colors()
, topo.colors()
, and `terrain.colors(), as illustrated in the figure.
temp <- c(5,7,6,4,8)
par(mfrow = c(2,2) )
barplot(temp, col=rainbow(5), main="rainbow")
barplot(temp, col=heat.colors(5), main="heat.colors")
barplot(temp, col=terrain.colors(5), main="terrain.colors")
barplot(temp, col=topo.colors(5), main="topo.colors")
These palettes can be used simply to generate the required number of colours by setting the n =
argument within each palette function. Set each colour in our example plot to one of a sequence of 10 colours from heat.colors()
. You could create these colours first and then pass that object to the col =
argument of plot(), but try and keep it all in one line of code.
plot(1:10, 1:10, pch = 20, cex = 4, col = heat.colors(10))
There are several other packages that provide palettes available. The Wes Anderson color palettes are derived from the color schemes of various movies directed by Wes Anderson … https://github.com/karthik/wesanderson#wes-anderson-palettes.
As we discussed in the lecture, color schemes that visualize data in a clear and distinguishable manner, where the colours indicate properties of the data can be useful.
The R ColorBrewer package contains three different kinds of palettes that are designed to provide information about the underlying data: qualitative, diverging, and sequential. http://www.colorbrewer2.org.
The palettes are composed of 8–12 distinct colors, but if you have more than 12 categories to plot, you can use the colorRampPalette()
function with any of the sequential or diverging palettes. This ramps the color at the necessary interval to create as many hues as your data calls for.
Qualitative palettes employ different hues to create visual differences between classes, but provide little or no suggestion of order or sequence. These palettes are suggested for nominal or categorical data sets.
library(RColorBrewer)
display.brewer.all(type = 'qual')
Sequential palettes move from light to dark. Light colors represent low data values and dark colors represent high data values.
display.brewer.all(type = 'seq')
Diverging palettes are composed of darker colors of contrasting hues on the high and low extremes and lighter colors in the middle.
display.brewer.all(type = 'div')