1.6.3 度量调整
度量用于控制变量映射到视觉对象的具体细节,比如:X轴和Y轴、alpha(透明度)、colour(轮廓色、)fill(填充颜色)、linetype(线形状)、shape(形状)等,它们都有相应的度量函数,如表1-6-3所示。根据视觉通道映射的变量属性,将度量调整函数分成数值型和类别型两大类。R ggplot2的默认度量为scale_×××_identity()。需要注意的是:scale_*_manual()表示手动自定义离散的度量,包括colour、fill、alpha、linetype、shape和size等视觉通道映射参数。
表1-6-3 ggplot2常见度量调整函数
在表1-6-3中,X轴和Y轴度量是控制坐标轴的间隔与标签的显示等信息,会在1.6.4节时再进行详细介绍。颜色作为数据可视化中尤为重要的部分,colour和fill会在1.7节时再进行详细介绍。在实际的图表绘制中,我们很少使用,因为这很难观察到透明度的映射变化。每个度量调整函数的具体参数可以使用RStudio的“help”界面或者查看ggplot2的官方手册。
图1-6-9为散点图不同度量的调整效果,图1-6-9(a)是将数值离散型变量age映射到气泡的大小(size),再使用scale_size(range=c(a, b))调整了散点大小(size)的度量,range表示视觉通道映射变量转化后气泡面积的映射显示范围。图1-6-9(b)是在图1-6-9(a)的基础上添加了颜色的映射,使用scale_fill_distiller(palette="Reds")函数将数值离散型变量age映射到红色渐变颜色条,其中,direction= 0表示颜色是从浅到深渐变的(注意:需要加载RColorBrewer包,才能使用“Reds”颜色主题)。图1-6-9(c)是将类别离散型类别变量Class映射到不同的填充颜色(fill)和形状(shape),使用scale_*_manual()手动自定义fill和shape的度量。图1-6-9(d)是将数值离散型变量age和类别离散型变量Class分别映射到散点的大小(size)和填充颜色(fill),然后scale_size()和scale_fill_manual()分别调整气泡大小(size)的映射范围与填充颜色(fill)的颜色数值。
图1-6-9 不同的度量调整效果
关键是,要学会合理地使用视觉通道映射参数,并调整合适的度量。可视化最基本的形式就是简单地把数据映射成彩色图形。它的工作原理就是大脑倾向于寻找模式,你可以在图形和它所代表的数字间来回切换。1985年,AT&T贝尔实验室的统计学家威廉·克利夫兰(William Cleveland)和罗伯特·麦吉尔(Robert McGill)发表了关于图形感知和方法的论文[18]。研究焦点是确定人们理解上述视觉暗示(不包括形状)的精确程度,最终得出如图1-6-10所示的数值型数据使用不同视觉暗示的精确程度排序。
图1-6-10 克利夫兰和麦吉尔的视觉暗示排序[18]
我们能用到的视觉暗示通常有长度、面积、体积、角度、弧度、位置、方向、形状和颜色(色相和饱和度)。所以正确地选择哪些视觉暗示就取决于你对形状、颜色、大小的理解,以及数据本身和目标。不同的图表类型应该使用不同的视觉暗示,合理的视觉暗示组合能更好地促进读者理解图表的数据信息。如图1-6-11所示,相同的数据系列采用不同的视觉暗示的组合共有6种,分析结果如表1-6-4所示。
表1-6-4 图1-6-11系列图表的视觉暗示组合分析结果
图1-6-11 不同视觉暗示的组合结果
根据表1-6-4可知,图1-6-11 (f)是最优的视觉暗示组合结果,既能保证很容易区分数据系列,也保证图表很美观,同时也适应于彩色与黑白两种印刷方式。当图1-6-11(f)采用黑白印刷时,色相视觉暗示会消除,只保留位置+方向+形状,如图1-6-11(c)所示,但是这样也能容易区分数据系列,保证读者正确、快速地理解数据信息。表1v6-5展示了图1-6-11系列图表的视觉暗示组合代码与说明。
表1-6-5 图1-6-11系列图表的视觉暗示组合代码与说明
在表1-6-5中,我们需要重点理解fill、color、size、shape等视觉通道映射参数的具体位置,何时应该在aes()内部,何时应该在aes()外部的区别。
●当我们指定的视觉通道映射参数需要进行个性化映射时(即一一映射),应该写在aes()函数内部,即每一个观测值都会按照我们指定的特定变量值进行个性化设定。典型情况是需要添加一个维度,将这个维度按照颜色、大小、线条等方式针对维度向量中每一个记录值进行一一设定。
●当我们需要统一设定某些图表元素对象(共性,统一化)时,此时应该将其参数指定在aes()函数外部,即所有观测值都会按照统一属性进行映射,例如size=5, linetype="dash",color="blue"。典型情况是需要统一所有点的大小、颜色、形状、透明度,或者线条的颜色、粗细、形状等。这种情况下不会消耗我们数据源中的任何一个维度或者度量指标,仅仅是对已经呈现出来的图形元素的外观属性做了统一设定。