如何使用ggplot2绘制一半着色一半显示数值的相关系数矩阵热力图
实现方案
你要的半色半值相关系数热力图可以直接通过单画布多图层叠加实现,不需要拆分两个ggplot对象再合并,完全基于你现有的上下三角拆分逻辑稍作调整即可。
代码修正与优化
首先你原有代码存在一个小问题:reorder 函数中排序后的矩阵变量名写错(写为CorMar但未正确返回),修正后合并图层的完整代码如下:
# 加载依赖包 library(ggplot2) library(reshape2) # 生成测试数据 A <- c(1,4,5,6,1) B <- c(4,2,5,6,7) C <- c(3,4,2,4,6) D <- c(2,5,1,4,6) E <- c(6,7,8,9,1) df <- data.frame(A,B,C,D,E) # 计算相关矩阵 CorMat <- cor(df[ ,c("A","B","C","D","E")]) # 上下三角提取函数 get_upper_tri <- function(CorMat){ CorMat[upper.tri(CorMat)]<- NA return(CorMat) } # diag参数可按需调整,设为TRUE则对角线归为数值区域,设为FALSE则对角线归为色块区域 get_lower_tri <- function(CorMat){ CorMat[lower.tri(CorMat, diag = TRUE)]<- NA return(CorMat) } # 修正后的相关矩阵重排序函数 reorder_cormat <- function(CorMat){ dd <- as.dist((1-CorMat)/2) hc <- hclust(dd) CorMat <- CorMat[hc$order, hc$order] return(CorMat) } # 数据预处理 CorMat <- reorder_cormat(CorMat) upper_tri <- get_upper_tri(CorMat) # 存储下三角+对角线的数值数据 lower_tri <- get_lower_tri(CorMat) # 存储上三角的色块数据 meltNum <- melt(upper_tri, na.rm = TRUE) meltColor <- melt(lower_tri, na.rm = TRUE) # 单画布叠加图层实现目标效果 ggheatmap <- ggplot() + # 先叠加色块层(上三角区域) geom_tile(data = meltColor, aes(x = Var2, y = Var1, fill = value), color = "white") + # 再叠加文本层(下三角+对角线区域) geom_text(data = meltNum, aes(x = Var2, y = Var1, label = round(value, 2)), color = "black", size = 4) + # 通用样式配置 labs(x = NULL, y = NULL) + scale_x_discrete(position = "top") + scale_fill_gradient(low = "white", high = "firebrick4", limit = c(-1,1), name = "Pearson\nCorrelation") + theme( plot.title = element_text(hjust = 0.5, face = "bold"), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank() ) + coord_fixed() print(ggheatmap)
更高效的简化方案
如果不需要过多自定义细节,可直接使用ggcorrplot包的内置参数实现,代码更简洁:
library(ggcorrplot) ggcorrplot(CorMat, type = "upper", lab = TRUE, lab_size = 4, colors = c("white", "firebrick3", "firebrick4"), legend.title = "Pearson\nCorrelation")
内容的提问来源于stack exchange,提问作者Dswede43
相关产品推荐
相关产品推荐

