R 數(shù)據(jù)可視化 —— 相關(guān)系數(shù)圖

一、ggplot 相關(guān)系數(shù)圖

前言

相關(guān)系數(shù)圖是對(duì)相關(guān)系數(shù)矩陣進(jìn)行可視化的趟庄,用于展示多組變量之間的相關(guān)性。

根據(jù)數(shù)據(jù)的分布特征坛猪,可以應(yīng)用不同的相關(guān)系數(shù)計(jì)算方法沸柔,如 pearson倾哺、spearman璃搜、Kendall

相關(guān)系數(shù)矩陣的可視化圖形铸史,可以是熱圖庐橙、氣泡圖假勿、方塊圖、橢圓圖态鳖,也可以是純數(shù)字文本形式转培,等等。

下面我們介紹它們的繪制方法

示例

我們首先使用 ggplot2 包提供的函數(shù)來繪制這些圖形

先計(jì)算相關(guān)系數(shù)矩陣

mat <- as.data.frame(round(cor(mtcars), 2))
mat$var1 <- rownames(mat)
data <- gather(mat, key = "var2", value = "corr", -var1)

1. 熱圖

library(RColorBrewer)
# 獲取 5 個(gè)顏色
my_color <- brewer.pal(5, "Spectral")

ggplot(data, aes(var1, var2, fill = corr)) +
  geom_tile(colour = "black") +
  scale_fill_gradientn(colours = my_color)

2. 氣泡圖

ggplot(data, aes(var1, var2, fill = corr)) +
  geom_point(aes(size = abs(corr)), shape = 21, colour = "black") +
  scale_fill_gradientn(colours = my_color) +
  scale_size_area(max_size = 15, guide = FALSE)

3. 方塊圖

只要設(shè)置參數(shù) shape = 22浆竭,就可以換成方塊了

geom_point(aes(size = abs(corr)), shape = 22, colour = "black") 

4. 設(shè)置標(biāo)簽

使用 geom_text 添加標(biāo)簽

geom_text(aes(label = corr), size = 3, colour = "black", alpha = 0.7)

為正負(fù)相關(guān)設(shè)置不同的顏色

geom_point(aes(fill = corr > 0, size = corr), shape = 21)

5. 混合繪圖

如果想繪制上三角或下三角該怎么做浸须?

ggplot2 并沒有提供相應(yīng)的操作,但是我們可以手動(dòng)對(duì)數(shù)據(jù)進(jìn)行處理邦泄,將對(duì)應(yīng)的數(shù)據(jù)賦值為 NA

比如删窒,我想繪制下三角。首先顺囊,把上三角賦值為 NA

mat <- as.data.frame(round(cor(mtcars), 2))

for (i in 1:10) {
  for (j in (i+1):11) {
    mat[i,j] <- NA
  }
}

然后將變量名的順序固定為行名順序

mat$var1 <- rownames(mat)
data <- gather(mat, key = "var2", value = "corr", -var1) %>%
  mutate(var1 = factor(var1, levels = rownames(mat)),
         var2 = factor(var2, levels = rownames(mat)))

然后繪制圖形

my_color <- brewer.pal(5, "Spectral")

ggplot(data, aes(var1, var2)) +
  geom_point(aes(fill = corr, size = corr), shape = 21) +
  geom_text(aes(label = corr), size = 3, colour = "white") +
  scale_fill_gradientn(colours = my_color) +
  scale_size_area(max_size = 15, guide = FALSE) +
  theme(legend.position = "none")

如果想將文本和形狀分別繪制在上三角和下三角肌索,操作也是類似的,只是要多添加一個(gè)上三角矩陣特碳。

mat1 <- as.data.frame(round(cor(mtcars), 2))

for (i in 1:10) {
  for (j in (i+1):11) {
    mat1[i,j] <- NA
  }
}

mat2 <- as.data.frame(round(cor(mtcars), 2))

for (i in 1:11) {
  for (j in 1:i) {
    mat2[i,j] <- NA
  }
}


mat1$var1 <- rownames(mat1)
data1 <- gather(mat1, key = "var2", value = "corr", -var1) %>%
  mutate(var1 = factor(var1, levels = rownames(mat1)),
         var2 = factor(var2, levels = rownames(mat1)))

mat2$var1 <- rownames(mat2)
data2 <- gather(mat2, key = "var2", value = "corr", -var1) %>%
  mutate(var1 = factor(var1, levels = rownames(mat2)),
         var2 = factor(var2, levels = rownames(mat2)))

my_color <- brewer.pal(5, "Spectral")

