导师:你去画一些好看的热图(Heatmap)来!用R!

文摘   2024-11-25 09:00   爱尔兰  
前言
最近刚刚开通了付费功能,想试水一下,愿意支持一把的小伙伴,提前感谢了。

主题

众所周知,相关性分析及其热图的可视化,可以说在很多领域都应用颇多,医学,生命科学自不必多说,经济学,农业科学,环境科学等领域的论文也需要使用热图呈现结果,熟练绘制可以说是从硕士生,博士生,到青年教师都需要掌握的技能。因为在数据分析和科研中,相关性热图是一种广泛应用的可视化工具,它能直观展示变量间的关系,帮助我们从复杂数据中发现模式和关键信息。无论是在生物信息学、心理学研究,还是经济金融领域,相关性热图都发挥着重要作用。
但考虑到大多数人可能没有时间系统学习R语言绘制热图的详细步骤,今天我们就提供最详细的可复制代码,来帮助大家理解如何绘制以及对代码进行个性化的设置和优化。
例如:
简单的热图
再例如:复杂的环形热图
今天的更新从简单的热图入手,逐步深入到显著性标记、聚类分析、网格分析以及高端的环形热图展示,全面覆盖了相关性热图的主要类型。同时,为了提升图形的美观性,我们对每种热图进行了”实用“级别的美学优化,确保输出的图形能够用于论文、报告或会议展示。
其间,环形热图的原始数据和代码来自于circlize 包,非常感谢!这是我最喜欢的R社区作者之一的Zuguang Gu在该领域非常权威的工作,想要全面了解环形柱状图的同学,建议去阅读原著:https://github.com/jokergoo/circlize,公众号内容有限,我们仅节选了一部分内容

必备工具

要想执行本文中的教程,需要R,Rstudio, 以及对应的R包,可用以下代码检查是否已安装必须的包。
# 检查并安装所需的R包
required_packages <- c("ggplot2", "ggcorrplot", "reshape2", "pheatmap", "circlize", "ComplexHeatmap",“gridBase”, "RColorBrewer")

for (pkg in required_packages) {
if (!requireNamespace(pkg, quietly = TRUE)) {
install.packages(pkg, dependencies = TRUE)
message(sprintf("已安装缺少的包:%s", pkg))
} else {
message(sprintf("包 %s 已安装", pkg))
}
}
其中,大部分包直接安装即可,单请留意,ComplexHeatmap包需要借助Bioconductor安装,可用以下代码安装:
if (!require("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("ComplexHeatmap")

一、简单相关性热图

应用场景

适合初步探索变量间的关系,快速获取全局相关性结构。

代码实现及美学优化

# 调用 R 自带数据集 mtcars
data <- mtcars
cor_mat <- cor(data)

library(ggplot2)
library(ggcorrplot)

g1 <- ggcorrplot(cor_mat,
hc.order = TRUE,
type = "lower",
lab = TRUE,
lab_size = 3,
colors = c("#6D9EC1", "white", "#E46726"),
legend.title = "相关性") +
theme_minimal() +
theme(
plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
legend.position = "right",
legend.title = element_text(size = 12)
) +
ggtitle("简单相关性热图")

g1

二、显著性标注的相关性热图

应用场景

适合挖掘统计学显著的变量关系,并标注不同显著性水平。

代码实现及美学优化

# 使用模拟数据集
set.seed(123)
data <- as.data.frame(matrix(rnorm(100), ncol = 10))
colnames(data) <- paste0("Var", 1:10)

# 自定义函数:计算 p 值矩阵
cor.mtest <- function(mat, conf.level = 0.95) {
n <- ncol(mat)
p.mat <- matrix(NA, n, n)
diag(p.mat) <- 0
for (i in 1:(n - 1)) {
for (j in (i + 1):n) {
tmp <- cor.test(mat[, i], mat[, j], conf.level = conf.level)
p.mat[i, j] <- p.mat[j, i] <- tmp$p.value
}
}
colnames(p.mat) <- rownames(p.mat) <- colnames(mat)
return(p.mat)
}

# 计算相关矩阵和 p 值矩阵
cor_mat <- cor(data)
p_mat <- cor.mtest(data)

# 将显著性水平转为星号
stars <- ifelse(p_mat < 0.01, "**",
ifelse(p_mat < 0.05, "*", ""))

# 数据整合
library(reshape2)
cor_mat_melt <- melt(cor_mat)
stars_melt <- melt(stars)
names(cor_mat_melt) <- c("Var1", "Var2", "Correlation")
names(stars_melt) <- c("Var1", "Var2", "Stars")
data_combined <- merge(cor_mat_melt, stars_melt, by = c("Var1", "Var2"))

# 绘制热图
g2 <- ggplot(data_combined, aes(Var1, Var2)) +
geom_tile(aes(fill = Correlation), color = "white") +
geom_text(aes(label = paste0(round(Correlation, 2), Stars)),
color = "black", size = 3) +
scale_fill_gradient2(low = "#2166AC", mid = "white", high = "#B2182B",
midpoint = 0, limits = c(-1, 1),
name = "相关性") +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
axis.text.y = element_text(size = 10),
plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
legend.title = element_text(size = 12)
) +
ggtitle("显著性标注的相关性热图")

g2

科研代码
专注R和Python的数据分析。
 最新文章