引言:第6章(基本图形)中,我们学习了许多应用广泛的图形,它们主要用于展示单类别型或连续型变量的分布情况。第8章(回归)中,我们又回顾了一些用于通过一系列预测变量来预测连续型结果变量的实用图形方法。第9章(方差分析)中,我们学习了其他很有用的绘图技巧,用于展示连续型结果变量的组间差异。从各方面来看,本章将是对之前图形主题的延伸与扩展。本章我们主要关注用于展示双变量间关系(二元关系)和多变量间关系(多元关系)的绘图方法。
11 .1 散点图
plot( x, y) , 其中, x和 y是数值型向量,代表着图形中的( x, y)点。
举例:添加了最佳拟合曲线的散点,如图11-1
attach(mtcars)#加载了mtcars数据框,创建了一幅基本的散点图
plot(wt, mpg,main="Basic Scatter plot of MPG vs. Weight",xlab="Car Weight (lbs/1000) ",ylab="Miles Per Gallon ", pch=19)
abline(lm(mpg~wt) , col="red", lwd=2, lty=1) #添加最佳拟合的线性直线
lines(lowess(wt, mpg) , col="blue", lwd=2, lty=2) #lowess() 函数则用来添加一条平滑曲线
图11-1 汽车英里数对车重的散点图,添加了线性拟合直线和lowess拟合曲线
car包中的scatterplot() 函数增强了散点图的许多功能,可以添加拟合曲线、边界箱线图和置信椭圆,还可以按子集绘图和交互式地识别点。例如以下代码,图11-2 所示:
library(car)#加载car包
scatterplot(mpg ~ wt | cyl, data=mtcars, lwd=2, span=0. 75, #达式mpg ~ wt | cyl表示按条件绘图(即按cyl的水平分别绘制mpg和wt的关系图)。
main="Scatter Plot of MPG vs. Weight by # Cylinders",
xlab="Weight of Car (lbs/1000) ",
ylab="Miles Per Gallon",
legend. plot=TRUE, #legend.plot选项表明在左上边界添加图例
id. method="identify", ##表示单击鼠标来交互式地识别数据点
labels=row. names(mtcars) , ##可通过点的行名称来识别点。
boxplots="xy" #加上x和y的边界箱线图
) #更多细节可参见help(scatterplot)
图11-2 各子集的散点图与其相应的拟合曲线
11 .1 .1 散点图矩阵, pairs() 函数/car包里面的函数
R中有很多创建散点图矩阵的实用函数,pairs() 函数是最基础的函数,可以创建所有指定变量间的二元关系。也就是~右侧所有变量之间的两两关系,如图11-3所示。
pairs(~mpg+disp+drat+wt, data=mtcars,main="Basi c Scatter Plot Matri x")
11-3 pairs() 函数创建的散点图矩阵
car包中的scatterplotMatrix() 函数也可以生成散点图矩阵,并有以下可选操作:
-
以某个因子为条件绘制散点图矩阵;
-
包含线性和平滑拟合曲线;
-
在主对角线放置箱线图、密度图或者直方图;
-
在各单元格的边界添加轴须图。
如图11-4。可以看到线性和平滑( loess)拟合曲线被默认添加,主对角线处添加了核密度 曲 线 和 轴 须 图 。
library(car)
scatterplotMatrix(~ mpg + di sp + drat + wt, data=mtcars,
spread=FALSE, # 示 不 添 加 展 示 分 散 度 和 对 称 信 息 的 直 线
smoother. args=list(lty=2) ,# 设定平滑( loess)拟合曲线使用虚线而不是实线。
main="Scatter Plot Matrix via car Package") #设定平滑( loess) 拟合曲线使用虚线而不是实线。
11-4 scatterplotMatrix() 函数创建的散点图 矩阵 。主对角线上有核密度
曲线和轴须图,其余图形都含有线性和平滑拟合曲线
11 .1 .2 高密度散点图
当数据重叠严重的时候,数据点的重叠导致识别 x与 y间的关系变得异常困难, such as图11-5 (黑乎乎的一团,是不是看得脑子也一团浆糊…..):
set. seed(1234)
n <- 10000
c1 <- matrix(rnorm(n, mean=0, sd=.5) , ncol=2)
c2 <- matrix(rnorm(n, mean=3, sd=2) , ncol=2)
mydata <- rbind(c1, c2)
mydata <- as. data. frame(mydata)
names(mydata) <- c("x", "y")
with(mydata,plot(x, y, pch=19, main="Scatter Plot with 10, 000 Observations") )#会得到如图11-5所示的图形
图11-5 10 000个观测点的散点图,严重的重叠导致很难识别哪里数据点的密度最大
但不怕,我们有smoothScatter() 函数,它可利用核密度估计生成用颜色密度来表示点分布的散点图,具有更强的密度易读性,如图11-6所示:
with(mydata,smoothScatter(x, y, mai n="Scatter Plot Colored by Smoothed Densi ti es") )
图11-6 smoothScatter() 利用光平滑密度估计绘制的散点图。此处密度易读性更强
除此之外,hexbin包中的hexbin() 函数可以将二元变量的封箱放到六边形单元格中( 图形比名称更直观),让数据的集中度更容易观察和计算,如图11-7:
li brary(hexbin)
with(mydata, {
bin <- hexbi n(x, y, xbi ns=50)
plot(bin, main="Hexagonal Binning with 10, 000 Observations")
})
图11-7 用六边形封箱图展示的各点上覆盖观测点数目的散点图。通过图例,数据的集中度很容易计算和观察
11 .1 .3 三维散点图
可以对三个定量变量的交互关系进行可视化,而之前的散点图、矩阵都是2元变量, scatterplot3d( x, y, z),x被绘制在水平轴上, y被绘制在竖直轴上, z被绘制在透视轴上。如图11-8 :
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg,
main="Basic 3D Scatter Plot")
图11-8 每加仑英里数、车重和排量的三维散点图
也可以加上其他的修饰条件,如图形符号、轴、颜色、线条、网格线等,如图11-9
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg,
pch=16,
highlight. 3d=TRUE,
type="h",
main="3D Scatter Plot with Vertical Lines")
图11-9 添加了垂直线和阴影的三维散点图
又或者添加一个回归面,多元回归, 平面代表预测值, 图中的点是实际值。平面到点的垂直距离表示残差值。若点在平面之上则表明它的预测值被低估了, 而点在平面之下则表明它的预测值被高估了。如图11-10
library(scatterplot3d)
attach(mtcars)
s3d <-scatterplot3d(wt, di sp, mpg,
pch=16,
TRUE, =
type="h",
main="3D Scatter Plot with Vertical Lines and Regression Plane")
fit <- lm(mpg ~ wt+disp)
s3d$plane3d(fit)
图11-10 添加了垂直线、阴影和回归平面的三维散点图
11 .1 .4 旋转三维散点图,
1、rgl包中的plot3d() 函数, plot3d( x, y, z),如图11-11 所示
library(rgl)
attach(mtcars)
plot3d(wt, disp, mpg, col=”red”,size=5)
图11-11 rgl包中的plot3d() 函数生成的旋转三维散点图
2、car包中类似的函数scatter3d()
library(car)
with(mtcars,
scatter3d(wt, disp, mpg) )
图11-12 car包中的scatter3d() 生成的旋转三维散点图
11 .1 .5 气泡图
气泡图是指先创建一个二维散点图, 然后用点的大小来代表第三个变量的值的图。可用symbols( x, y, circle= r a d i u s)来创建图形,其中 x、y和 radius是需要设定的向量,分别表示 x、y坐标和圆圈半径。
attach(mtcars)
r <- sqrt(disp/pi )#用面积而不是半径来表示第三个变量
symbols(wt, mpg, circle=r, inches=0. 30,
fg="white", bg="lightblue",
main="Bubble Plot with point size proportional to displacement",
ylab="Miles Per Gallon",
xlab="Weight of Car (lbs/1000) ")#生成图形见图11-13。
text(wt, mpg, rownames(mtcars) , cex=0. 6) #添加各个汽车的名称
detach(mtcars)
图11-13 车重与每加仑英里数的气泡图,点大小与发动机排量成正比
11 .2折线图
如果将散点图上的点从左往右连接起来,就会得到一个折线图。以基础安装中的Orange数据集为例,它包含五种橘树的树龄和年轮数据。现要考察第一种橘树的生长情况,绘制图形11-14:
opar <- par(no. readonly=TRUE) #设置图形参数
par(mfrow=c(1, 2)) #设置组合图形的格式
t1 <- subset(Orange, Tree==1) #
plot(t1$age, t1$circumference,
xlab="Age (days)",ylab="Circumference (mm) ",
main="Orange Tree 1 Growth") #散点图
plot(t1$age, t1$circumference,
xlab="Age (days) ",
ylab="Circumference (mm) ",
main="Orange Tree 1 Growth",
type="b") #折线图,加了type="b"是区别
par(opar)
折线图一般可用下列两个函数之一来创建:
plot( x, y, type=)
lines( x, y, type=)
x和 y是要连接的( x, y)点的数值型向量。参数type=的可选值见表11-1:
表11-1 折线图类型
类型 | 图形外观 |
p | 只有点 |
l | 只有线 |
o | 实心点和线(即线覆盖在点上) |
b、c | 线连接点(c 时不绘制点) |
s、S | 阶梯线 |
h | 直方图式的垂直线 |
n | 不生成任何点和线(通常用来为后面的命令创建坐标轴) |
注意: plot() 和lines() 函数工作原理并不相同。plot() 函数是在被调用时创建一幅新图,而lines() 函数则是在已存在的图形上添加信息,并不能自己生成图形。
图11-15给出了各类型的示例:
图11-15 plot() 和lines() 函数中的type参数值
例子:展示五种橘树随时间推移的生长状况的折线图,见图11-16:
Orange$Tree <- as. numeric(Orange$Tree) ##将因子转化为数值型
ntrees <- max(Orange$Tree)
xrange <- range(Orange$age)
yrange <- range(Orange$circumference)
plot(xrange, yrange,type="n",xlab="Age (days) ",
ylab="Circumference (mm) " ) ##创建背景图形
colors <- rainbow(ntrees)
linetype <- c(1: ntrees)
plotchar <- seq(18, 18+ntrees, 1)
for (i in 1: ntrees) {
tree <- subset(Orange, Tree==i )
lines(tree$age, tree$circumference,
type="b",
lwd=2,
lty=linetype[i ] ,
col=colors[i ] ,
pch=plotchar[i ] )
} #在背景图形上为每种橘树添加独有的折线和点。
title("Tree Growth", "example of li ne plot") #加标题
legend(xrange[1] , yrange[2] ,
1: ntrees,
cex=0. 8,
col=colors,
pch=plotchar,
lty=linetype,
title="Tree") #加图例
图11-16 展示五种橘树生长状况的折线图
11 .3 相关图
相关系数矩阵是多元统计分析的一个基本方面,通过对相关系数矩阵的可视化可以帮助我们找出哪些被考察的变量与其他变量相关性很强,而哪些并不强?相关变量是否以某种特定的方式聚集在一起?等等问题。
以mtcars数据框中的变量相关性为例,
options(digits=2)
> cor(mtcars)#获取mtcars数据框11变量的相关系数
mpg cyl disp hp drat wt qsec vs am gear carb
mpg 1.00 -0.85 -0.85 -0.78 0.681 -0.87 0.419 0.66 0.600 0.48 -0.551
cyl -0.85 1.00 0.90 0.83 -0.700 0.78 -0.591 -0.81 -0.523 -0.49 0.527
disp -0.85 0.90 1.00 0.79 -0.710 0.89 -0.434 -0.71 -0.591 -0.56 0.395
hp -0.78 0.83 0.79 1.00 -0.449 0.66 -0.708 -0.72 -0.243 -0.13 0.750
drat 0.68 -0.70 -0.71 -0.45 1.000 -0.71 0.091 0.44 0.713 0.70 -0.091
wt -0.87 0.78 0.89 0.66 -0.712 1.00 -0.175 -0.55 -0.692 -0.58 0.428
qsec 0.42 -0.59 -0.43 -0.71 0.091 -0.17 1.000 0.74 -0.230 -0.21 -0.656
vs 0.66 -0.81 -0.71 -0.72 0.440 -0.55 0.745 1.00 0.168 0.21 -0.570
am 0.60 -0.52 -0.59 -0.24 0.713 -0.69 -0.230 0.17 1.000 0.79 0.058
gear 0.48 -0.49 -0.56 -0.13 0.700 -0.58 -0.213 0.21 0.794 1.00 0.274
carb -0.55 0.53 0.39 0.75 -0.091 0.43 -0.656 -0.57 0.058 0.27 1.000
利用corrgram包中的corrgram() 函数,你可以用图形的方式展示该相关系数矩阵(见图
11-17):
library(corrgram)
corrgram(mtcars, order=TRUE, lower.panel=panel.shade,
upper.panel=panel.pie, text.panel=panel.txt,
main="Corrgram of mtcars intercorrelations")
图11-17 mtcars数据框中变量的相关系数图。矩阵行和列都通过主成分分析法进行
了重新排序
解读如下:
下三角单元格:
1、蓝色和从左下指向右上的斜杠表示单元格中的两个变量呈正相关
2、色和从左上指向右下的斜杠表示变量呈负相关
3、色彩越深,饱和度越高,说明变量相关性越大
4、相关性接近于0的单元格基本无色
上三角单元格:
1、颜色的功能同上
2、相关性大小由被填充的饼图块的大小来展示,
3、正相关性将从12点钟处开始顺时针填充饼图,而负相关性则逆时针方向填充饼图。
corrgram() 函数的格式如下:corrgram( x, order=, panel=, text.panel=, diag.panel=),其中, x是一行一个观测的数据框。当order=TRUE时,相关矩阵将使用主成分分析法对变量重排序,这将使得二元变量的关系模式更为明显。选 项 panel 设 定 非 对 角 线 面 板 使 用 的 元 素 类 型 。你 可 以 通 过 选 项 lower.panel 和upper.panel来分别设置主对角线下方和上方的元素类型。而text.panel和diag.panel选项控制着主对角线元素类型。可用的panel值见表11-2。
表11-2 corr gram() 函数的 panel选项
第二个例子,生成的图形见图11-18
library(corrgram)
corrgram(mtcars, order=TRUE, lower.panel=panel.ellipse,
upper.panel=panel.pts, text.panel=panel.txt,
diag.panel=panel.minmax,
main="Corrgram of mtcars data using scatter plots
and ellipses")#在下三角区域使用平滑拟合曲线和置信椭圆,上三角区域使用散点图
图11-18 mtcars数据框中变量的相关系数图。下三角区域包含平滑拟合曲线和置信
椭圆,上三角区域包含散点图。主对角面板包含变量最小和最大值。矩阵
的行和列利用主成分分析法进行了重排序
最后一个例子,见图11-19:
library(corrgram)
corrgram(mtcars, lower.panel=panel.shade,
upper.panel=NULL, text.panel=panel.txt,
main="Car Mileage Data (unsorted)")#在下三角区域使用了阴影,并保持原变量顺序不变,上三角区域留白
图 11-19 mtcars 数据框中变量的相关系数图。下三角区域的阴影代表相关系数的大小和正负。变量按初始顺序排列
11 .4 马赛克图
到目前为止,我们已经学习了许多可视化定量或连续型变量间关系的方法。但如果变量是类
别型的呢?若只观察单个类别型变量,可以使用柱状图或者饼图;若存在两个类别型变量,可以
使用三维柱状图;但若有两个以上的类别型变量适用于2个以上的类别型变量,可以用马赛克图,马赛克图中, 嵌套矩形面积正比于单元格频率。其中该频率即多维列联表中的频率。颜色和/或阴影可表示拟合模型的残差值。
vcd包中的mosaic() 函数,mosaic( f o r m u l a, data=),如图图11-20:
library(vcd)
mosaic(~Class+Sex+Age+Survived, data=Titanic, shade=TRUE, legend=TRUE)
library(vcd)
mosaic(Titanic, shade=TRUE, legend=TRUE)
图11-20 按船舱等级、乘客性别和年龄层绘制的泰坦尼克号幸存者的马赛克图
小结:本章中,我们学习了许多展示两个或更多变量间关系的图形方法,包括二维和三维散点图、散点图矩阵、气泡图、折线图、相关系数图和马赛克图。这样,图形的定制(第3章)、单变量分布的展示(第6章)、回归模型的探究(第8章)和组间差异的可视化(第9章)等方法,就构成了你的可视化数据和提取数据信息的完备工具箱。下一章,我们将探究重抽样和自助法。