ggplot(data1, aes(var1, var2)) +
  geom_point(aes(fill = corr, size = corr), shape = 21) +
  geom_text(data = data2, aes(label = corr, colour = corr), size = 5) +
  scale_fill_gradientn(colours = my_color) +
  scale_colour_gradientn(colours = my_color) +
  scale_size_area(max_size = 15, guide = FALSE) +
  theme(legend.position = "none")

如果要將對(duì)角線換成變量名诚亚,也很簡(jiǎn)單

mat1 <- as.data.frame(round(cor(mtcars), 2))

for (i in 1:11) {
  for (j in i:11) {
    mat1[i,j] <- NA
  }
}

mat2 <- as.data.frame(round(cor(mtcars), 2))

for (i in 1:11) {
  for (j in 1:i) {
    mat2[i,j] <- NA
  }
}

var_name <- data1 %>% 
  filter(var1 == var2)

mat1$var1 <- rownames(mat1)
data1 <- gather(mat1, key = "var2", value = "corr", -var1) %>%
  mutate(var1 = factor(var1, levels = rownames(mat1)),
         var2 = factor(var2, levels = rownames(mat1)))

mat2$var1 <- rownames(mat2)
data2 <- gather(mat2, key = "var2", value = "corr", -var1) %>%
  mutate(var1 = factor(var1, levels = rownames(mat2)),
         var2 = factor(var2, levels = rownames(mat2)))

my_color <- brewer.pal(5, "Spectral")

ggplot(data1, aes(var1, var2)) +
  geom_point(aes(fill = corr, size = corr), shape = 21) +
  #geom_point(data = data2, aes(fill = corr, size = corr), shape = 23) +
  geom_text(data = data2, aes(label = corr, colour = corr), size = 5) +
  geom_text(data = var_name, aes(label = var1), size = 5) +
  scale_fill_gradientn(colours = my_color) +
  scale_colour_gradientn(colours = my_color) +
  scale_size_area(max_size = 15, guide = FALSE) +
  scale_x_discrete(position = 't') +
  theme(
    legend.position = "none",
    axis.title = element_blank()
    )

方塊配圓形

geom_point(data = data2, aes(fill = corr, size = corr), shape = 22) +
# geom_text(data = data2, aes(label = corr, colour = corr), size = 5) +

熱圖配圓形

ggplot(data1, aes(var1, var2)) +
  geom_tile(data = data2, aes(fill = corr), na.rm = TRUE) +
  geom_text(data = data2, aes(label = corr), colour = "black", size = 5) +
  geom_point(aes(fill = corr, size = corr), shape = 21) +
  geom_text(data = var_name, aes(label = var1), size = 5) +
  scale_fill_gradientn(colours = my_color, na.value = "white") +
  scale_colour_gradientn(colours = my_color) +
  scale_size_area(max_size = 15, guide = FALSE) +
  scale_x_discrete(position = 't') +
  theme(
    panel.background = element_blank(),
    legend.position = "none",
    axis.title = element_blank()
    )

注意晕换,需要將 geom_tile 放在最前面,同時(shí)設(shè)置 na.value 參數(shù)的值

代碼:https://github.com/dxsbiocc/learn/blob/main/R/plot/corr_plot.R

總結(jié)一下站宗,其實(shí)用 ggplot2 做個(gè)性化繪圖沒那么難闸准,重要的是理解其中的原理。

二梢灭、corrplot 相關(guān)系數(shù)圖

前言

前面恕汇,我們介紹了如何使用 ggplot2 來繪制相關(guān)系數(shù)圖,這節(jié)或辖,我們將介紹用 corrplot 包繪制相關(guān)系數(shù)圖

corrplot 主要用于圖形化展示相關(guān)系數(shù)矩陣、置信區(qū)間枣接,同時(shí)還包含一些矩陣排序算法颂暇。同時(shí)能夠以簡(jiǎn)單的方式,選擇顏色但惶、文本標(biāo)簽和布局等

安裝導(dǎo)入

if (!require(corrplot)) {
  install.packages("corrplot")
}

library(corrplot)

可視化方法

corrplot 包含 7 種可視化方法耳鸯,可使用 method 參數(shù)來進(jìn)行選擇,參數(shù)值如下

  1. circle:圓形
mat <- cor(mtcars)

corrplot(mat, method = "circle")
  1. square:方形
corrplot(mat, method = "square")
  1. ellipse:橢圓
corrplot(mat, method = "ellipse")
  1. number:數(shù)值
corrplot(mat, method = "number")
  1. shade:陰影
