R语言实战笔记--第十一章 中级绘图之散点、气泡、相关、马赛克

R语言实战笔记–第十一章 中级绘图之散点、气泡、相关、马赛克

标签(空格分隔): R语言 绘图方法 散点图 气泡图 相关图 马赛克图


R语言实战中的中级绘图包括了散点图、气泡图、拆线图、相关图和马赛克图,主要讲述的是二元和多元关系的图形表述。

散点图

散点图,可以说得上是所有图的基础,因为其它图无一不是由点组成的线或面,理解散点图,其它图基本就有个大概的理解了。
散点图一般来说,都是配对出现,二维坐标是两个数据(x,y),三维就是(x,y,z)。把这些点连接起来就是折线图,把这些点按某个面填充就是平面图。
下面看一下几种类型的散点图。
首先是二维散点图,添加了回归拟合及多项式拟合曲线:

#plot+abline+lines基本组合,依赖基础包即可,要求对基础包有较高的认识水平。
with(mtcars,{plot(wt,mpg,main="BS",ylab="MPG",xlab="weight",pch=19)
abline(lm(mpg~wt),col="red",lwd=2,lty=1)
lines(lowess(wt,mpg),col="blue",lwd=2,lty=2)})
#car包中的scatterplot,使用方便,仅需要设置参数即可。
library(car)
scatterplot(mpg~wt|cyl,legend.plot=T,id.method="identify",labels=row.names(mtcars),boxplots="xy") #“|cyl”意思为以cyl为分类,boxplots="xy"意思为添加xy的边界箱线图,可以是“x”,也可以只是“y”,或者不要。

这里写图片描述
这里写图片描述
然后是散点矩阵图,它能够显示多个变量之间的两两关系

#pairs,依赖基础包即可,要求对基础包有较高的认识水平。但这个包只能显示散点矩阵图,并不能显示拟合线,总体上看并不是那么直观。
pairs(~mpg+disp+drat+wt,data=mtcars,main="Matrix Scatter Plot")
#car包中的scatterplotMatrix,除了散点矩阵,还可以在图中添加1)以某个因子为条件绘制散点图矩阵2)包含线性和平滑拟合曲线3)在主对角线放置箱线图、密度图或者直方图4)在各单元格的边界添加轴须图。
library(car)
scatterplotMatrix(~mpg+disp+drat+wt,data=mtcars,spread=FALSE,lty=2,main="Scatter Plot Matrix") #spread=F意思为不添加展示分散度和对称信息的直线;主对角线的核密度曲线、各图的线性及平滑曲线默认添加。
#scatterplotMatrix函数还可以以某个因子为条件做散点矩阵图,并把主对角线的核密度曲线改为直方图显示
scatterplotMatrix(~ mpg + disp + drat + wt | cyl, data=mtcars, spread=FALSE,main="Scatterplot Matrix via car package",diagonal="histogram")#diagonal的参数还可以是“density(密度图),boxplot(箱线图),oned(不晓得),qqplot(QQ图),none”;添加by.groups=TRUE可以按子集(这里是cyl)分别生成拟合曲线。
#gclus包中的cpairs函数可以生成一个根据相关性重排并着色的矩阵,代码如下:
library(gclus)
ydata <- mtcars[c(1,3,5,6)]#获取数据
mydata.corr <- abs(cor(mydata))#求相关系数并取绝对值
mycolors <- dmat.color(mydata.corr) #设置颜色
myorder <- order.single(mydata.corr) #设置生排,相关性高的更靠近主对角线
cpairs(mydata,myorder,panel.colors=mycolors,gap=.5,main="Variables Ordered and Colored by Correlation")#作图

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
然后是高密度散点图
高密度散点图有很多包都支持,直接使用plot画出的散点图在密度较高的时候,因为密度过高,所有的点都在一个大区域集中、重叠,导致分不清某个区域至今集中了多少个点,此时,可以使用透明度、颜色,封箱等方法进行画图。

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(mydata,
smoothScatter(x, y, main="Scatterplot by smoothScatter"))
library(hexbin)
with(mydata, {
bin <- hexbin(x, y, xbins=50)
plot(bin, main="Scatterplot by hexbin:plot")})
library(IDPmisc)
with(mydata,
iplot(x, y, main="Scatterplot by IDPmisc:iplot"))

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

最后是三维散点图,三维散点图也可以通过添加回归曲面。代码如下:

library(scatterplot3d)
attach(mtcars)
#单纯画出维散点图
scatterplot3d(wt, disp, mpg, main="Basic 3D Scatterplot")
#添加纵深感(通过颜色,越后面越黑)与点到水平面的垂直线
scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE,type="h",main="3D Scatterplot with Vertical Lines")
#添加回归平面,点到回归平面的垂直距离为残差
s3d <-scatterplot3d(wt, disp, mpg, pch=16, highlight.3d=TRUE, type="h", main="3D Scatter Plot with Verical Lines and Regression Plane")
fit <- lm(mpg ~ wt+disp) 
s3d$plane3d(fit)
detach(mtcars)、
#3D可交互散点图,在rgl包中,但没有其它参数可选,较为难理解。
library(rgl)
plot3d(wt, disp, mpg, col="red", size=5)
#Rcmdr包中的scatter3d命令,可以创建一个带平面(默认线性)的3D可交互散点图
library(Rcmdr)
scatter3d(wt, disp, mpg)

