2 min read

Palettes of colors

A great function to generate palettes of colors is colorRampPalette from the grDevices package. This function takes a set of colors as argument and returns a function similar to grDevices::heat.colors and others that generates a palette of n contiguous colors, n being an argument of this function. The generation of the palette of colors is done by interpolation (spline or linear) and a good starting points for interpolation are the “sequential” and “diverging” palettes generated by RColorBrewer::brewer.pal (the limitation of RColorBrewer::brewer.pal being that the number of colors it can generate is limited to 9 maximum).

Let’s see an example plotting the population size of Vietnamese provinces. We want 11 sequential red colors but the maximum number of colors for the color set Reds in RColorBrewer is 9. The trick thus is to interpolate these 9 colors generated by RColorBrewer::brewer.pal to 11 using grDevices::heat.colors:

> (intial_colors <- RColorBrewer::brewer.pal(9, "Reds"))
[1] "#FFF5F0" "#FEE0D2" "#FCBBA1" "#FC9272" "#FB6A4A" "#EF3B2C" "#CB181D"
[8] "#A50F15" "#67000D"
> color_generator <- colorRampPalette(intial_colors)
> (color_palette <- color_generator(11))
 [1] "#FFF5F0" "#FEE4D8" "#FCC9B4" "#FCAA8E" "#FB8A69" "#FB6A4A" "#F14431"
 [8] "#D92522" "#BB1419" "#980B13" "#67000D"

Note that the first and last colors of the initial_colors and color_palette palettes are necessarily the same since color_palette is generated from intial_colors by interpolation. Once the palette of colors is generated, we can use it to draw our map:

> library(magrittr)
> library(sp)
> # devtools::install_github("choisy/censusVN2009")
> data("provinces", package = "censusVN2009")
> provinces$population %>%                   # divide population size by 100,000
+   cut(10^5 * seq(0, 55, length = 12)) %>%  # cuts into 11 categories
+   as.integer() %>%                         # transforms into integer
+   `[`(color_palette, .) %>%                # used as the index of color_palette
+   plot(provinces, col = .)                 # to generate the color vector for the plot