corrplot(mat, method = "shade")
  1. color:熱圖
corrplot(mat, method = "color")
  1. pie:餅圖
corrplot(mat, method = "pie")

默認(rèn)情況下膀曾,使用紅藍(lán)兩種顏色县爬,正相關(guān)顯示為藍(lán)色,負(fù)相關(guān)為紅色添谊,顏色的強(qiáng)度和圖形的大小與相關(guān)性成正比

布局方式

corrplot 有三種布局方式财喳,通過 type 參數(shù)設(shè)置

  1. full: 默認(rèn)值,繪制整個(gè)相關(guān)系數(shù)矩陣
  2. upper: 繪制上三角矩陣
  3. lower: 繪制下三角矩陣

例如斩狱,上三角

corrplot(mat, method = "circle", type = "upper")

下三角

corrplot(mat, method = "circle", type = "lower")

那如何將不同圖形混合繪制呢耳高?

corrplot 提供了一個(gè)封裝函數(shù) corrplot.mixed,用于繪制混合圖形

該函數(shù)通過 lower, upper 兩個(gè)參數(shù)指定上下三角的類型所踊,例如

corrplot.mixed(mat)

默認(rèn)繪制上三角為圓形下三角為數(shù)字的圖形

設(shè)置對(duì)角線標(biāo)簽放置的位置 tl.pos 和對(duì)角線圖像類型 diag

tl.pos 可以是 lt泌枪、dn秕岛,分別表示放在左側(cè)碌燕、對(duì)角線或不顯示

diag 可以是 ul继薛、n 分別表示與上修壕、下三角一致或不繪制

corrplot.mixed(mat, tl.pos = "lt", diag = 'l')

設(shè)置顏色,其中 tl.col 為對(duì)角線標(biāo)簽顏色遏考,lower.colupper.col 分別表示上叠殷、下三角的顏色

library(RColorBrewer)

corrplot.mixed(mat, lower = "ellipse", upper = "circle", tl.col = "black",
               lower.col = brewer.pal(5, "Spectral"), 
               upper.col = brewer.pal(5, "Set2"))

矩陣重排

我們可以根據(jù)相關(guān)系數(shù)對(duì)矩陣進(jìn)行重排,從矩陣中找到隱藏的結(jié)構(gòu)和模式诈皿。

corrplot4 種排序方法林束,通過 order 參數(shù)設(shè)置:

  • AOE:特征向量的角度順序
  • FPC:第一主成分順序
  • hclust:層次聚類的順序像棘,可以使用 hclust.method 參數(shù)設(shè)置距離度量方法
  • alphabet:字母表順序
corrplot(mat, order = "AOE")
corrplot(mat, order = "hclust")

對(duì)于 hclust 方式,可以為聚類結(jié)果繪制矩形壶冒,使用 addrect 參數(shù)來指定需要繪制矩形的數(shù)量

corrplot(mat, order = "hclust", hclust.method = "median", addrect = 3)

根據(jù)聚類結(jié)果缕题,將顏色設(shè)置為 3 種,同時(shí)更改背景色

corrplot(mat, order = "hclust", hclust.method = "median", addrect = 3,
         col = brewer.pal(3, "Set1"), bg = brewer.pal(7, "Set2")[7])

設(shè)置文本標(biāo)簽及圖例

cl.* 參數(shù)是設(shè)置顏色圖例的參數(shù)胖腾,tl.* 是設(shè)置文本圖例的參數(shù)

例如烟零,tl.coltl.srt 用來設(shè)置文本標(biāo)簽的顏色和旋轉(zhuǎn)

corrplot(mat, order = "FPC", cl.pos = "b", tl.srt = 45)
corrplot(mat, order = "FPC", cl.ratio = 0.2, cl.align = "l")
corrplot(mat, order = "hclust", type = "lower", 
         tl.pos = 'd', tl.cex = 1.25, tl.srt = 45, tl.col = "black")

缺失值處理

默認(rèn)情況下,corrplot 會(huì)將 NA 值渲染為 ? 可以使用 na.label 參數(shù)設(shè)置 NA 值的顯示

mat2 <- mat
diag(mat2) <- NA

corrplot(mat2)
corrplot(mat2, na.label = "*")

plotmath 表達(dá)式

可以在文本標(biāo)簽前面加上 :咸作、=锨阿、$ 字符前綴,來激活 plotmath 表達(dá)式渲染

