数据可视化——R语言ggplot2包绘制相关矩阵为热图
概述:R语言软件和数据可视化——ggplot2快速绘制相关矩阵为热图。
内容包括使用ggplot2包快速绘制相关矩阵为热图;由于相关矩阵是对称的,完全显示可能会造成数据冗余,提供了辅助函数将相关矩阵的下三角或上三角元素赋值为NA去除冗余的数据;另外也提供了采用分层聚类的辅助函数将相关矩阵重新排序以发掘相关矩阵中的隐藏信息;最后,还可以将相关矩阵中的系数显示在图形中。
目录
- 数据准备
- 计算相关矩阵
- 使用ggplot2创建相关矩阵的热图
- 获取相关矩阵的下三角和上三角
- 绘制相关矩阵的上三角元素为热图
- 对相关矩阵重新排序
- 在热图上添加相关系数
本R教程描述了如何使用R软件和ggplot2包可视化相关矩阵。
1. 数据准备
以下示例中mtcars的数据被使用。
mydata <- mtcars[, c(1,3,4,5,6,7)]
head(mydata)
输出结果如下:
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
2. 计算相关矩阵
可以使用R语言中的cor()函数创建相关矩阵:
cormat <- round(cor(mydata),2)
head(cormat)
输出结果如下:
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
3. 使用ggplot2创建相关矩阵的热图
使用reshape2包中的melt()函数将数据“融合”:
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
5 wt mpg -0.87
6 qsec mpg 0.42
ggplot2包中的geom_tile()函数可用于可视化相关矩阵:
library(ggplot2)
ggplot(data = melted_cormat, aes(x=Var1, y=Var2, fill=value)) +
geom_tile()
输出结果:
默认的绘图很不美观,将在下一节中看到如何更改热图的外观。
请注意,如果您有大量数据,则最好使用geom_raster()函数,运行更快。
4. 获取相关矩阵的下三角和上三角
注意,相关矩阵具有冗余信息。可使用下面的函数将其中的一半设置为NA。
# 获得相关矩阵的下三角元素
# Get lower triangle of the correlation matrix
get_lower_tri<-function(cormat){
cormat[upper.tri(cormat)] <- NA
return(cormat)
}
# 获得相关矩阵的上三角元素
# Get upper triangle of the correlation matrix
get_upper_tri <- function(cormat){
cormat[lower.tri(cormat)]<- NA
return(cormat)
}
使用方法:
# 获取相关矩阵cormat的上三角元素
upper_tri <- get_upper_tri(cormat)
upper_tri
输出结果:
mpg disp hp drat wt qsec
mpg 1 -0.85 -0.78 0.68 -0.87 0.42
disp NA 1.00 0.79 -0.71 0.89 -0.43
hp NA NA 1.00 -0.45 0.66 -0.71
drat NA NA NA 1.00 -0.71 0.09
wt NA NA NA NA 1.00 -0.17
qsec NA NA NA NA NA 1.00
5. 绘制相关矩阵的上三角元素为热图
融合相关数据并删除具有NA值的行:
# Melt the correlation matrix
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 = "blue", high = "red", 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()
输出结果:
上图中:
负值显示为为蓝色,正值显示为红色。
scale_fill_gradient2与参数limit = c(-1,1)一起使用,限制显示的相关系数范围从-1到1。
coord_fixed()的功能可确保x轴上的一个单位与y轴上的一个单位的长度相同。
6. 对相关矩阵重新排序
本节介绍如何根据相关系数对相关矩阵进行重新排序。这对于识别矩阵中的隐藏模式很有用。下面的示例中使用了分层聚类的hclust()函数对相关矩阵进行重新排序。
对相关矩阵重新排序的辅助函数:
reorder_cormat <- function(cormat){
# Use correlation between variables as distance
dd <- as.dist((1-cormat)/2)
hc <- hclust(dd)
cormat <-cormat[hc$order, hc$order]
}
重新排序的相关数据可视化:
# Reorder the correlation matrix
cormat <- reorder_cormat(cormat)
upper_tri <- get_upper_tri(cormat)
# Melt the correlation matrix
melted_cormat <- melt(upper_tri, na.rm = TRUE)
# Create a ggheatmap
ggheatmap <- ggplot(melted_cormat, aes(Var2, Var1, fill = value))+
geom_tile(color = "white")+
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(-1,1), space = "Lab",
name="Pearson\nCorrelation") +
theme_minimal()+ # minimal theme
theme(axis.text.x = element_text(angle = 45, vjust = 1,
size = 12, hjust = 1))+
coord_fixed()
# Print the heatmap
print(ggheatmap)
输出结果:
7. 在热图上添加相关系数
- 使用geom_text()函数在图表上添加相关系数。
- 使用theme()函数设置为空白主题(删除轴标签,面板网格和背景以及轴刻度)。
- 使用guides()函数更改图例标题的位置。
ggheatmap +
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))
输出结果:
References