今天我们来学习数据可视化中非常实用的热图绘制方法。就像准备画画需要先准备好画布和颜料一样,绘制热图的第一步,就是要准备好合适的数据。
在开始之前,我们先来了解一下热图绘制需要什么样的数据:
理想情况下,我们需要一个矩阵形式的数据:
每一行代表一个特征(比如基因、产品等) 每一列代表一个样本或观测值(比如不同实验组、不同时间点等) 每个单元格的数值表示该特征在该样本中的测量值
为了让大家更容易上手,这节课我们会使用R语言中自带的airway数据集作为例子。这是一个经过整理的基因表达数据集,非常适合用来学习热图绘制。
📦 airway数据集:RNA-seq入门必备「练手数据」
🔍 数据集身份卡
🧬 数据内容
dex(处理组 vs 对照组)cell(4种不同细胞系)先装一下包~
BiocManager::install("airway")
# 加载包
library(airway)
library(DESeq2)
library(pheatmap)
# 加载数据
data("airway")
如果这里运行不报错就说明装成功了。
# 创建DESeqDataSet对象
dds <- DESeqDataSet(airway, design =~ cell + dex)
# 过滤低表达基因
keep <- rowSums(counts(dds))>=
dds <- dds[keep,]
# 运行DESeq2分析
dds <- DESeq(dds)
# 获取标准化后的计数数据
vsd <- vst(dds, blind =FALSE)
# 获取数据矩阵
dat <- assay(vsd)
这时候dat的行是基因,列是样本。
接下来开始绘制热图——
可视化样本间的相似性或差异性,快速识别数据中的潜在模式、批次效应或异常样本。 理想状态下同一处理组的样本应彼此距离更近,在热图中聚类在一起。
# 计算样本间的距离矩阵
sampleDists <- dist(t(dat))## 注意这里的转置
# 转换为矩阵
sampleDistMatrix <- as.matrix(sampleDists)
# 绘制热图
pheatmap(sampleDistMatrix,
clustering_distance_rows = sampleDists,
clustering_distance_cols = sampleDists,
main ="Sample distance matrix")
在计算样本间距离时使用 转置(t()) 的操作是为了确保距离计算是针对 样本(列) 而非 基因(行)。这是基因表达数据分析中的关键步骤,具体原因如下:
1. 数据矩阵的默认结构
在表达矩阵(如RNA-seq的计数矩阵)中,通常:
例如,assay(vsd) 返回的矩阵格式为:
m × n(m个基因 × n个样本)。
2. 距离计算的对象
dist() 函数默认对矩阵的 行(rows) 计算距离。**如果直接对 assay(vsd) 计算距离,会得到 基因间的距离(无意义)。t(assay(vsd))),将样本变为行,基因变为列,使 dist() 正确计算样本间距离。3. 转置前后的矩阵对比
假设原始矩阵 assay(vsd) 为:
样本1 样本2 样本3
基因A 10 20 15
基因B 50 30 40
基因C 100 80 90
dist(assay(vsd)) 计算的是基因A、基因B、基因C之间的距离(无意义)。t(assay(vsd)) 变为: 基因A 基因B 基因C
样本1 10 50 100
样本2 20 30 80
样本3 15 40 90
此时 dist(t(assay(vsd))) 计算的是样本1、样本2、样本3之间的距离(这才是我们需要的)。
4. 其他注意事项
vst 或 rlog 转换),避免高表达基因主导距离计算。dist)适用于标准化后的数据;若用相关性距离,需显式计算(如 1 - cor())。代码示例对比
# 错误:计算基因间距离(无意义)
gene_dists <- dist(assay(vsd))
# 正确:计算样本间距离(需转置)
sample_dists <- dist(t(assay(vsd)))
# 相关性距离示例(同样需转置)
cor_dists <- as.dist(- cor(assay(vsd), method="pearson"))# 默认对列计算,无需转置
因此,转置操作的本质是 将数据矩阵从“基因×样本”转换为“样本×基因”,确保距离函数作用于样本而非基因。这是可视化样本聚类(如热图或PCA)前的必要步骤。
基于 差异表达基因(DEGs)的热图 是RNA-seq数据分析中最常用的可视化方法之一,其核心意义在于直观展示基因表达模式在不同样本组间的变化规律,同时揭示潜在的生物学趋势或异常。
# 获取差异表达结果
res <- results(dds)
# 选择显著差异表达的基因(可根据需要调整阈值)
sig_genes <- rownames(res)[which(res$padj <0.05&abs(res$log2FoldChange)>)]
# 如果sig_genes太多,可以只选择前20个
if(length(sig_genes)>){
sig_genes <- rownames(res)[order(res$padj)][:]
}
# 提取这些基因的表达数据
sig_data <- assay(vsd)[sig_genes,]
# 绘制热图
pheatmap(sig_data,
scale ="row",# 按行标准化
show_rownames =TRUE,
cluster_cols =TRUE,
main ="Top differentially expressed genes",
fontsize_row =)
1. 核心意义
(1) 可视化差异表达模式
(2) 揭示样本和基因的聚类关系
(3) 识别潜在亚群或异常样本
2. 热图中关键元素的解读
热图组成部分 | 生物学意义 |
|---|---|
行(Rows) | 差异表达基因(通常按表达模式或统计显著性排序)。 |
列(Columns) | 样本(通常按组别或聚类结果排列)。 |
颜色梯度 | 红色:高表达;蓝色:低表达(需参考图例标度)。 |
聚类树(Dendrogram) | 分支越近,样本或基因的相似性越高(基于表达模式)。 |
3. 应用场景示例
(1) 验证差异分析结果
(2) 功能富集线索
(3) 质量控制
4. 绘制热图的注意事项
(1) 数据标准化
rlog 或 vst 转换数据),避免技术偏差影响颜色梯度。# DESeq2的方差稳定变换
vsd <- vst(dds, blind=FALSE)
(2) 基因选择策略
padj < 0.05 & |log2FC| > 1)。# 提取显著差异基因
res <- results(dds, contrast=c("dex","treated","untreated"))
sig_genes <- subset(res, padj <0.05&abs(log2FoldChange)>)
top_genes<- rownames(sig_genes)[order(sig_genes$padj)][:]
在基于差异表达基因(DEGs)的热图中添加 样本注释(Sample Annotation) 可以显著增强热图的信息量和可解释性。
如何添加样本注释?
注释数据需与热图中的样本顺序一致,且为因子型或字符型变量。
# 创建样本注释数据框
annotation_df<-as.data.frame(colData(vsd)[,c("dex","cell")])
# 绘制带注释的热图
pheatmap(sig_data,# 差异基因的表达矩阵
scale ="row",# 按基因标准化(Z-score)
annotation_col = annotation_df,# 列(样本)注释
show_rownames =TRUE,
cluster_cols =TRUE,
main ="DE genes with sample annotations",
fontsize_row =)
1.关联表达模式与实验变量
2.验证实验设计的合理性
3.识别混杂因素或亚群
现在我们顺利生成了三张热图!虽然它们现在还带着点“新手村”的朴素画风,但别小看这第一步——数据可视化的魔法大门已经为你敞开啦! 🔮