当前位置: 首页 > 科技观察

R语言关联可视化函数梳理(附代码)

时间:2023-03-13 05:18:55 科技观察

在考察多个变量之间的相关性时,通常将多个变量的成对关系以矩阵的形式排列。R提供了散点图矩阵,相关矩阵等各种可视化方案,包括很多功能。本文简单梳理一下R语言关联可视化的功能(全文框架如下),大家可以根据个人需求和函数功能选择最佳。1.pairs{graphics}1.参考(1)《现代统计图形》5.17散点图矩阵(2)《R数据可视化手册》5.13绘制散点图矩阵(3)pairs{graphics}帮助文档2.主要参数说明3.图形示例3.1基础图形对(iris[1:4],main="Anderson'sIrisData--3species",pch=21,bg=c("red","green3","blue")[unclass(iris$Species)])#等于pairs(~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,data=iris,main="Anderson'sIrisData--3species",pch=21,bg=c("red","green3","blue")[unclass(iris$Species)])上例中选取鸢尾鸢尾数据集Sepal.Length、Sepal.Width、Petal.Length、Petal.Width的前4列进行绘制,和设置背景使不同的颜色代表不同品种的鸢尾花。可以看出默认生成的散点图矩阵的对角线是变量名,上下三角面板的每个方格都是行列两个变量之间的散点图,信息传递量相对smallandRepeat,对此我们可以通过自定义函数进一步修改优化。3.2自定义图形#1。自定义函数panel.cor:显示两个变量之间的相关系数,相关系数越大,字体越大。panel.cor<-function(x,y,digits=2,prefix="",cex.cor,...){usr<-par("usr");on.exit(par(usr))par(usr=c(0,1,0,1))r<-abs(cor(x,y))txt<-format(c(r,0.123456789),digits=digits)[1]txt<-paste0(前缀,txt)if(缺失(cex.cor))cex.cor<-0.8/strwidth(txt)text(0.5,0.5,txt,cex=cex.cor*r)}#2。自定义函数panel.hist:显示各个变量的直方图panel.hist<-function(x,...){usr<-par("usr");on.exit(par(usr))par(usr=c(usr[1:2],0,1.5))h<-hist(x,plot=FALSE)breaks<-h$breaks;nB<-length(breaks)y<-h$counts;y<-y/max(y)rect(breaks[-nB],0,breaks[-1],y,col="cyan",...)}#3。自定义函数panel.ls:绘制散点图并在其上添加线性拟合线panel.lm<-function(x,y,col=par("col"),bg=NA,pch=par("pch"),cex=1,col.smooth="black",...){points(x,y,pch=pch,col=col,bg=bg,cex=cex)abline(stats::lm(y~x),col=col.smooth,...)}#4。在默认图形上使用相关系数(pannel.cor)代替带有三角形的散点图,使用直方图(pannel.hist)代替默认图形对角线的变量名,使用添加了线性拟合线的散点图(panel.ls)代替散点图默认图形的下三角。pairs(iris[1:4],main="Anderson'sIrisData--3species",pch=21,bg=c("red","green3","blue")[unclass(iris$Species)],diag.panel=panel.hist,upper.panel=panel.cor,lower.panel=panel.lm)自定义的散点图矩阵使用了主对角线上的直方图,从中我们可以看出四个变量分别是上三角面板表示变量之间的相关系数,相关系数越大,字体越大;下三角为散点图,用不同颜色的点标示不同种类的鸢尾花,使用功能面板。ls()添加一条线性拟合线。另外,我们也可以将subpanel函数设置为NULL,这样只显示一半的图。2.gpairs{gpairs}1.参考(1)gpairs{gpairs}帮助文档(2)统计之都:不同版本的散点图矩阵https://cosx.org/2009/03/scatterplot-matrix-visualization2。主要参数解释3.图形示例库(gpairs)gpairs(iris,upper.pars=list(scatter='stats'),scatter.pars=list(pch=substr(as.character(iris$Species),1,1),col=as.numeric(iris$Species)),stat.pars=list(verbose=TRUE))上图中4*4的矩阵反映了鸢尾花的前4列Sepal.Length,Sepal.Width,Petal.Length,Petal.Width变量之间的相关性,其中上三角表示相关性的定量特征,如相关系数,p值等;点类型代表;最右一列和最下面一行分别对三种鸢尾花的萼片和花瓣的长度和宽度进行了简单的描述性统计分析。3.corrgram{corrgram}1.参考(1)《R语言实战》11.3correlationgraph(2)FriendlyM.Corrgrams:ExploratoryDisplaysforCorrelationMatrices[J].美国统计学家,2002年,56(4):316-324。(3)corrgram{corrgram}帮助文档2.主要参数说明3.图例库(corrgram)vars2<-c("Assists","Atbat","Errors","Hits","Homer","logSal","Putouts","RBI","Runs","Walks","Years")corrgram(baseball[vars2],order=TRUE,main="BaseballdataPC2/PC1order",lower.panel=panel.shade,upper.panel=panel.pie)上图中,下三角panel用阴影的深浅表示相关大小,其中蓝色和从左下角指向右上角的斜线表示cell中的两个变量是正相关的,红色和从左上角到右下角的斜线表示变量是负相关的;颜色越深,饱和度越高,变量的相关性越大。上三角面板使用饼图的填充率来表示相关性大小。颜色的作用同上,但是关联大小是通过填充的饼图块的大小来显示的。正相关将从12点钟方向顺时针填充饼图,负相关则逆时针方向填充饼图。corrgram(auto,order=TRUE,main="Autodata(PCorder)",lower.panel=corrgram::panel.ellipse,upper.panel=panel.bar,diag.panel=panel.minmax,col.regions=colorRampPalette(c("darkgoldenrod4","burlywood1","darkkhaki","darkgreen")))上图中,下三角面板绘制置信椭圆和平滑拟合曲线,上三角面板绘制柱状图;主对角线面板指定显示变量的最小值和最大值;使用主成分分析对矩阵的行和列进行了重新排序。另外,也可以将lower.panel或upper.panel设置为NULL,这样只显示一半的图。4.corrplot{corrplot}1.主要参数解释2.图例(1)相关矩阵可视化仅相关系数库(corrplot)data(mtcars)M<-cor(mtcars)corrplot(M,order="AOE",type="upper",tl.pos="d")corrplot(M,add=TRUE,type="lower",method="number",order="AOE",diag=FALSE,tl.pos="n",cl.pos="n")上图中,上三角面板中不同颜色和大小的圆圈表示相关性的大小,其中蓝色表示正相关,红色表示负相关;颜色越深,圆圈越大,表示相关性越高;下三角面板在原图的基础上叠加(如果只显示部分,可以不再叠加),用相关系数的值和颜色表示相关的方向和大小,用AOE(特征向量的前两个角排序)对变量重新排序。相关系数+P值res1<-cor.mtest(mtcars,conf.level=0.95)corrplot(M,method="ellipse",p.mat=res1$p,sig.level=0.2,order="AOE",type="upper",tl.pos="d")corrplot(M,add=TRUE,p.mat=res1$p,sig.level=0.2,type="lower",method="number",order="AOE",diag=FALSE,tl.pos="n",cl.pos="n")上图中,上三角面板画椭圆,下三角显示相关系数,设置那些没有通过统计相关性检验结果是一个X。(2)普通矩阵可视化dat=matrix(c(1:10,10:1),nrow=10)wb<-c("white","black")corrplot(t(dat),method="pie",is.corr=F,cl.pos="n",tl.pos="n",cl.lim=c(1,10),col=wb,bg="gold2")五、ggpairs{GGally}1.参考ggpairs{GGally}帮助文档2.主要参数说明3.图形示例(1)直接在ggpairs(flea,columns)上指定图形类型库(GGally)=2:4,ggplot2::aes(colour=species))该图根据函数的默认参数设置,建立t颜色和类型的映射,让不同的类型有不同的颜色。其中,上三角面板显示相关系数,包括整体相关和不同类型的相关;下三角绘制散点图;主对角线在面积图中表示。(2)自定义函数库(ggplot2)diamonds.samp<-diamonds[sample(1:dim(diamonds)[1],1000),]ggpairs(diamonds.samp[,c(1:2,5,7)],mapping=aes(color=cut),lower=list(continuous=wrap("density",alpha=0.5),combo="dot_no_facet"),title="Diamonds")上图用wrap封装了相关参数,使下方的三角形显示不透明度为0.5的密度图。6.Coplot{graphics},也称为“条件分割图”,与上述函数的思路不同。这个函数可以实现给定某个(或几个)变量z后两个变量之间的关系(以Scatterdiagram的形式),条件分割图中散点图的顺序是从左到右,从下到上top,从左到右,从下到上分别对应条件变量的指标条。coplot的具体解释和用法可以参考帮助文档和谢一辉《现代统计图形》5.9ConditionalSegmentationDiagram。下面是原书中的一个例子。par(mar=rep(0,4),mgp=c(2,0.5,0))library(maps)coplot(lat~long|depth,data=quakes,number=4,ylim=c(-45,-10.72),panel=function(x,y,...){map("world2",regions=c("NewZealand","Fiji"),add=TRUE,lwd=0.1,fill=TRUE,col="lightgray")text(180,-13,"Fiji",adj=1)text(170,-35,"NZ")points(x,y,col=rgb(0.2,0.2,0.2,0.5))})quakes{datasets}数据集反映了斐济岛附近自1964年以来发生的大于4.0级地震事件的数据。如果我们想知道该地区的地震深度分布是否均匀,我们可以设置深度变量作为条件变量并绘制条件分割图,观察地震发生的位置(经纬度)在不同条件下是否发生变化。图的上半部分是用矩形条标出的条件变量取值范围,下半部分是条件散点图。从图中可以明显看出,随着深度值的增加,地震位置逐渐由西向东、由南向南移动。向北移动,最深的地震都发生在非常靠近斐济岛的东南侧。7、其他功能以上六个功能可以很大程度上满足我们对关联关系可视化的需求。此外,R还提供了很多相关的函数。下面选取功能帮助文档中的示例进行简单介绍,以供理解。1.splom{lattice}基于点阵绘图系统,通过进一步的设置也可以满足更高的可视化要求。库(格子)super.sym<-trellis.par.get(“superpose.symbol”)splom(?iris[1:4],groups=Species,data=iris,panel=panel.superpose,key=list(标题="ThreeVarietiesofIris",columns=3,points=list(pch=super.sym$pch[1:3],col=super.sym$col[1:3]),text=list(c("Setosa",“云芝”,“弗吉尼亚”))))2。scatterplotMatrix{car}可以直接指定主对角线上的图形元素(密度图、箱线图、直方图、QQ图等),也可以在散点图上添加拟合曲线、平滑曲线、相对读取椭圆等库(car)scatterplotMatrix(~income+education+prestige|type,data=Duncan)3.ggscatmat{GGally}ggpairs的简化版,只有五个参数:数据源、观察范围设置、颜色、透明度和相关性计算方法。library(GGally)data(flea)ggscatmat(flea,columns=2:4,color="species")4.c??pairs{gclus}library(gclus)data(USJudgeRatings)judge.cor<-cor(USJudgeRatings)judge.color<-dmat.color(judge.cor)cpairs(USJudgeRatings,panel.colors=judge.color,pch=".,gap=.5)