这里写图片描述
可交互的3D散点图以及Rcmdr包中的3D散点图就不在这里展示了。

气泡图

实际上,气泡图应该也是散点图的一种,它可以使用点(即气泡)的大小来表示第三个变量,代码如下:

#使用symbols画气泡图,fg设置气泡边界颜色,bg设定气泡颜色,text参数添加气泡名称。当气泡过多时,不宜全部添加,当气泡过密时,不宜使用气泡图!
attach(mtcars)
r <- sqrt(disp/pi)
symbols(wt, mpg, 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)

这里写图片描述

折线图

很明显,将散点图上的点连接起来,就是折线图。

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")
#把散点图连接起来,type="b"的意思为显示点(p)和线(l)
plot(t1$age, t1$circumference, xlab="Age (days)", ylab="Circumference (mm)", main="Orange Tree 1 Growth", type="b")


折线图中的type有以下几种参数值:对应的表及图如下:

类型图形外观
p只有点
l只有线
o实心点和线(即线覆盖在点上)
b、c线连接点(c时不绘制点)
s、S阶梯线
h直方图式的垂直线
n不生成任何点和线(通常用来为后面的命令创建坐标轴)

各参数值对应的生成的图如下:
这里写图片描述
折线图中可以使用type=”n”来创建一个空白的坐标轴,然后通过lines在图中添加折线,注意,plot是直接创建一个新的绘图窗口,而lines、title、text、legend等是在已有的绘图窗口上进行创建。下面例子是五棵树的生长过程。

#建立树的相关内容(有多少棵树),把因子转化为数值型,方便图形处理
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,线形linetype,点形plotchar
colors <- rainbow(ntrees)
linetype <- c(1:ntrees)
plotchar <- seq(18, 18+ntrees, 1)
#利用for循环和lines进行取数并画出折线
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 line plot")
#添加图例
legend(xrange[1], yrange[2], 1:ntrees, cex=0.8, col=colors, pch=plotchar, lty=linetype, title="Tree" )

这里写图片描述

相关图

书中介绍相关图只有一个函数,就是corrgram包中的corrgram函数,先看其函数及参数,再看代码和图。

corrgram(dataframe,order=T/F,lower.panel=panel.od,upper.panel=panel.od,text.panel=panel.d,diag.panel=panel.d,col.regions=colorRampPalette(c("color1","color2","color3","color4")))
参数说明:
order=T/F:TRUE时,使用主成分法对数据进行重排,使相关性更高的更接近主对角线;
lower/upper.panel:下/上三角作图区域设置,参数值由panel.od给出
panel.od:代表着非主对角线的图形,od参数不存在,使用时替换为pts(散点图), pie(饼图), shade(方块图), bar(条形图), ellipse(椭圆图), conf(带置信区间的相关系数), cor(相关系数)
text/diag.panel:主对角线作图区域,参数值由panel.d给出
panel.d:text.panel只有panel.txt或NULL可选,而diag.panel则有minmax(最大最小值)和density(密度曲线)可选,当然,所有的作图区域都可以使用NULL来取消作图。
col.regions:自定义颜色,必须使用colorRampPalette函数定义其参数值。

代码及作图如下:

example(corrgram)
这里写图片描述
这里写图片描述

马赛克图

图很复杂!要仔细琢磨才能看得懂,对于分析可能有意义,但是如果你拿出去展示,单单解释这个图的含义就够呛!
mosaicplot(formula,data)或者vcd包中的mosaic(formula.data)函数均可制作马赛克图,书中只介绍了vcd包中的mosaic函数,那这里也只说明这个函数吧。

mosaic(table) / mosaic(formula,data,shade=T,legend=T)
其中table是一个数组形式的列联表,formula是标准R表达式,data是一个数据框或表格,shade=T为根据拟合模型的皮尔逊残差值对图形上色,legend = T将展示残差的图例。下面两式等价,需要先载入vcd包。
mosaic(Titanic,shade=T,legend=T)
mosaic(~Class+Sex+Age+Survived,data=Titanic,shade=T,legend=T)

这里写图片描述
四个变量,马赛克图对这四个变量进行左,上,右,下四边进行分隔,层次也由此顺序进行,左边为最大的层次,间隔最大,如果把Survived放到第一变量,即在左边进行分隔,那么,图形将会变成上部为死亡,下部为生存,可以自己试一下。进行皮尔逊残差值着色的时候,在生存率与船舱等级、年龄及性别无关的条件下,蓝色代表超过期望数,红色代表低于期望值,颜色越深差距越大。


版权声明:本文为gdyflxw原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。