数据派THU 关注
手机版

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

  1. 云栖社区>
  2. 数据派THU>
  3. 博客>
  4. 正文

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

技术小能手 2018-05-16 11:08:34 浏览1543 评论0

摘要: 当考察多个变量间的相关关系时,通常将多个变量的两两关系以矩阵的形式排列起来,R提供了散点图矩阵、相关矩阵等多种可视化方案,囊括了众多函数。本文对R语言相关关系可视化的函数进行了初步梳理(全篇框架如下),后续大家可根据个人需求及函数功能择优选择。

当考察多个变量间的相关关系时,通常将多个变量的两两关系以矩阵的形式排列起来,R提供了散点图矩阵、相关矩阵等多种可视化方案,囊括了众多函数。本文对R语言相关关系可视化的函数进行了初步梳理(全篇框架如下),后续大家可根据个人需求及函数功能择优选择。

ca2a37780049afa7173657f022b8b242bc816d00

一、pairs {graphics}

1. 参考

(1)《现代统计图形》 5.17 散点图矩阵

(2)《R数据可视化手册》 5.13绘制散点图矩阵

(3)pairs {graphics} 帮助文档

2. 主要参数解释

82ece3dd860e85cc7630602d040c98ca22276e71

3. 图形示例

3.1 基本图形

pairs(iris[1:4], main = "Anderson's Iris Data -- 3 species",

pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])

# 等同于 pairs(~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, data=iris,main = "Anderson's Iris Data -- 3 species",pch = 21,
 bg = c("red", "green3", "blue")[unclass(iris$Species)])

0b84afc09d459dc3c072c1e4e6385f874a003b1f

上例选取iris鸢尾花数据集的前4列Sepal.Length 、Sepal.Width 、Petal.Length、Petal.Width作图,同时设置bg使得不同颜色代表不同品种的鸢尾花。可见,默认生成的散点图矩阵对角线为变量名称,上三角和下三角面板的各个窗格均为其所在行与列两个变量之间的散点图,信息传递量相对较少且重复,为此我们可以通过自定义函数进一步修改和优化。

3.2 自定义图形

# 1. 自定义函数pannel.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(prefix, txt)

if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)

text(0.5, 0.5, txt, cex = cex.cor * r)

}

# 2. 自定义函数pannel.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's Iris Data -- 3 species",

pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)],

diag.panel=panel.hist,

upper.panel=panel.cor,

lower.panel=panel.lm)

3c92622da39f65997e4001cc31a0fff5d1320551

自定义后的散点图矩阵主对角线上用了直方图,从中我们可以看到四个变量各自的分布情况;上三角面板显示了各个变量之间的相关系数,相关系数越大字号越大;下三角为散点图,并用不同颜色的点标记出鸢尾花的不同类型,同时利用函数panel.ls()添加了一条线性拟合线。此外,我们也可以将子面板函数设置为NULL,使得图形仅显示一半。

二、gpairs {gpairs}

1. 参考

(1)gpairs {gpairs} 帮助文档

(2)统计之都:不同版本的散点图矩阵

https://cosx.org/2009/03/scatterplot-matrix-visualization

2. 主要参数解释

428d5518e9dbef43486d26c746765dc598db017f

3. 图形示例

library(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))

718dd31fd39564540d26e005edb55cb6edcfe83c

上图中,4*4矩阵反映了iris前4列Sepal.Length 、Sepal.Width 、Petal.Length、Petal.Width变量两两之间的相关关系,其中,上三角显示了相关关系的数量特征,如相关系数、p值等;下三角为散点图,不同种类的鸢尾花用不同颜色、不同点型表示;最右侧一列和最下方一行则分别对三种鸢尾花的花萼和花瓣长宽进行了简单的描述性统计分析。

三、corrgram {corrgram}

1. 参考

(1)《R语言实战》11.3 相关图

(2)Friendly M. Corrgrams: Exploratory Displays for Correlation Matrices[J]. American Statistician, 2002, 56(4):316-324.

