赞
踩
本章,我们主要关注用于展示双变量间关系(二元关系)和多变量间关系(多元关系)的绘 图方法。
比如下面的例子。
汽车里程与车重的关系是怎样的?它是否随着汽车的汽缸数目不同而变化?
如何在一个图形中展示汽车里程、车重、排量和后轴比之间的关系?
当展示大数据集(如10 000个观测)中的两个变量的关系时,如何处理数据点严重重叠的 情况?换句话说,当图形变成了一个大黑点时怎么办?
如何一次性展示三个变量间的多元关系(给你一个电脑屏幕或一张纸,并且预算没有《阿 凡达》那么多)?
如何展示一些树随时间推移的生长情况?
如何在单幅图中展示一堆变量的相关性?它又如何帮助你理解数据的结构?
对于“泰坦尼克号”中幸存者的数据,如何可视化他们的船舱等级、性别和年龄间的关 系?可以从这样的图形中得出什么样的结论?
- 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)
R有两个平滑曲线拟合函数:lowess()和loess()。loess()是基于lowess()表达式版 本的更新和更强大的拟合函数。这两个函数的默认值不同,因此要小心使用,不要把它 们弄混淆了。
car包中的scatterplot()函数增强了散点图的许多功能,
- library(car)
- scatterplot(mpg ~ wt | cyl, data=mtcars, lwd=2, span=0.75,
- main="Scatter Plot of MPG vs. Weight by # Cylinders",
- xlab="Weight of Car (lbs/1000)",
- ylab="Miles Per Gallon",
- legend.plot=TRUE,
- id.method="identify",
- labels=row.names(mtcars),
- boxplots="xy"
- )
总之,scatterplot() 函数还有许多特性值得探究,比如本节未讨论的稳健性选项和数据集中度椭圆选项。更多细节可 参见help(scatterplot)
R中有很多创建散点图矩阵的实用函数。pairs()函数可以创建基础的散点图矩阵。下面的 代码生成了一个散点图矩阵,包含mpg、disp、drat和wt四个变量:
- pairs(~mpg+disp+drat+wt, data=mtcars,
- main="Basic Scatter Plot Matrix")
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")
R提供了许多其他的方式来创建散点图矩阵。你可能想探索glus包中的cpars()函数, TeachingDemos包中的pairs2()函数,HH包中的xysplom()函数,ResourceSelection包中 的kepairs()函数和SMPracticals包中的pairs.mod()函数。每个包都加入了自己独特的曲 线。
- 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")
高度重合,数据点的重叠导致识别x与y间的关系变得异常困难。针对这种情况,R提供了一 些解决办法。你可以使用封箱、颜色和透明度来指明图中任意点上重叠点的数目。
smoothScatter()函数可利用核密度估计生成用颜色密度来表示点分布的散点图。
更易读
hexbin包中的hexbin()函数将二元变量的封箱放到六边形单元格中 (图形比名称更直观)
- library(hexbin)
- with(mydata, {
- bin <- hexbin(x, y, xbins=50)
- plot(bin, main="Hexagonal Binning with 10,000 Observations")
- })
综上可见,基础包中的smoothScatter()函数以及IDPmisc包中的ipairs()函数都可以对 大数据集创建可读性较好的散点图矩阵。通过?smoothScatter和?ipairs可获得更多的示例。
例如,假使你对汽车英里数、车重和排量间的关系感兴趣,可用scatterplot3d包中的 scatterplot3d()函数来绘制它们的关系。
scatterplot3d(x, y, z)
- library(scatterplot3d)
- attach(mtcars)
- scatterplot3d(wt, disp, mpg,
- main="Basic 3D Scatter Plot")
satterplot3d()函数提供了许多选项,包括设置图形符号、轴、颜色、线条、网格线、突 出显示和角度等功能。
- library(scatterplot3d)
- attach(mtcars)
- scatterplot3d(wt, disp, mpg,
- pch=16,
- highlight.3d=TRUE,
- type="h",
- main="3D Scatter Plot with Vertical Lines")
再添加一个回归面
- 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)
你可用rgl包中的plot3d()函数创建可交互的三维散点图
plot3d(x, y, z)
- library(rgl)
- attach(mtcars)
- plot3d(wt, disp, mpg, col="red", size=5)
你也可以使用car包中类似的函数scatter3d()
- library(car)
- with(mtcars,
- scatter3d(wt, disp, mpg))
我们通过三维散点图来展示三个定量变量间的关系。现在介绍另外一种思 路:先创建一个二维散点图,然后用点的大小来代表第三个变量的值。这便是气泡图(bubble plot)。
symbols()函数来创建气泡图。该函数可以在指定的(x, y)坐标上绘制圆圈图、方形 图、星形图、温度计图和箱线图。以绘制圆圈图为例:
symbols(x, y, circle=radius)
其中x、y和radius是需要设定的向量,分别表示x、y坐标和圆圈半径。
你可能想用面积而不是半径来表示第三个变量,那么按照圆圈半径的公式变换即 可:
symbols(x, y, circle=sqrt(z/pi))
z即第三个要绘制的变量。
- 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)
一般来说,统计人员使用R时都倾向于避免用气泡图,原因和避免使用饼图一样:相比对长 度的判断,人们对体积/面积的判断通常更困难。但是气泡图在商业应用中非常受欢迎,
- 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")
- par(opar)
折线图一般可用下列两个函数之一来创建:
- plot(x, y, type=)
- lines(x, y, type=)
可以看到,type="p"生成了典型的散点图,type="b"是最 常见的折线图。b和c间的不同之处在于点是否出现或者线之间是否有空隙。type="s"和 type="S"都生成阶梯线(阶梯函数),但第一种类型是先横着画线,然后再上升,而第二种类型 则是先上升,再横着画线。
如果对图形有要求,你可以先通过plot()函数中的type="n"选项来创建坐标轴、标题和其他图形特征,然后再使用 lines()函数添加各种需要绘制的曲线。
- 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)"
- )
- # plot()先创建空图形,只设定了轴标签和轴范围,并没有绘制任何数据点
- 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]
- )
- }
- # 每种橘树独有的折线和点都是随后通过lines()函数来添加的
-
-
- title("Tree Growth", "example of line plot")
- legend(xrange[1], yrange[2],
- 1:ntrees,
- cex=0.8,
- col=colors,
- pch=plotchar,
- lty=linetype,
- title="Tree"
- )
- # 添加图例
哪些变量相关性最强?哪些变量相对独立?是否存在某种聚集模式?如果不花点时间和精 力(可能还需要用些彩笔做些注释),单利用这个相关系数矩阵来回答这些问题是比较困难的。 利用corrgram包中的corrgram()函数,你可以用图形的方式展示该相关系数矩阵
- library(corrgram)
- corrgram(mtcars, order=TRUE, lower.panel=panel.shade,
- upper.panel=panel.pie, text.panel=panel.txt,
- main="Corrgram of mtcars intercorrelations")
corrgram(x, order=, panel=, text.panel=, diag.panel=)
- #例子2
- 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")
- library(corrgram)
- corrgram(mtcars, lower.panel=panel.shade,
- upper.panel=NULL, text.panel=panel.txt,
- main="Car Mileage Data (unsorted)")
- library(corrgram)
- cols <- colorRampPalette(c("darkgoldenrod4", "burlywood1",
- "darkkhaki", "darkgreen"))
- corrgram(mtcars, order=TRUE, col.regions=cols,
- lower.panel=panel.shade,
- upper.panel=panel.conf, text.panel=panel.txt,
- main="A Corrgram (or Horse) of a Different Color")
在马赛克图中,嵌套矩形面积正比于单元格频率, 其中该频率即多维列联表中的频率。颜色和/或阴影可表示拟合模型的残差值。
vcd包中的mosaic()函数可以绘制马赛克图。(R基础安装中的mosaicplot()也可绘制马 赛克图,但我还是推荐vcd包,因为它具有更多扩展功能。)
- library(vcd)
- mosaic(~Class+Sex+Age+Survived, data=Titanic, shade=TRUE, legend=TRUE)
马赛克图隐含着大量的数据信息。
例如:
扩展的马赛克图添加了颜色和阴影来表示拟合模型的残差值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。