颜色标度
除了位置标度以外,常用的图形属性可能就是颜色了。有相当多的方法用来将数值映射为颜色:对连续型值有4种基于渐变的方法,对离散型值有2种方法
不过在研究每种方法的细节之前,可以先了解以下色彩学理论
在物理层面,颜色是由不同波长的光混合而成的。人类的眼球只有3种不同的颜色感受器,于是可以仅用3个数字来表示任意颜色
RGB编码的色彩空间使用红、绿、蓝三种光的光强来表示一种颜色。这个空间的一个问题在于,它在视觉感知上并不均匀:两个间隔一个单位的颜色可能看起来非常像,但又可能非常不像,这取决于它们在这个色彩空间中的位置。这使得创建从连续变量到颜色集的映射变得十分困难
HCL色彩空间的现代方案:由色相(hue)、彩度(chroma)和明度(luminance)
- 色相 是一个0和360之间的(角度)值,它将一种色彩赋以“颜色”属性,如蓝、红、橙等
- 彩度 指色彩的纯度。彩度为0是灰色,彩度的最大值随明度的变化而不同
- 明度 指颜色的明暗程度。明度的高低,要看其接近白色或黑色的程度而定。明度0为黑,明度1为白
色相不是按顺序排序的:例如,绿色不会比红色看起来更“大”。彩度和明度是按顺序来理解的
这三部分组合生成的空间形状并不简单
每个分面中的明度(亮度)是一个常数,色相被映射为角度,彩度被映射为半径。可以看到,每个分面的中心均为灰色,距离边缘跃进,颜色也越浓烈
另一个问题是,很多人(约为人群中的10%)不具有功能健全的颜色感受器,因而只能分辨出相对较少的颜色。简而言之,最好避免使用红-绿对比,并且要使用可以模拟色盲情景的系统来检查图形
Visicheck就是一种在线解决方案,另外一种选择是使用dichromat包,它提供了模拟色盲情景的工具,并且自带了若干套已知对色盲亦可正常工作的配色方案
1. 连续型
颜色渐变通常用于展示二维表面的高度
erupt <- ggplot(faithfuld, aes(waiting, eruptions, fill = density)) + geom_raster() +
scale_x_continuous(NULL, expand = c(0, 0)) +
scale_y_continuous(NULL, expand = c(0, 0)) +
theme(legend.position = "none")
共有4类连续型颜色梯度(即渐变色)
- scale_color_gradient()和scale_fill_gradient():双色梯度,从低到高(浅蓝到深蓝)。这是连续颜色默认的标度,和scale_color_continuous()是一样的。参数low和high用以控制此梯度两端的颜色。一般来说,对于连续的颜色梯度,想保持色相为常数,彩度和明度则是变量。蒙塞尔(Munsell)色彩系统提供了一种简单的方式来指定基于它们色相的颜色、彩度和明度。使用munsell::hue_slice(“5Y”)来查看给定的色相所对应的合理的彩度和明度
erupt
erupt + scale_fill_gradient(low = "white", high = "black")
erupt + scale_fill_gradient(low = munsell::mnsl("5G 9/2"), high = munsell::mnsl("5G 6/8"))
- scale_color_gradient2()和scale_fill_gradient2():三色梯度。顺序为低-中-高(红-白-蓝)。参数low和high的作用同上,这两种标度还在中点处拥有一个中间色(mid)。中点的默认值为0,但也可以使用参数midpoint将其设置为任意值
mid <- median(faithfuld$density)
erupt + scale_fill_gradient2(midpoint = mid)
- scale_color_gradientn()和scale_fill_gradientn():自定义的n色梯度。这在颜色能够代表数据的特征是很有用,也可以直接使用另外一些包产生的调色板
erupt + scale_fill_gradientn(colors = terrain.colors(7))
erupt + scale_fill_gradientn(colors = colorspace::heat_hcl(7))
erupt + scale_fill_gradientn(colors = colorspace::diverge_hcl(7))
默认情况下,colors会沿着数据的范围均匀地分布在数据上。为了让它们不均匀地分布,参数values应在0和1之间取值
4. scale_color_distiller()和scale_fill_gradient()应用ColorBrewer颜色标度到连续的数据中。可以按照与scale_fill_brewer()相同的方式使用它
erupt + scale_fill_distiller()
erupt + scale_fill_distiller(palette = "RdPu")
erupt + scale_fill_distiller(palette = "Yl0rBr")
所有连续颜色标度有一个na.value参数来控制什么颜色用于缺失值(包括在标度范围之外的值)。默认情况下,把它设置为灰色,当设置为一个五彩的颜色时它会变得很显眼。如果使用一个黑色和白色标度,可能想把它设为其它值,让它看起来更明显
df <- data.frame(x = 1, y = 1:5, z = c(1, 3, 2, NA, 5))
p <- ggplot(df, aes(x, y)) + geom_tile(aes(fill = z), size = 5)
p
# 让缺失值颜色不可见
p + scale_fill_gradient(na.value = NA)
# 在黑色和白色标度上定制
p + scale_fill_gradient(low = "black", high = "white", na.value = "red")