(3)corrgram {corrgram} 帮助文档

2. 主要参数解释

3265f29eb9642fda41faeaccf6ea97c02e092d7e

3. 图形示例

library(corrgram)

vars2 <- c("Assists","Atbat","Errors","Hits","Homer","logSal",

"Putouts","RBI","Runs","Walks","Years")

corrgram(baseball[vars2], order=TRUE, main="Baseball data PC2/PC1 order",

lower.panel=panel.shade, upper.panel=panel.pie)

b170cf404868fb8be56941b26a125fb0e5727d1f

上图中,下三角面板用阴影的深度来表示相关性大小,其中蓝色和从左下指向右上的斜杠表示单元格中的两个变量呈正相关,红色和从左上指向右下的斜杠表示变量呈负相关;色彩越深,饱和度越高,变量相关性越大。上三角面板用饼图的填充比例来表示相关性大小,颜色的功能同上,但相关性大小由被填充的饼图块的大小来展示,正相关性将从12点钟处开始顺时针填充饼图,负相关性则逆时针方向填充饼图。

corrgram(auto, order=TRUE, main="Auto data (PC order)",

lower.panel=corrgram::panel.ellipse,

upper.panel=panel.bar, diag.panel=panel.minmax,

col.regions=colorRampPalette(c("darkgoldenrod4", "burlywood1",

"darkkhaki", "darkgreen")))

fa7a4539c7e41492af7bcbdb9604223d0c155703

上图中,下三角面板绘制置信椭圆和平滑拟合曲线,上三角面板绘制柱形图;主对角面板指定显示变量的最小值和最大值;矩阵的行和列利用主成分分析法进行了重排序。此外,也可设置 lower.panel或upper.panel为NULL使得图形仅显示一半。

四、corrplot {corrplot}

1. 参考

(1)《R数据可视化手册》13.1 绘制相关矩阵图

(2)corrplot {corrplot} 帮助文档

(3)知乎:R语言相关系数可视化之corrplot包

https://zhuanlan.zhihu.com/p/28076189

(4)CSDN博客:R画月亮阴晴圆缺-corrplo绘图相关系数矩阵

https://blog.csdn.net/woodcorpse/article/details/79417978

2. 主要参数解释

dec70cdb2ccbd4c3c60cf9e3c16db96f37c9fe4f

3. 图形示例

(1)相关矩阵可视化

d47e62d2b349aca45e42305ed6714efbe5ed61d9仅相关系数

library(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")

f343a4b366b37204ac3dac8638ba469dc82200ce

上图中,上三角面板以不同颜色和大小的圆形表示相关性大小,其中,蓝色表示正相关,红色表示负相关;颜色越深、圆形越大代表相关性越高;下三角面板在原有图形的基础上叠加而成(如果想仅显示部分,可不再叠加),用相关系数的数值和颜色表示相关性方向和大小,并利用AOE(前两个特征向量的角排序)对变量进行重排序。

d47e62d2b349aca45e42305ed6714efbe5ed61d9相关系数+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")

13c10c052ad611cb802d2848a98002162f005896

上图中,上三角面板绘制椭圆形,下三角显示相关系数,并设置没通过统计相关性检验的结果打X。

(2)普通矩阵可视化

corrplot还支持对普通矩阵进行可视化,如下图。

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")

23f445eea7bbd954a3e2922c07d765abcf3759f3

五、ggpairs {GGally}

1. 参考

ggpairs {GGally}帮助文档

2. 主要参数解释

7151b6c250a989b2162b56a1ae736318431991b4

3. 图形示例

(1)直接指定图形类型

library(GGally)

ggpairs(flea, columns = 2:4, ggplot2::aes(colour=species))

05c2632dcd35590497d74b339d5a51675a9e57fe

上图基于函数默认参数设置,并建立颜色和种类的映射,使得不同种类具有不同颜色,其中,上三角面板显示相关系数,包括总体相关以及不同种类的相关;下三角绘制散点图;主对角线用面积图表示。

(2)自定义函数

library(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"

)

5615ec5228decda4fa12267c526e7814e42504e1

上图利用wrap将相关参数进行封装,使得下三角显示密度图,透明度为0.5。

六、coplot {graphics}

又名“条件分割图”,与上述函数思想有所不同,该函数能够实现在给定某一个(或几个)变量z之后看观察两个变量之间的关系(以散点图形式),条件分割图中散点图的顺序是从左到右、从下到上,分别与条件变量从左到右、从下到上的指示条对应。关于coplot的具体解释和用法可参见帮助文档及谢益辉《现代统计图形》5.9 条件分割图,下面是原书中的一个例子。

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("New Zealand","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))

})

