当考察多个变量间的相关关系时,通常将多个变量的两两关系以矩阵的形式排列起来,R提供了散点图矩阵、相关矩阵等多种可视化方案,囊括了众多函数。本文对R语言相关关系可视化的函数进行了初步梳理(全篇框架如下),后续大家可根据个人需求及函数功能择优选择。
一、pairs {graphics}
1. 参考
- (1)《现代统计图形》 5.17 散点图矩阵
- (2)《R数据可视化手册》 5.13绘制散点图矩阵
- (3)pairs {graphics} 帮助文档
2. 主要参数解释
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)])
上例选取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)
自定义后的散点图矩阵主对角线上用了直方图,从中我们可以看到四个变量各自的分布情况;上三角面板显示了各个变量之间的相关系数,相关系数越大字号越大;下三角为散点图,并用不同颜色的点标记出鸢尾花的不同类型,同时利用函数panel.ls()添加了一条线性拟合线。此外,我们也可以将子面板函数设置为NULL,使得图形仅显示一半。
二、gpairs {gpairs}
1. 参考
- (1)gpairs {gpairs} 帮助文档
- (2)统计之都:不同版本的散点图矩阵
- https://cosx.org/2009/03/scatterplot-matrix-visualization
2. 主要参数解释
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))
上图中,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. 主要参数解释
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)
上图中,下三角面板用阴影的深度来表示相关性大小,其中蓝色和从左下指向右上的斜杠表示单元格中的两个变量呈正相关,红色和从左上指向右下的斜杠表示变量呈负相关;色彩越深,饱和度越高,变量相关性越大。上三角面板用饼图的填充比例来表示相关性大小,颜色的功能同上,但相关性大小由被填充的饼图块的大小来展示,正相关性将从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")))
上图中,下三角面板绘制置信椭圆和平滑拟合曲线,上三角面板绘制柱形图;主对角面板指定显示变量的最小值和***值;矩阵的行和列利用主成分分析法进行了重排序。此外,也可设置 lower.panel或upper.panel为NULL使得图形仅显示一半。
四、corrplot {corrplot}
1. 主要参数解释
2. 图形示例
(1)相关矩阵可视化
仅相关系数
- 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")
上图中,上三角面板以不同颜色和大小的圆形表示相关性大小,其中,蓝色表示正相关,红色表示负相关;颜色越深、圆形越大代表相关性越高;下三角面板在原有图形的基础上叠加而成(如果想仅显示部分,可不再叠加),用相关系数的数值和颜色表示相关性方向和大小,并利用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)直接指定图形类型
- library(GGally)
- ggpairs(flea, columns = 2:4, ggplot2::aes(colour=species))
上图基于函数默认参数设置,并建立颜色和种类的映射,使得不同种类具有不同颜色,其中,上三角面板显示相关系数,包括总体相关以及不同种类的相关;下三角绘制散点图;主对角线用面积图表示。
(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"
- )
上图利用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))
- })
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"))))
2. scatterplotMatrix {car}
可以直接指定主对角线上的图形元素(密度图、箱线图、直方图、QQ图等),还可以在散点图中添加拟合曲线、平滑曲线、相关读椭圆等。
- library(car)
- scatterplotMatrix(~ income + education + prestige | type, data=Duncan)
3. ggscatmat {GGally}
简化版的ggpairs,只有五个参数:数据源、观测范围设定、颜色、透明度及相关度计算方法。
- library(GGally)
- data(flea)
- ggscatmat(flea, columns = 2:4, color = "species")
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)