R可視化相關(guān)性矩陣的幾種方案
R中相關(guān)性矩陣的可視化解決方法在已經(jīng)有很多了,我們?cè)谶@里總結(jié)一些常用的都有哪些:
- ggplot2包
- corrplot包
- 熱圖包(pheatmap懦鼠,heatmap包等)
- ggally 包中的 ggcorr() 函數(shù)
- ggcorrplot 包
準(zhǔn)備數(shù)據(jù)集
我們就使用R中內(nèi)置數(shù)據(jù)集mtcars, 計(jì)算出矩陣的相關(guān)系數(shù)corr匙监,后續(xù)出圖都將是基于這個(gè)數(shù)據(jù)進(jìn)行繪制。
data("mtcars")
cormat <- round(cor(mtcars), 1) # 計(jì)算相關(guān)系數(shù),默認(rèn)是pearson方法
# mpg cyl disp hp drat wt qsec vs am gear carb
#mpg 1.0 -0.9 -0.8 -0.8 0.7 -0.9 0.4 0.7 0.6 0.5 -0.6
#cyl -0.9 1.0 0.9 0.8 -0.7 0.8 -0.6 -0.8 -0.5 -0.5 0.5
#disp -0.8 0.9 1.0 0.8 -0.7 0.9 -0.4 -0.7 -0.6 -0.6 0.4
#......
方式一: ggplot2
- 通過(guò)reshape2包將矩陣變換為長(zhǎng)數(shù)據(jù)格式再進(jìn)行繪制
library(reshape2)
melted_cormat <- melt(cormat)
head(melted_cormat)
## Var1 Var2 value
## 1 mpg mpg 1.00
## 2 disp mpg -0.85
## 3 hp mpg -0.78
## 4 drat mpg 0.68
- 使用 geom_tile() 函數(shù)或者 geom_raster() 函數(shù)繪制相關(guān)性系數(shù)的圖,再通過(guò) coord_equal() 函數(shù)固定坐標(biāo)軸的縱橫比,簡(jiǎn)單出圖瞅瞅雨膨。
library(ggplot2)
ggplot(data = melted_cormat, aes(x=Var1, y=Var2, fill=value))+geom_raster() +coord_equal()
- 注意,相關(guān)性矩陣是有冗余信息的(矩陣的上三角和下三角信息表達(dá)一樣的意思)读串。我們可以使用下面函數(shù)(參考)將它的一半設(shè)為NA聊记,讓它只輸出上三角或者下三角矩陣的圖形(分別利用 upper.tri 和 lower.tri 函數(shù))撒妈。
# 得到上三角矩陣
get_lower_tri<-function(cormat){
cormat[upper.tri(cormat)] <- NA
return(cormat)
}
# 得到下三角矩陣
get_upper_tri <- function(cormat){
cormat[lower.tri(cormat)]<- NA
return(cormat)
}
# 使用
upper_tri <- get_upper_tri(cormat)
upper_tri
# mpg cyl disp hp drat wt qsec vs am gear carb
#mpg 1 -0.9 -0.9 -0.9 0.7 -0.9 0.5 0.7 0.6 0.5 -0.7
#cyl NA 1.0 0.9 0.9 -0.7 0.9 -0.6 -0.8 -0.5 -0.6 0.6
#disp NA NA 1.0 0.9 -0.7 0.9 -0.5 -0.7 -0.6 -0.6 0.5
#hp NA NA NA 1.0 -0.5 0.8 -0.7 -0.8 -0.4 -0.3 0.7
#drat NA NA NA NA 1.0 -0.8 0.1 0.4 0.7 0.7 -0.1
#wt NA NA NA NA NA 1.0 -0.2 -0.6 -0.7 -0.7 0.5
#qsec NA NA NA NA NA NA 1.0 0.8 -0.2 -0.1 -0.7
#vs NA NA NA NA NA NA NA 1.0 0.2 0.3 -0.6
#am NA NA NA NA NA NA NA NA 1.0 0.8 -0.1
#gear NA NA NA NA NA NA NA NA NA 1.0 0.1
#carb NA NA NA NA NA NA NA NA NA NA 1.0
- 畫圖
library(reshape2)
melted_cormat <- melt(upper_tri, na.rm = TRUE)
# Heatmap
library(ggplot2)
ggplot(data = melted_cormat, aes(Var2, Var1, fill = value))+
geom_tile(color = "white")+
scale_fill_gradient2(low = "green", high = "gold", mid = "white",
midpoint = 0, limit = c(-1,1), space = "Lab",
name="Pearson\nCorrelation") +
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, vjust = 1,
size = 12, hjust = 1))+
coord_fixed() # 這個(gè)函數(shù)確保x軸上的一個(gè)單位長(zhǎng)度與y軸上的一個(gè)單位長(zhǎng)度相同。
- 根據(jù)聚類順序重新排序繪制相關(guān)性圖排监,這樣的好處是將相關(guān)系數(shù)接近的緊挨在一起狰右,更有利于我們觀察數(shù)據(jù)中變化模式。這里我們利用hclust函數(shù)方法實(shí)現(xiàn)層級(jí)聚類舆床。
## 我們寫個(gè)函數(shù)
reorder_cormat <- function(cormat){
# 使用變量間的相關(guān)系數(shù)作為距離
dd <- as.dist((1-cormat)/2)
hc <- hclust(dd)
cormat <-cormat[hc$order, hc$order]
}
# 重排序相關(guān)矩陣
cormat <- reorder_cormat(cormat)
upper_tri <- get_upper_tri(cormat)
# 變換為長(zhǎng)格式數(shù)據(jù)
melted_cormat <- melt(upper_tri, na.rm = TRUE)
p <- ggplot(data = melted_cormat, aes(Var2, Var1, fill = value))+
geom_tile(color = "white")+
scale_fill_gradient2(low = "green", high = "gold", mid = "white",
midpoint = 0, limit = c(-1,1), space = "Lab",
name="Pearson\nCorrelation") +
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, vjust = 1,
size = 12, hjust = 1))+
coord_fixed()
p
- 將相關(guān)性系數(shù)增加在圖形上
p +
geom_text(aes(Var2, Var1, label = value), color = "black", size = 4) +
theme(
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.grid.major = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
axis.ticks = element_blank(),
legend.justification = c(1, 0),
legend.position = c(0.6, 0.7),
legend.direction = "horizontal")+
guides(fill = guide_colorbar(barwidth = 7, barheight = 1,
title.position = "top", title.hjust = 0.5))
方式二: corrplot
這個(gè)包應(yīng)該算是可視化相關(guān)性圖最簡(jiǎn)便的方式了吧棋蚌,還是推薦大家去看下corrplor包的文檔,作者寫的算是最詳細(xì)的挨队。
### R中輸入?corrplot看下corrplot中的參數(shù)
corrplot(corr, method = c("circle", "square", "ellipse", "number", "shade",
"color", "pie"), type = c("full", "lower", "upper"), add = FALSE,
col = NULL, bg = "white", title = "", is.corr = TRUE, diag = TRUE,
outline = FALSE, mar = c(0, 0, 0, 0), addgrid.col = NULL,
addCoef.col = NULL, addCoefasPercent = FALSE, order = c("original",
"AOE", "FPC", "hclust", "alphabet"), hclust.method = c("complete", "ward",
"ward.D", "ward.D2", "single", "average", "mcquitty", "median", "centroid"),
addrect = NULL, rect.col = "black", rect.lwd = 2, tl.pos = NULL,
tl.cex = 1, tl.col = "red", tl.offset = 0.4, tl.srt = 90,
cl.pos = NULL, cl.lim = NULL, cl.length = NULL, cl.cex = 0.8,
cl.ratio = 0.15, cl.align.text = "c", cl.offset = 0.5, number.cex = 1,
number.font = 2, number.digits = NULL, addshade = c("negative",
"positive", "all"), shade.lwd = 1, shade.col = "white", p.mat = NULL,
sig.level = 0.05, insig = c("pch", "p-value", "blank", "n", "label_sig"),
pch = 4, pch.col = "black", pch.cex = 3, plotCI = c("n", "square",
"circle", "rect"), lowCI.mat = NULL, uppCI.mat = NULL, na.label = "?",
na.label.col = "black", win.asp = 1, ...)
可以看到包內(nèi)參數(shù)特別之多谷暮,但是都很容易理解,我們簡(jiǎn)單使用一下吧~
method 參數(shù)
支持七種作圖效果盛垦,分別是 "circle" (默認(rèn)), "square", "ellipse", "number", "pie", "shade" and "color".
type參數(shù)控制只輸出上三角或者下三角
# 隨便用一種
corrplot(cormat,method = 'pie',type = "upper")
# 也可以混合搭配湿弦,上下三角各用一種效果
corrplot.mixed(cormat, lower = "ellipse", upper = "circle")
重排序矩陣進(jìn)行可視化
內(nèi)置了四種排序算法:AOE, FPC,hclust,alphabet
# 我們使用最常見的hclust層級(jí)聚類方法
corrplot(cormat, order = "hclust",method = 'pie')
自定義顏色
addrect = 2 根據(jù)層次聚類在圖上繪制的矩形的數(shù)量,僅在排序方法為hclust時(shí)有效腾夯。如果為空(默認(rèn)值)颊埃,則不添加任何矩形。
col1 <- colorRampPalette(c("#7F0000", "red", "#FF7F00", "yellow", "white",
"cyan", "#007FFF", "blue", "#00007F"))
# 這里再推薦幾種配色
# col = heat.colors(100)
# col = terrain.colors(100)
# col = cm.colors(100)
# col = brewer.pal(n = 8, name = "PuOr") 利用RColorBrewer包調(diào)色
corrplot(cormat, , order = "hclust", addrect = 2, col = col1(100)) # COL1(100)代表漸變色階劃分為100份俯在。
計(jì)算p值相關(guān)矩陣并可視化
利用cor.mtest函數(shù)基于原始數(shù)據(jù)計(jì)算相關(guān)性竟秫,并執(zhí)行顯著性檢驗(yàn)娃惯。
res1 <- cor.mtest(mtcars, conf.level = .95) # 計(jì)算相關(guān)顯著性P值矩陣
corrplot(cormat, p.mat = res1$p, sig.level = .05) # 設(shè)置顯著性閾值為0.05
除此之外:
設(shè)置insig = "p-value" 可將不顯著的系數(shù)顯示出數(shù)值
corrplot(cormat, p.mat = res1$p, insig = "p-value") # 增加sig.level = -1可顯示全部系數(shù)的P值
設(shè)置insig = "blank" 可將不顯著的設(shè)置為空白
corrplot(cormat, p.mat = res1$p, insig = "blank")
設(shè)置insig = "label_sig" 可將P值以 * 號(hào)方式展示出來(lái), 通過(guò)設(shè)置sig.level = c(.001, .01, .05) 可以將不同范圍內(nèi)的p值用 * 來(lái)表示 ,如p值小于0.001的系數(shù)設(shè)置為三個(gè) * 跷乐。
corrplot(cormat, p.mat = res1$p, insig = "label_sig",
sig.level = c(.001, .01, .05), pch.cex = .9, pch.col = "white")
我們還可以自定義顯著的系數(shù)標(biāo)簽
corrplot(cormat, p.mat = res1$p, insig = "label_sig", pch.col = "grey",
pch = "顯著", pch.cex = .7, order = "AOE")
OK, 基本使用如上所述,更多參數(shù)自己摸索吧~~
方式三:熱圖包
熱圖包有很多種趾浅,有空會(huì)專門介紹一下R中流行的幾個(gè)熱圖包(網(wǎng)上其實(shí)也有很多教程了)愕提,這里就簡(jiǎn)單拿倆個(gè)常用的舉個(gè)例子吧~~
pheatmap包
library(RColorBrewer)
coul <- colorRampPalette(brewer.pal(8, "PiYG"))(25)
pheatmap(cormat,cellwidth = NA, cellheight =NA, treeheight_row = 50,
treeheight_col = 50 ,color =coul,legend=TRUE,
border_color=NA, fontsize_row=8, fontsize_col=10,
,main="Pheatmap")
gplot包中的heatmap.2函數(shù)
library(gplots)
library(RColorBrewer)
coul <- colorRampPalette(brewer.pal(8, "PiYG"))(25)#換個(gè)好看的顏色
heatmap.2(cormat,
trace="none",#不顯示trace
col=coul,#修改熱圖顏色
density.info = "none",#圖例取消density
key.xlab ='Correlation',
key.title = "",
cexRow = 1,cexCol = 1,#修改橫縱坐標(biāo)字體
Rowv = F,Colv = F, #去除聚類
margins = c(6, 6),
cellnote = cormat,notecol='black'#添加相關(guān)系數(shù)的值及修改字體顏色
)
方式四:GGally包
“GGally”是“ggplot2”包的一個(gè)擴(kuò)展,它內(nèi)部添加了幾個(gè)函數(shù)來(lái)降低幾何對(duì)象與轉(zhuǎn)換后的數(shù)據(jù)組合的復(fù)雜性皿哨。其中包括相關(guān)性圖浅侨、平行坐標(biāo)繪圖,繪制網(wǎng)絡(luò)等等的函數(shù)证膨,我們這次只介紹下其中的ggcorr函數(shù)來(lái)繪制相關(guān)性圖如输,因?yàn)槭莋gplot2的擴(kuò)展,所以它支持代碼中添加我們熟悉的ggplot語(yǔ)法去設(shè)置主題央勒,圖例不见,顏色等等。
參數(shù)
R中輸入?ggcorr查看參數(shù)使用, 也可看該包的Documentation或者Github進(jìn)行學(xué)習(xí)崔步。
?ggcorr
ggcorr(data, method = c("pairwise", "pearson"), cor_matrix = NULL,
nbreaks = NULL, digits = 2, name = "", low = "#3B9AB2",
mid = "#EEEEEE", high = "#F21A00", midpoint = 0, palette = NULL,
geom = "tile", min_size = 2, max_size = 6, label = FALSE,
label_alpha = FALSE, label_color = "black", label_round = 1,
label_size = 4, limits = c(-1, 1), drop = is.null(limits) ||
identical(limits, FALSE), layout.exp = 0, legend.position = "right",
legend.size = 9, ...) # 參數(shù)也不少,下面只會(huì)提及幾個(gè)重要的參數(shù)稳吮。
簡(jiǎn)單使用
# Cran
install.packages('GGally')
# Github
library(devtools)
install_github("ggobi/ggally")
library(GGally)
#簡(jiǎn)單出圖
ggcorr(cormat)
自定義顏色
通過(guò)設(shè)置low,mid井濒,high可以設(shè)置為三色漸變灶似。
# 圖形種類列林、字體大小、顏色等設(shè)置
ggcorr(cormat, ,geom = 'circle',size = 5,
low = 'green', mid = 'white', high = 'gold',
min_size = 5, max_size = 15,label = TRUE,
label_alpha = TRUE)
另外酪惭,通過(guò)nbreaks參數(shù)希痴,我們可以將顏色劃分為多個(gè)范圍值。
library(RColorBrewer) # 提供調(diào)色板
ggcorr(
cormat,
geom = 'circle', # 設(shè)置圖形的展示樣式效果春感,還有"blank","text","tile"三種效果润梯,可以自己試一下
max_size = 15, # 控制最大值
min_size = 5, # 控制最小值
size = 3,
hjust = 0.75,
nbreaks = 6, # 劃分為色階范圍。n為整數(shù)
digits = 2, # 控制小數(shù)位數(shù)
palette = 'Set3', # 如果nbreak參數(shù)使用甥厦,我們
label = TRUE, # 顯示標(biāo)簽
legend.position = "bottom", legend.size = 12)
顯示值高的系數(shù)
參考了這個(gè)帖子纺铭,了解到我們輸入ggcorr(cormat)$data
其實(shí)可以查看內(nèi)部相關(guān)性數(shù)據(jù)格式,有時(shí)候我們不太關(guān)注低相關(guān)性的系數(shù)刀疙,因此我們可以根據(jù)coefficient相關(guān)系數(shù)的那一列數(shù)據(jù)在相關(guān)性圖中只顯示出絕對(duì)值大于多少的系數(shù)舶赔,并用顏色區(qū)分是正相關(guān)還是負(fù)相關(guān)。
head(ggcorr(cormat)$data)
# x y coefficient label
# cyl mpg -0.9910782 -1.0
# disp mpg -0.9892051 -1.0
# hp mpg -0.9542264 -1.0
# drat mpg 0.9365901 0.9
# wt mpg -0.9867463 -1.0
ggcorr(cormat, geom = "blank",
label = TRUE, hjust = 0.75) +
geom_point(size = 10, aes(color = coefficient > 0,
alpha = abs(coefficient) > 0.7)) +
scale_alpha_manual(values = c("TRUE" = 0.5, "FALSE" = 0)) +
scale_color_manual(name = "Coefficient",labels = c('Negetive','Postive'),values = c("blue","red"))
方式五:ggcorrplot
這個(gè)包的靈感來(lái)自corrplot包, 相比于ggplot2方式該函數(shù)該包對(duì)不太擅長(zhǎng)寫函數(shù)的同學(xué)很友好我們只需要利用包中的參數(shù)就可以實(shí)現(xiàn)重新排序相關(guān)矩陣的方法谦秧,而且能在相關(guān)圖上顯示顯著性水平竟纳。除此之外,該包還包括一個(gè)計(jì)算相關(guān)p值矩陣的函數(shù)疚鲤,總之使用起來(lái)還是十分方便的锥累。
安裝加載包
# 通過(guò)Cran安裝
install.packages("ggcorrplot")
# Github安裝最新版
if(!require(devtools)) install.packages("devtools")
devtools::install_github("kassambara/ggcorrplot")
# 加載
library(ggcorrplot)
可視化
默認(rèn)是方形
# method = "square" (默認(rèn))
ggcorrplot(cormat)
圓圈
ggcorrplot(cormat, method = "circle")
重新排序相關(guān)性矩陣
# Reordering the correlation matrix
# --------------------------------
# 使用hclust層級(jí)聚類
ggcorrplot(cormat, hc.order = TRUE, outline.col = "white") # 使用order參數(shù)
只輸出上三角或者下三角矩陣的圖形
# 得到上三角
ggcorrplot(cormat, hc.order = TRUE, type = "upper",
outline.col = "white")
# 得到下三角
ggcorrplot(cormat, hc.order = TRUE, type = "lower",
outline.col = "white")
<img src="https://gitee.com/kai_kai_he/PicGo/raw/master/imgage/image-20201005222129696.png" alt="image-20201005222129696" style="zoom:50%;" />
自定義主題與顏色
ggcorrplot(cormat, hc.order = TRUE, type = "lower",
outline.col = "white",
ggtheme = ggplot2::theme_gray,
colors = c("#6D9EC1", "white", "#E46726"))
顯示標(biāo)簽
ggcorrplot(cormat, hc.order = TRUE,
type = "lower", p.mat = p.mat)
計(jì)算P值顯著性矩陣,并在圖中顯示
p.mat <- cor_pmat(mtcars)
head(p.mat[, 1:4])
## mpg cyl disp hp
## mpg 0.000000e+00 6.112687e-10 9.380327e-10 1.787835e-07
## cyl 6.112687e-10 0.000000e+00 1.803002e-12 3.477861e-09
## disp 9.380327e-10 1.803002e-12 0.000000e+00 7.142679e-08
## hp 1.787835e-07 3.477861e-09 7.142679e-08 0.000000e+00
## drat 1.776240e-05 8.244636e-06 5.282022e-06 9.988772e-03
## wt 1.293959e-10 1.217567e-07 1.222311e-11 4.145827e-05
ggcorrplot(cormat, hc.order = TRUE,
type = "lower", p.mat = p.mat) # 除非沒有顯著系數(shù)
除了將不顯著的相關(guān)系數(shù)標(biāo)記為×號(hào)集歇,也可以直接將其留白去除顏色桶略。
# 不顯著的系數(shù)留白
ggcorrplot(cormat, p.mat = p.mat, hc.order = TRUE,
type = "lower", insig = "blank")