R語言相關關系可視化函數梳理(附代碼)
當考察多個變量間的相關關系時,通常將多個變量的兩兩關系以矩陣的形式排列起來,R提供了散點圖矩陣、相關矩陣等多種可視化方案,囊括了眾多函數。本文對R語言相關關系可視化的函數進行了初步梳理(全篇框架如下),后續(xù)大家可根據個人需求及函數功能擇優(yōu)選擇。

一、pairs {graphics}
1. 參考
- (1)《現(xiàn)代統(tǒng)計圖形》 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使得不同顏色代表不同品種的鳶尾花。可見,默認生成的散點圖矩陣對角線為變量名稱,上三角和下三角面板的各個窗格均為其所在行與列兩個變量之間的散點圖,信息傳遞量相對較少且重復,為此我們可以通過自定義函數進一步修改和優(yōu)化。
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)統(tǒng)計之都:不同版本的散點圖矩陣
- 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值等;下三角為散點圖,不同種類的鳶尾花用不同顏色、不同點型表示;最右側一列和最下方一行則分別對三種鳶尾花的花萼和花瓣長寬進行了簡單的描述性統(tǒng)計分析。
三、corrgram {corrgram}
1. 參考
- (1)《R語言實戰(zhàn)》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")
上圖中,上三角面板繪制橢圓形,下三角顯示相關系數,并設置沒通過統(tǒng)計相關性檢驗的結果打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}
又名“條件分割圖”,與上述函數思想有所不同,該函數能夠實現(xiàn)在給定某一個(或幾個)變量z之后看觀察兩個變量之間的關系(以散點圖形式),條件分割圖中散點圖的順序是從左到右、從下到上,分別與條件變量從左到右、從下到上的指示條對應。關于coplot的具體解釋和用法可參見幫助文檔及謝益輝《現(xiàn)代統(tǒng)計圖形》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年以來斐濟島附近發(fā)生的震級MB大于4.0的地震事件數據,如果我們想知道該地區(qū)在地震深度分布上是否均勻,可以令深度變量為條件變量,繪制條件分割圖,觀察在不同條件下地震發(fā)生地點(經緯度)是否有變化。圖示上方是用矩形條標記出來的條件變量的取值范圍,下方是條件散點圖,從圖中可以清楚地看出,隨著深度值的增加,地震發(fā)生地點逐漸由西向東、由南向北移動,震源較深的地震都發(fā)生在離斐濟島很近的東南側。
七、其他函數
以上六個函數很大程度上可以滿足我們對相關關系可視化的需求,此外,R還提供了眾多相關函數,下面選取了幾個函數幫助文檔中的實例進行簡單介紹以作了解。
1. splom {lattice}
基于lattice作圖系統(tǒng),也可以通過進一步的設置達到更高的可視化要求。
- 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)