R数据可视化-相关矩阵热力图

在数据分析时,我们经常需要看变量之间的相关性,一般采用相关矩阵热力图进行可视化,而ggplot2本身不能直接绘制热图,因此我们需要做数据变换把相关矩阵转换为一个3列的数据框(变量名Var1、变量名Var2、数值value),然后再分别映射给x、y和fill参数,绘制出热力图。

数据准备

这里我用的是ggplot2内置的mtcars数据集:

1
2
df <- mtcars[, c(1,3,4,5,6,7)]
head(df)

这个数据前6行为:

1
2
3
4
5
6
7
                   mpg disp  hp drat    wt  qsec
Mazda RX4 21.0 160 110 3.90 2.620 16.46
Mazda RX4 Wag 21.0 160 110 3.90 2.875 17.02
Datsun 710 22.8 108 93 3.85 2.320 18.61
Hornet 4 Drive 21.4 258 110 3.08 3.215 19.44
Hornet Sportabout 18.7 360 175 3.15 3.440 17.02
Valiant 18.1 225 105 2.76 3.460 20.22

然后计算相关矩阵:

1
round(cor(df), 2)
1
2
3
4
5
6
7
       mpg  disp    hp  drat    wt  qsec
mpg 1.00 -0.85 -0.78 0.68 -0.87 0.42
disp -0.85 1.00 0.79 -0.71 0.89 -0.43
hp -0.78 0.79 1.00 -0.45 0.66 -0.71
drat 0.68 -0.71 -0.45 1.00 -0.71 0.09
wt -0.87 0.89 0.66 -0.71 1.00 -0.17
qsec 0.42 -0.43 -0.71 0.09 -0.17 1.00

然后我用reshape2包中的melt()函数将这个相关矩阵转换为3列的数据框格式:

1
2
df_cor <- round(cor(df), 2)
melt(df_cor)

下面是输出的前6行:

1
2
3
4
5
6
7
  Var1 Var2 value
1 mpg mpg 1.00
2 disp mpg -0.85
3 hp mpg -0.78
4 drat mpg 0.68
5 wt mpg -0.87
6 qsec mpg 0.42

相关矩阵热力图绘制

基本相关矩阵热力图绘制

前面我们已经得到了3列的数据框(变量名Var1、变量名Var2、数值value),现在我们只需要将它们分别映射给x、y和fill参数,就能够绘制出热力图。

1
2
3
4
5
df_cor <- round(cor(df), 2) 
df_cor %>%
melt() %>%
ggplot(aes(x = Var1, y = Var2, fill = value)) +
geom_tile()

默认的绘图样式比较丑,也不太直观。

相关矩阵的下三角绘制热力图

相关矩阵具有冗余信息,因此,我们可以将其中的上三角部分设置为NA:

1
2
df_cor <- round(cor(df), 2)
df_cor[upper.tri(df_cor)] <- NA

下面是df_cor

1
2
3
4
5
6
7
       mpg  disp    hp  drat    wt  qsec
mpg 1.00 NA NA NA NA NA
disp -0.85 1.00 NA NA NA NA
hp -0.78 0.79 1.00 NA NA NA
drat 0.68 -0.71 -0.45 1.00 NA NA
wt -0.87 0.89 0.66 -0.71 1.00 NA
qsec 0.42 -0.43 -0.71 0.09 -0.17 1.00

下面绘制热力图:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 相关矩阵的上三角-左图
df_cor %>%
melt(na.rm = TRUE) %>%
ggplot(aes(x = Var1, y = Var2, fill = value)) +
geom_tile()

# 相关矩阵的上三角+颜色标度+样式美化-右图
df_cor %>%
melt(na.rm = TRUE) %>%
ggplot(aes(x = Var1, y = Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1,1), space = "Lab", name="Pearson\nCorrelation") +
coord_fixed()
  • coord_fixed():使得x轴上的一个单位与y轴上的一个单位的长度相同。

相关矩阵重新排序

我们可以根据相关系数对相关矩阵进行重新排序,这样可以更容易地识别矩阵中的隐藏模式。

下面我们用分层聚类hclust()函数对相关矩阵进行重新排序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
df_cor <- round(cor(df), 2)
# 根据距离重新排序
dd <- as.dist((1 - df_cor)/2)
hc <- hclust(dd)
df_cor <- df_cor[hc$order, hc$order]

# 上三角部分设置为NA
df_cor[upper.tri(df_cor)] <- NA

# 热力图绘制
heatmap_1 <- df_cor %>%
melt(na.rm = TRUE) %>%
ggplot(aes(x = Var1, y = Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1,1), space = "Lab", name="Pearson\nCorrelation") +
coord_fixed()

下面左图是相关矩阵未排序的热力图,右图是相关矩阵排序后的热力图:

热力图上显示相关系数值

我们可以用geom_text()函数在热力图上添加相关系数值,这样更加直观。然后我可以把主题theme()设置为空白主题(删除轴标签、轴刻度、面板网格、背景),最后改变图例位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 热力图上显示相关系数值-左图
heatmap_1 +
geom_text(aes(Var1, Var2, label = value), color = "black", size = 4)

# 热力图上显示相关系数值+主题、图例美化-右图
heatmap_1 +
geom_text(aes(Var1, Var2, 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))

参考


----------- 本文结束啦感谢您阅读 -----------

赞赏一杯咖啡