1.6.4 坐标系
在编码数据的时候,需要把数据系列放到一个结构化的空间中,即坐标系,它赋予X轴、Y轴坐标或给出经纬度表示的意义。图1-6-12展示了三种常用的坐标系,分别为直角坐标系(rectangular coordinate)、极坐标系(polar coordinate)和地理坐标系(geographic coordinate)。它们几乎可以满足数据可视化的所有需求。
图1-6-12 常用坐标系
1.直角坐标系
直角坐标系,也叫作笛卡儿坐标系,是最常用的坐标系,如图1-6-13所示。你平时经常绘制的条形图、散点图或气泡图,就是直角坐标系。坐标系所在平面叫作坐标平面,两坐标轴的公共原点叫作直角坐标系的原点。X轴和Y轴把坐标平面分成四个象限,右上方的叫作第一象限,其他三个部分按逆时针方向依次叫作第二象限、第三象限和第四象限。象限以数轴为界,横轴、纵轴上的点不属于任何象限。通常在直角坐标系中的点可以记为:(x, y),其中x表示X轴的数值,y表示Y轴的数值。
图1-6-13 直角坐标系下的散点图和气泡图
ggplot2的直角坐标系包括coord_cartesian()、coord_fixed()、coord_flip()和coord_trans()四种类型。ggplot2中默认类型为coord_cartesian(),其他坐标系都是通过直角坐标系画图,然后变换过来的。在直角坐标系中,可以使用coord_fixed()固定纵横比,在绘制华夫饼图和复合型散点饼图时,我们需要使纵横比为1:coord_fixed(ratio = 1);
我们在绘制条形图或者水平箱形图时,需要使用coord_flip()翻转坐标系。它会将X轴和Y轴坐标对换,从而可以将竖直的柱形图转换成水平的条形图。
原始的直角坐标上,坐标轴上的刻度比例尺是不变的,而coord_trans()坐标系的坐标轴上刻度比例尺是变化的,这种坐标系应用很少,但不是没用,可以将曲线变成直线显示。如果数据点在某个轴方向的密集程度是变化的,不便于观察,则可以通过改变比例尺来调节,使数据点集中显示,更加方便观察。
三维直角坐标系的投影方法在绘图软件中,三维直角坐标系中有投影这个参数:正交投影(orthographic projection)和透视投影(perspective projection),如图1-6-14所示。读者的眼睛就好比三维渲染场景中的相机。而相机存在两种投影方法。一种是正交投影,也叫平行投影(parallel projection),即进入相机的光线与投影方向是平行的。另一种是透视投影,即所有的光线相交于一点。不管是plot3D包还是lattice包的三维图表绘制函数,都存在这样一个参数可以调整三维坐标系的透视程度,这个参数对三维图表美观程度的展示尤为重要。
图1-6-14 两种不同形式的投影方法
直角坐标系还可以扩展到多维空间。例如,三维空间可以用(x, y, z)三个值对来表示三维空间中数据点的位置。如果再拓展到平行坐标系(parallel coordinate),则可以用于对高维几何和多元数据的可视化,这时,我们可以使用R中GGally包的ggparcoord()函数实现平行坐标系的绘制。
2.极坐标系
你平时使用的雷达图、饼图等就是极坐标系。尽管你可能只用到了角度,还没有用到半径,图1-6-15为极坐标下的柱形图(南丁格尔玫瑰图)。
图1-6-15 极坐标下的柱形图
极坐标系是指在平面内由极点、极轴和极径组成的坐标系。在平面上取定一点O,称为极点。从O出发引一条射线Ox,称为极轴。再取定一个单位长度,通常规定角度取逆时针方向为正。这样,平面上任一点P的位置就可以用线段OP的长度ρ,以及从Ox到OP的角度θ来确定,有序数对(ρ, θ)就称为P点的极坐标,记为P (ρ, θ); ρ称为P点的极径,指数据点到圆心的距离;θ称为P点的极角,指数据点距离最右边水平轴的角度。
极坐标系的最右边点是零度,角度越大,逆时针旋转越多。距离圆心越远,半径越大。极坐标系在绘图中没有直角坐标系用得多,但在角度和方向两个视觉暗示方面有很好的优势,往往可以绘制出很出人意料的精美图表。
R ggoplot2使用coord_polar()函数可以将坐标系从直角坐标系转换到极坐标系,具体语句为:coord_polar(theta = "x", start = 0, direction = 1, clip = "on"),其中,theta表示要极坐标化的中心轴,即X轴转化为圆周,Y轴转化为半径;direction表示排列方向,direction=1表示顺时针,direction=-1表示逆时针;start表示起始角度,以距离12点针的弧度衡量,具体位置与direction参数有关,若direction为1则在顺时针start角度处,若direction为-1则在逆时针start角度处。注意:极坐标转化比较耗费计算机资源,最好先用如下语句清空内存:rm(list = ls()); gc()。
3.地理坐标系
位置数据的最大好处就在于它与现实世界的联系,用地理坐标系可以映射位置数据。位置数据的形式有许多种,包括经度(longitude)、纬度(latitude)、邮编等。通常用纬度和经度来描述相对于赤道和子午线的角度。纬度线是东西向的,标识地球上的南北位置;经度线是南北向的,标识地球上的东西位置。相对于直角坐标系,纬度就好比水平轴,经度就好比垂直轴。也就是说,相当于使用了平面投影。
由于球面上任何一点的位置都是用地理坐标经纬度(λ, φ)表示的,而平面上的点的位置是用直角坐标(x, y)或极坐标(ρ, θ)表示的,所以要想将地球表面上的点转移到平面上,则必须采用一定的方法来确定地理坐标与平面直角坐标或极坐标之间的关系。这种在球面和平面之间建立点与点之间函数关系的数学方法,就是地图投影方法。地图投影的实质就是将地球椭球面上的地理坐标转化为平面直角坐标。用某种投影条件将投影球面上的地理坐标点一一投影到平面坐标系内,以构成某种地图投影。
地图投影方法有20多种,其中常用的有墨卡托投影(Mercator projection)、兰勃特等角割圆锥投影(Lambert's conic conformal projection)、Albers等积正割圆锥投影(Albers equal-area conic projection)、等距圆柱投影(cylindrical equidistant projection)等。具体来说,不同区域常用的地图投影方法不同。墨卡托投影法又称正轴等角圆柱投影,是一种等角的圆柱形地图投影。以此投影法绘制的地图上,经纬线于任何位置皆垂直相交,使世界地图可以绘制在一个长方形上。由于可显示任两点间的正确方位,航海用途的海图、航路图大多以此方式绘制。在该投影中线型比例尺在图中任意一点周围都保持不变,从而可以保持大陆轮廓投影后的角度和形状不变(即等角);但墨卡托投影法会使面积产生变形,极点的比例甚至达到了无穷大。
R ggplot2使用coord_map()函数和coord_quickmap()函数可以设定坐标系为地理空间坐标系。其中coord_quickmap()函数是一种保留经纬直线的快速近似绘制的地理坐标系,它最适合靠近赤道的较小区域展示。coord_map()函数可以通过设定projection投影参数,从而实现不同投影的地理空间坐标系,包括墨卡托投影、兰勃特等角圆锥投影、Albers等积正割圆锥投影、等距圆柱投影和正交投影等。
4.坐标系的转换
选择合适的坐标系对数据的清晰表达也很重要,直角坐标系与极坐标系的转换如图1-6-16所示。使用极坐标可以将数据以365天围绕圆心排列。极坐标图可以让用户方便地看到数据在周期、方向上的变化趋势,而对连续时间段的变化趋势的显示则不如直角坐标系。
图1-6-16 坐标系的转换
极坐标系的表示方法为P(ρ, θ),平面直角坐标系的表示方法为Q(x, y)。极坐标系中的两个坐标r和θ可以由下面的公式转换为直角坐标系下的坐标值:
x=ρcosθ
y=ρsinθ
而在直角坐标系中,从x和y两坐标计算出极坐标下的坐标:
其中要满足x不等于0;在x = 0的情况下:若y为正数时,则θ = 90°(π/2 radians);若y为负数时,则θ = 270°(3π/2radians)。
5.坐标轴度量
坐标系指定了可视化的维度,而坐标轴的度量则指定了在每一个维度里数据映射的范围。坐标轴的度量有很多种,你也可以用数学函数定义自己的坐标轴度量,但是基本上都属于图1-6-17所示的坐标轴度量。这些坐标轴度量主要分为三种,包括数字(侧重数据的对数变化)、分类坐标轴度量和时间坐标轴度量。其中,数字坐标轴度量包括线性坐标轴度量、对数坐标轴度量、百分比坐标轴度量三类,而分类坐标轴度量包括分类坐标轴度量和顺序坐标轴度两类。
图1-6-17 不同类型的标尺[19]
R ggplot2数字坐标轴度量包括:scale_x/y_continuous(), scale_x/y_log10(), scale_x/y_sqrt(), scale_x/y_reverse();分类坐标轴度量包括scale_x/y_discrete();时间坐标轴度量包括:scale_x/y_date(),scale_x/y_datetime(), scale_x/y_time()。这些度量的主要参数包括:① name表示指定坐标轴名称,也将作为对应的图例名;②breaks表示指定坐标轴刻度位置,即粗网格线位置;③labels表示指定坐标轴刻度标签内容;④limits表示指定坐标轴显示范围,支持反区间;⑤expand表示扩展坐标轴显示范围;⑥trans表示指定坐标轴变换函数,自带有exp()、log()、log10()等,还支持scales包内的其他变换函数,如scales::percent()百分比刻度、自定义等。图1-6-18(b)就是在图1-6-18(a)的基础上添加了scale_x_continuous()和scale_y_continuous()以调整X轴和Y轴的刻度与轴名:
图1-6-18 直角坐标系度量的调整
X轴度量:scale_x_continuous(name="Time(d)", breaks=seq(0,20,2)) Y轴度量:scale_y_continuous(breaks=seq(0,90,10), limits=c(0,90), expand=c(0, 1))
线性坐标轴度量(linear scale)上的间距处处相等,无论处于坐标轴的什么位置。因此,在尺度的低端测量两点间的距离,和在尺度高端测量的结果是一样的。然而,对数坐标轴度量(logarithmic scale)是一个非线性的测量尺度,用在数量有较大范围的差异时。像里氏地震震级、声学中的音量、光学中的光强度,以及溶液的pH值等。对数尺度以数量级为基础,不是一般的线性尺度,因此每个刻度之间的商为一定值。若数据有以下特性时,用对数尺度来表示会比较方便:
(1)数据有数量级的差异时,使用对数尺度可以同时显示很大和很小的数据信息;
(2)数据有指数增长或幂定律的特性时,使用对数尺度可以将曲线变为直线表示。
图1-6-19(a)的X轴和Y轴都为线性尺度,而图1-6-19(b) X轴仍为线性尺度,将Y轴转变成对数尺度,就可以很好地展示很大和很小的数据信息。
图1-6-19 坐标轴标尺的转换
图1-6-18(a): scale_y_continuous(breaks=seq(0,2.1,0.5), limits=c(0,2)) 图1-6-18(b): scale_y_log10(name='log(value)', limits=c(0.00001,10))
分类坐标轴度量(categorical scale):数据不仅仅包括数值,有时候还包括类别,比如不同实验条件、实验样品等测试得到的数据。分类标尺通常和数字标尺一起使用、以表达数据信息。条形图就是水平X轴为数字标尺、垂直Y轴为分类标尺;而柱形图是水平X轴为分类标尺、垂直Y轴为数字标尺,如图1-6-20所示。其中,条形图和柱形图一个重要的视觉调整参数就是分类间隔,但是它和数值没有关系(如果是多数据系列,还包括一个视觉参数:系列重叠)。另外,饼图和圆环图也是数字尺度和分类尺度的组合。
注意 对于柱形图、条形图和饼图最好对数据先排序后再进行展示。对于柱形图和条形图,把数据从大到小排序,最大的位置放置在最左边或者最上边。而饼图的数据要从大到小排序,最大的从12点位置开始。
常见的相关性系数图的X轴、Y轴都为分类标尺,如图1-6-21所示。相关系数图一般都是三维及以上的数据,但是使用二维图表显示。其中,X列、Y列为都为类别数据,分布对应图表的X轴和Y轴;Z列为数值信息,通过颜色饱和度、面积大小等视觉暗示表示。图1-6-21(a)使用颜色饱和度和颜色色相综合表示Z列数据;图1-6-21(b)使用方块的面积大小及颜色综合表示Z列数据,从图中很容易观察到哪两组变量的相关性最好。
图1-6-21 分类尺度的使用
相关系数
相关系数(correlation coefficient)是用以反映变量之间相关关系的密切程度的统计指标。它是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。由于研究对象的不同,相关系数有如下几种定义方式。
(1)简单相关系数:又叫相关系数或线性相关系数,一般用字母r表示,用来度量两个变量间的线性关系。图1-6-20相关性图就是研究多个变量两两之间的简单相关关系。
(2)复相关系数:又叫多重相关系数。复相关是指因变量与多个自变量之间的相关关系。例如,某种商品的季节性需求量与其价格水平、职工收入水平等现象之间呈现复相关关系。
(3)典型相关系数:是先对原来各组变量进行主成分分析,得到新的线性关系的综合指标,再通过综合指标之间的线性相关系数来研究原各组变量间的相关关系。
时间坐标轴度量(time scale):时间是连续的变量,你可以把时间数据画到线性度量上,也可以将其分成时刻、星期、月份、季节或者年份,如图1-6-22所示。时间是日常生活的一部分。随着日出和日落,在时钟和日历里,我们每时每刻都在感受和体验着时间。所以我们会经常遇见时间序列的数据,时间序列的数据常用柱形图、折线图或者面积图表示,有时候使用极坐标图也可以很好地展示数据,因为时间往往存在周期性,以天(day)、周(week)、月(month)、季(season)或年(year)为一个周期。
图1-6-22 时间序列图表
需要注意的是:R ggplot2时间坐标轴度量函数scale_×××_date() 要求变量是Date格式;scale_×××_datetime() 要求变量是POSIXct格式;scale_×××_time() 要求变量是hms格式。