1 散点图
散点图可用来描述两个连续型变量间的关系。R中创建散点图的基础函数是plot(x, y),其中,x和y是数值型向量,代表着图形中的(x, y)点。下面展示了一个例子。
attach(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)
结果分析:使用的是mtcars数据框,创建了一幅基本的散点图,wt和mpg之间的关系是用实心圆圈来表示的,abline()函数用来添加最佳拟合的线性直线,如图中红色实线所示,lowess()函数则用来添加一条平滑曲线,如图中蓝色虚线所示。结果表示,随着车重的增加,每加仑英里数减少。
1.1 散点图矩阵
R中有很多创建散点图矩阵的实用函数。pairs()函数可以创建基础的散点图矩阵,下面的代码生成了一个散点图矩阵,包含mpg、disp、drat和wt四个变量:
pairs(~mpg+disp+drat+wt, data=mtcars, main="Basic Scatter Plot Matrix")
结果分析:看到所有指定变量间的二元关系,主对角线的上方和下方的六幅散点图是相同的,可以发现是关于主对角线对称。
通过调整参数,可以只展示下三角或者上三角的图形。例如,选项upper.panel = NULL将只生成下三角的图形。
pairs(~mpg+disp+drat+wt, data=mtcars, main="Basic Scatter Plot Matrix",upper.panel = NULL)
car包中的scatterplotMatrix()函数也可以生成散点图矩阵:
library(car)
scatterplotMatrix(~ mpg + disp + drat + wt, data=mtcars, spread=FALSE, smoother.args=list(lty=2),
main="Scatter Plot Matrix via car Package")
结果分析:可以看到线性和平滑(loess)拟合曲线被默认添加,主对角线处添加了核密度曲线和轴须图。spread = FALSE选项表示不添加展示分散度和对称信息的直线,smoother.args=list(lty=2)设定平滑(loess)拟合曲线使用虚线而不是实线。
1.2 高密度散点图
当数据点重叠很严重时,用散点图来观察变量关系非常不明显,下面构造10 000个观测点,显示它们分布在两个重叠的数据群中的情况:
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"))
10 000个观测点的散点图,严重的重叠导致很难识别哪里数据点的密度最大,数据点的重叠导致识别x与y间的关系变得异常困难,R提供了一些解决办法。你可以使用封箱、颜色和透明度来指明图中任意点上重叠点的数目。smoothScatter()函数可利用核密度估计生成用颜色密度来表示点分布的散点图:
with(mydata, smoothScatter(x, y, main="Scatter Plot Colored by Smoothed Densities"))
结果分析:途中蓝色点最大的一块区域表示x与y之间的密度最大。
hexbin包中的hexbin()函数将二元变量的封箱放到六边形单元格中(图形比名称更直观)。示例如下:
install.packages("hexbin")
library(hexbin)
with(mydata, { bin <- hexbin(x, y, xbins=50)
plot(bin, main="Hexagonal Binning with 10,000 Observations") })
x, y:向量,给出要分层的二元数据点的坐标。
xbins:划分xbnds范围的bins数量。
结果分析:用六边形封箱图展示的各点上覆盖观测点数目的散点图,通过图例,数据的集中度很容易计算和观察。
1.3 三维散点图
散点图和散点图矩阵展示的都是二元变量关系,那么我们想一次对三个定量变量的交互关系进行可视化呢?本节例子中,你可以使用三维散点图。
例如,假使你对汽车英里数、车重和排量间的关系感兴趣,可用scatterplot3d包中的
scatterplot3d()函数来绘制它们的关系。格式如下:
scatterplot3d(x, y, z)
x被绘制在水平轴上,y被绘制在竖直轴上,z被绘制在透视轴上。
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg, main="Basic 3D Scatter Plot")
结果分析:该三维图显示了每加仑英里数mpg、车重wt和排量disp的三维散点图
satterplot3d()函数提供了许多选项,包括设置图形符号、轴、颜色、线条、网格线、突出显示和角度等功能。例如代码:
library(scatterplot3d)
attach(mtcars)
scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE, type="h",
main="3D Scatter Plot with Vertical Lines")
type:表示绘图类型的字符:"p "表示点,"l "表示线,"h "表示垂直于x-y平面的线
我们还可以在刚才那幅图上添加一个回归面,代码如下:
library(scatterplot3d)
attach(mtcars)
s3d <-scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE, type="h",
main="3D Scatter Plot with Vertical Lines and Regression Plane")
fit <- lm(mpg ~ wt+disp)
s3d$plane3d(fit)
结果分析:平面代表预测值,图中的点是实际值。平面到点的垂直距离表示残差值。若点在平面之上则表明它的预测值被低估了,而点在平面之下则表明它的预测值被高估了。
1.4 旋转三维散点图
如果你能对三维散点图进行交互式操作,那么图形将会更好解释。R提供了一些旋转图形的
功能,让你可以从多个角度观测绘制的数据点。
例如,你可用rgl包中的plot3d()函数创建可交互的三维散点图。你能通过鼠标对图形进行旋转。函数格式为:
plot3d(x, y, z)
其中x、y和z是数值型向量,代表着各个点,还可以添加如col和size这类的选项来分别控制点的颜色和大小,下面是一个例子:
install.packages("rgl")
library(rgl)
attach(mtcars)
plot3d(wt, disp, mpg, col="red", size=5)
也可以使用car包中类似的函数scatter3d():
library(car)
with(mtcars, scatter3d(wt, disp, mpg))
1.5气泡图
我们通过三维散点图来展示三个定量变量间的关系。现在介绍另外一种思路:先创建一个二维散点图,然后用点的大小来代表第三个变量的值。这便是气泡图(bubble plot)。
symbols()函数来创建气泡图。该函数可以在指定的(x, y)坐标上绘制圆圈图、方形图、星形图、温度计图和箱线图。以绘制圆圈图为例:
symbols(x, y, circle=radius)
其中x、y和radius是需要设定的向量,分别表示x、y坐标和圆圈半径,z即第三个要绘制的变量。
x轴代表车重wt,y轴代表每加仑英里数mpg,气泡大小代表发动机排量disp。代码如下:
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)")
text(wt, mpg, rownames(mtcars), cex=0.6)
detach(mtcars)
结果分析:选项inches是比例因子,控制着圆圈大小(默认最大圆圈为1英寸)。text()函数是可选函数,此处用来添加各个汽车的名称。从图中可以看到,随着每加仑汽油所行驶里程的增加,车重和发动机排量都逐渐减少。