9ddbcc864ae0999546c4ab6087dca5d4e008ad7d

quakes {datasets} 数据集反映了1964年以来斐济岛附近发生的震级MB大于4.0的地震事件数据,如果我们想知道该地区在地震深度分布上是否均匀,可以令深度变量为条件变量,绘制条件分割图,观察在不同条件下地震发生地点(经纬度)是否有变化。图示上方是用矩形条标记出来的条件变量的取值范围,下方是条件散点图,从图中可以清楚地看出,随着深度值的增加,地震发生地点逐渐由西向东、由南向北移动,震源较深的地震都发生在离斐济岛很近的东南侧。

七、其他函数

以上六个函数很大程度上可以满足我们对相关关系可视化的需求,此外,R还提供了众多相关函数,下面选取了几个函数帮助文档中的实例进行简单介绍以作了解。

1. splom {lattice}

基于lattice作图系统,也可以通过进一步的设置达到更高的可视化要求。

library(lattice)

super.sym <- trellis.par.get("superpose.symbol")

splom(~iris[1:4], groups = Species, data = iris,

panel = panel.superpose,

key = list(title = "Three Varieties of Iris",

columns = 3,

points = list(pch = super.sym$pch[1:3],

col = super.sym$col[1:3]),

text = list(c("Setosa", "Versicolor", "Virginica"))))

da361449009be4997cbd20343b94665a52bc4659

2. scatterplotMatrix {car}

可以直接指定主对角线上的图形元素(密度图、箱线图、直方图、QQ图等),还可以在散点图中添加拟合曲线、平滑曲线、相关读椭圆等。

library(car)

scatterplotMatrix(~ income + education + prestige | type, data=Duncan)

e4f903a03217dcfc12f31392f4797d7594272e13

3. ggscatmat {GGally}

简化版的ggpairs,只有五个参数:数据源、观测范围设定、颜色、透明度及相关度计算方法。

library(GGally)

data(flea)

ggscatmat(flea, columns = 2:4, color = "species")

f2e2717598a4af0b3c37839d0fb6bcdf3ded8cd4

4. cpairs {gclus}

library(gclus)

data(USJudgeRatings)

judge.cor <- cor(USJudgeRatings)

judge.color <- dmat.color(judge.cor)

cpairs(USJudgeRatings,panel.colors=judge.color,pch=".",gap=.5)
7ea2d49a0eef9986f187d4b7aa5246ee387b089d


原文发布时间为:2018-05-15本文作者:赵镇宁本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”。

用云栖社区APP,舒服~

【云栖快讯】诚邀你用自己的技术能力来用心回答每一个问题,通过回答传承技术知识、经验、心得,问答专家期待你加入!  详情请点击

网友评论

技术小能手
文章5218篇 | 关注1193
关注
阿里云函数计算(Function Compute)是一个事件驱动的全托管计算服务。通过函数计... 查看详情
专精于业务数据与地理信息融合的大数据可视化,通过图形界面轻松搭建专业的可视化应用, 满足您日... 查看详情
一种稳定、可靠、容量和服务能力可弹性伸缩的分布式关系型数据库服务。 查看详情
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效... 查看详情
阿里云总监课正式启航

阿里云总监课正式启航