【R实战 中级方法】十一、中级绘图
这里是佳奥!又到了绘图的章节!
本章将首先从散点图和散点图矩阵讲起,然后探索各种各样的折线图。接着,将回顾用于相关性可视化的相关图,以及用于类别型变量中多元关系可视化的马赛克图。
通过这些绘图方法的示例,我们将能更好地理解数据,并为后续学习新的ggplot2包打下基础。
那么开始吧!
1 散点图
本节,我们首先描述一个二元变量关系(x对y),然后探究各种通过添加额外信息来增强图形表达功能的方法。
接着,我们将学习如何把多个散点图组合起来形成一个散点图矩阵,以便可以同时浏览多个二元变量关系。
最后,通过添加第三个连续型变量,我们将把二维图形扩展到三维,包括三维散点图和气泡图。
添加了最佳拟合曲线的散点图:
上述代码加载了mtcars数据框,创建了一幅基本的散点图,图形的符号是实心圆圈。
与预期结果相同,随着车重的增加,每加仑英里数减少,虽然它们不是完美的线性关系。
abline( )函数用来添加最佳拟合的线性直线,而lowess()函数则用来添加一条平滑曲线。该平滑曲线拟合是一种基于局部加权多项式回归的非参数方法。
car包中的scatterplot( )函数增强了散点图的许多功能,它可以很方便地绘制散点图,并能添加拟合曲线、边界箱线图和置信椭圆,还可以按子集绘图和交互式地识别点:
运行缺少参数报错,这里就把代码列出来吧:
scatterplot( )函数用来绘制有四个、六个和八个气缸的汽车每加仑英里数对车重的图形。
表达式mpg ~ wt | cyl 表示按条件绘图(即按cyl的水平分别绘制mpg和wt的关系图)。
默认地,各子集会通过颜色和图形符号加以区分,并同时绘制线性拟合和平滑拟合曲线。平滑拟合默认需要五个单独的数据点,因此六缸车型的平滑曲线无法绘制。
id.method选项的设定表明可通过鼠标单击来交互式地识别数据点,直到用户选择Stop(通过图形或者背景菜单)或者敲击Esc键。
labels选项的设定表明可通过点的行名称来识别点。此图中可以看到,给定Toyata Corolla和Fiat 128的车重,通常每加仑燃油可行驶得更远。
legend.plot选项表明在左上边界添加图例,而mpg和weight的边界箱线图可通过boxplots选项来绘制。
查询函数scatterplot,我发现目前的格式和书里面的差很多:
运行前部分代码可以,那问题是出在后面添加图例的部分。
经过逐行验证,最后可行:
去除了后续添加图例的代码。
1.1 散点图矩阵
pairs( )函数可以创建基础的散点图矩阵。下面的代码生成了一个散点图矩阵,包含mpg、disp、drat和wt四个变量:
可以看到所有指定变量间的二元关系。
例如,mpg和disp的散点图可在两变量的行列交叉处找到。
car包中的scatterplotMatrix( 函数也可以生成散点图矩阵,并有以下可选操作:1、某个因子为条件绘制散点图矩阵。2、包含线性和平滑拟合曲线。3、在主对角线放置箱线图、密度图或者直方图。4、在各单元格的边界添加轴须图。
可以看到线性和平滑(loess)拟合曲线被默认添加,主对角线处添加了核密度曲线和轴须图。
spread = FALSE 选项表示不添加展示分散度和对称信息的直线,lty.smooth =2设定平滑(loess)拟合曲线使用虚线而不是实线。
下面的代码展示了scatterplotMatrix()函数的另一个使用示例:
包含选项by.groups = TRUE将可依据各子集分别生成拟合曲线。
下面考虑mpg、wt、disp和drat间的相关性:
可以看到相关性最高(0.89)的是车重(wt)与排量(disp),以及车重(wt)与每加仑英里数(mpg;-0.87)。
相关性最低(0.68)的是每加仑英里(mpg)与后轴比(drat)。
gclus包生成的散点图矩阵:
gclus包中的cpairs( )函数生成的散点图矩阵。变量离主对角线越近,相关性越高:
使用dmat.color()、order.single()和cpairs()函数都来自于gclus包。
第一步,从mtcars数据框中选择所需的变量,并计算它们相关系数的绝对值。
第二步,使用dmat.color()函数获取绘图的颜色。给定一个对称矩阵(本例中是相关系数矩阵),dmat.color()将返回一个颜色矩阵。
第三步,可对图中变量进行排序。通过order.single( )函数重排对象,可使得相似的对象更为靠近。本例中变量排序的基础是相关系数的相似性。
最后,散点图矩阵将根据新的变量顺序(myorder)和颜色列表(mycolors)绘图、上色,gap选项使矩阵各单元格间的间距稍微增大一点。
上图可以看出,相关性最高的变量对是车重与排量,以及每加仑英里数与车重(标了红色,并且离主对角线最近)。相关性最低的是后轴比与每加仑英里数(标了黄色,并且离主对角线很远)。
当变量数众多,变量间的相关性变化很大时,该方法特别有用。
1.2 高密度散点图
当10 000个观测点分布在两个重叠的数据群中:
若用下面的代码生成一幅标准的散点图
数据点的重叠导致识别x与y间的关系变得异常困难。
可以使用封箱、颜色和透明度来指明图中任意点上重叠点的数目。
smoothScatter( )函数可利用核密度估计生成用颜色密度来表示点分布的散点图:
smoothScatter( )利用光平滑密度估计绘制的散点图。此处密度易读性更强:
hexbin包中的hexbin( )函数将二元变量的封箱放到六边形单元格中:
最后,IDPmisc包中的iplot( )函数也可通过颜色来展示点的密度(在某特定点上数据点的数目):
1.3 三维散点图
假使对汽车英里数、车重和排量间的关系感兴趣,可用scatterplot3d中的scatterplot3d( )函数来绘制它们的关系:
x被绘制在水平轴上,y被绘制在竖直轴上,z被绘制在透视轴上。
satterplot3d( )函数提供了许多选项,包括设置图形符号、轴、颜色、线条、网格线、突出显示和角度等功能:
生成一幅突出显示效果的三维散点图,增强了纵深感,添加了连接点与水平面的垂直线。
我们在刚才那幅图上添加一个回归面:
图形利用多元回归方程,对通过车重和排量预测每加仑英里数进行了可视化处理。平面代表预测值,图中的点是实际值。
平面到点的垂直距离表示残差值。若点在平面之上则表明它的预测值被低估了,而点在平面之下则表明它的预测值被高估了。
旋转三维散点图
可用rgl包中的plot3d( )函数创建可交互的三维散点图。能通过鼠标对图形进行旋转,格式:
其中x、y和z是数值型向量,代表着各个点。还可以添加如col和size这类的选项来分别控制点的颜色和大小:
类似的,还可以使用Rcmdr包中类似的函数scatter3d( )等。
1.4 气泡图
先创建一个二维散点图,然后用点的大小来代表第三个变量的值。这便是气泡图(bubble plot)。
可用symbols( )函数来创建气泡图。
该函数可以在指定的(x, y)坐标上绘制圆圈图、方形图、星形图、温度计图和箱线图。
其中x、y和radius是需要设定的向量,分别表示x、y坐标和圆圈半径。
想用面积而不是半径来表示第三个变量:
z即第三个要绘制的变量。
现在我们把该方法应用到mtcars数据集上,x轴代表车重,y轴代表每加仑英里数,气泡大小代表发动机排量:
选项inches是比例因子,控制着圆圈大小(默认最大圆圈为1英寸)。
text( )函数是可选函数,此处用来添加各个汽车的名称。从图中可以看到,随着每加仑汽油所行驶里程的增加,车重和发动机排量都逐渐减少。
2 折线图
以基础安装中的Orange数据集为例,它包含五种橘树的树龄和年轮数据。现要考察第一种橘树的生长情况:
两幅图的主要区别取决于参数type = "b"。
折线图一般可用下列两个函数之一来创建:
其中,x和y是要连接的(x, y)点的数值型向量。参数type =的可选值见表:
可以看到,type = "p"生成了典型的散点图,type = "b"是最常见的折线图。
b和c间的不同之处即点是否出现或者线之间是否有空隙。
type ="s"和type ="S"都生成阶梯线(阶梯函数),但一种类型是先横着画线,然后再上升,而第二种类型是先上升,再横着画线。
plot( )和lines( )函数中的type参数值:
注意
plot( )和lines( )函数工作原理并不相同。
plot( )函数是被调用时即创建一幅新图,而lines()函数则是在已存在的图形上添加信息,并不能自己生成图形。
因此,lines( )函数通常是在plot( )函数生成一幅图形后再被调用。
如果对图形有要求,可以先通过plot( )函数中的type = n来创建坐标轴、标题和其他图形特征,然后再使用lines( )函数添加各种需要绘制的曲线。
展示五种橘树随时间推移的生长状况的折线图:
plot( )函数先用来创建空图形,只设定了轴标签和轴范围,并没有绘制任何数据点,每种橘树独有的折线和点都是随后通过lines( )函数来添加。
可以看到,Tree4和Tree 5在整个时间段中一直保持着最快的生长速度,而且Tree 5在大约664天的时候超过了Tree 4。
3 相关图
相关图非常容易解释,以mtcars数据框中的变量相关性为例,它含有11个变量,对每个变量都测量了32辆汽车。
利用下面的代码,可以获得该数据的相关系数:
利用corrgram包中的corrgram( )函数,可以以图形方式展示该相关系数矩阵:
我们先从下三角单元格(在主对角线下方的单元格)开始解释这幅图形。
默认地,蓝色和从左下指向右上的斜杠表示单元格中的两个变量呈正相关。
反过来,红色和从左上指向右下的斜杠表示变量呈负相关。
色彩越深,饱和度越高,说明变量相关性越大。相关性接近于0的单元格基本无色。
本图为了将有相似相关模式的变量聚集在一起,对矩阵的行和列都重新进行了排序(使用主成分法)。
从图中含阴影的单元格中可以看到,gear、am、drat和mpg相互间呈正相关,wt、disp、hp和carb相互间也呈正相关。
但第一组变量与第二组变量呈负相关。
还可以看到carb和am、vs和gear、vs和am以及drat和qsec四组变量间的相关性很弱。
corrgram()函数的格式如下:
x是一行一个观测的数据框。当order = TRUE时,相关矩阵将使用主成分分析法对变量重排序,这将使得二元变量的关系模式更为明显。
选项panel 设定非对角线面板使用的元素类型。
可以通过选项lower.panel 和upper.panel来分别设置主对角线下方和上方的元素类型。
text.panel和diag.panel选项控制着主对角线元素类型。
可用的panel值见表:
corrgram( )函数的panel选项:
一个新的例子:
我们在下三角区域使用平滑拟合曲线和置信椭圆,上三角区域使用散点图。主对角面板包含变量最小和最大值。矩阵的行和列利用主成分分析法进行了重排序。
最后一个例子:
我们在下三角区域使用了阴影,并保持原变量顺序不变,上三角区域留白。下三角区域的阴影代表相关系数的大小和正负。变量按初始顺序排列。
补充说明一下,我们可自主控制corrgram( )函数中使用的颜色。
例如,在col.corrgram( )函数中用colorRampPallette( )函数来指定四种颜色:
4 马赛克图
在马赛克图中,嵌套矩形面积正比于单元格频率,其中该频率即多维列联表中的频率。颜色和/或阴影可表示拟合模型的残差值。
vcd包中的mosaic( )函数可以绘制马赛克图。
以基础安装中的Titanic数据集为例,它包含存活或者死亡的乘客数、乘客的船舱等级(一等、二等、三等和船员)、性别(男性、女性),以及年龄层(儿童、成人)。这是一个被充分研究过的数据集:
mosaic( )函数可按如下方式调用:
其中table是数组形式的列联表。另外,也可用:
其中formula是标准的R表达式,data设定一个数据框或者表格。
添加选项shade = TRUE将根据拟合模型的皮尔逊残差值对图形上色,添加选项legend = TRUE将展示残差的图例。
两种代码都可以生成下图,但表达式版本的代码可使我们对图形中变量的选择和摆放拥有更多的控制权(代码2)。
马赛克图隐含着大量的数据信息。
1、从船员到头等舱,存活率陡然提高。
2、大部分孩子都处在三等舱和二等舱中。
3、在头等舱中的大部分女性都存活了下来,而三等舱中仅有一半女性存活。
4、船员中女性很少,导致该组的Survived标签重叠(图底部的No和Yes)。
扩展的马赛克图添加了颜色和阴影来表示拟合模型的残差值。
在本例中,蓝色阴影表明,在假定生存率与船舱等级、性别和年龄层无关的条件下,该类别下的生存率通常超过预期值。红色阴影则含义相反。
图形表明,在模型的独立条件下,头等舱女性存活数和男性船员死亡数超过模型预期值。如果存活数与船舱等级、性别和年龄层独立,三等舱男性的存活数比模型预期值低。
5 小结
本章中,我们学习了许多展示两个或更多变量间关系的图形方法,包括二维和三维散点图、散点图矩阵、气泡图、折线图、相关系数图和马赛克图。
通过大量的包和例子,我们提高了绘图水平,那么下一篇,将进入R高级方法,学习广义线性模型。
我们下篇再见!