mat2 <- mat[1:5,1:5]
colnames(mat2) <- c("alpha", "beta", ":alpha+beta", ":a[0]", "=a[beta]")
rownames(mat2) <- c("alpha", "beta", NA, "$a[0]", "$ a[beta]")

corrplot(mat2)

添加顯著性檢驗(yàn)

我們還可以在圖像中添加顯著性信息记罚。首先墅诡,使用 cor.mtest 計(jì)算顯著性 p 值和置信區(qū)間

> pmat <- cor.mtest(mtcars, conf.level = .95)
> str(pmat)
List of 3
 $ p    : num [1:11, 1:11] 0.00 6.11e-10 9.38e-10 1.79e-07 1.78e-05 ...
 $ lowCI: num [1:11, 1:11] 1 -0.926 -0.923 -0.885 0.436 ...
 $ uppCI: num [1:11, 1:11] 1 -0.716 -0.708 -0.586 0.832 ...

然后將計(jì)算結(jié)果中的 p 值傳遞給 p.mat 參數(shù),同時(shí)設(shè)置顯著性水平 sig.level桐智,高于該值的相關(guān)系數(shù)被認(rèn)為是不顯著的

corrplot(mat, p.mat = pmat$p, sig.level = 0.05)

可以看到末早,不顯著的相關(guān)系數(shù)被畫 了,我們可以設(shè)置 insig = "blank" 不顯示不顯著的點(diǎn)

corrplot(mat, p.mat = pmat$p, sig.level = 0.05,
         insig = "blank")

insig 參數(shù)還支持其他值

  • pch: 默認(rèn)值

  • p-value: 顯示 p 值

  • n: 不做任何操作

  • label_sig: 用 * 來表示顯著性

搭配 sig.level 使用说庭,按照等級(jí)繪制多個(gè) *

corrplot(mat, p.mat = pmat$p, sig.level = c(.001, .01, .05),
         insig = "label_sig", pch.cex = 0.9, pch.col = "white")

pch 參數(shù)可以設(shè)置顯著的點(diǎn)的顯示文本

corrplot(mat, p.mat = pmat$p, sig.level = 0.05, pch = "p < 0.05",
         insig = "label_sig", pch.cex = 0.7, pch.col = "white")

顯示置信區(qū)間

根據(jù)上一步計(jì)算出的置信上下限然磷,我們可以展示變量之間的置信區(qū)間

使用 lowCI.matuppCI.mat 來設(shè)置置信區(qū)間的上下限,使用 plotCI 參數(shù)來設(shè)置顯示的圖形刊驴,支持 n(不顯示), square, circle, rect 四種類型

corrplot(mat, lowCI.mat = pmat$lowCI, uppCI.mat = pmat$uppCI,
         order = "hclust", plotCI = "rect", cl.pos = "n")

最后姿搜,需要說明的一點(diǎn)是,該包不只是針對(duì)相關(guān)系數(shù)矩陣捆憎,也可以繪制其他類型的矩陣

例如

ran <- round(matrix(runif(225, -100,100), 15))
corrplot(ran, is.corr = FALSE, method = "ellipse", cl.lim = c(-100, 100))

如果行列數(shù)不一致痪欲,可以使用 win.asp 參數(shù)將圖形調(diào)整為正方形

ran <- matrix(rnorm(70), ncol = 7)
corrplot(ran, is.corr = FALSE, win.asp = .7, method = "circle")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市攻礼,隨后出現(xiàn)的幾起案子业踢,更是在濱河造成了極大的恐慌,老刑警劉巖礁扮,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件知举,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡太伊,警方通過查閱死者的電腦和手機(jī)雇锡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僚焦,“玉大人锰提,你說我怎么就攤上這事。” “怎么了立肘?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵边坤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谅年,道長(zhǎng)茧痒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任融蹂,我火速辦了婚禮旺订,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘超燃。我一直安慰自己区拳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布意乓。 她就那樣靜靜地躺著樱调,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洽瞬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天业汰,我揣著相機(jī)與錄音伙窃,去河邊找鬼。 笑死样漆,一個(gè)胖子當(dāng)著我的面吹牛为障,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播放祟,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼鳍怨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了跪妥?” 一聲冷哼從身側(cè)響起鞋喇,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眉撵,沒想到半個(gè)月后侦香,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纽疟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年罐韩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片污朽。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡散吵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矾睦,我是刑警寧澤晦款,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站顷锰,受9級(jí)特大地震影響柬赐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜官紫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一肛宋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧束世,春花似錦酝陈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贫堰,卻和暖如春穆壕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背其屏。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工喇勋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人偎行。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓川背,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛤袒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子熄云,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容