4. 热图简介:数学原理与可视化作用
热图这东西,第一次接触的人往往会把它当成“彩色表格”。这种理解不算错,但太窄了。我在做ADMET预测的时候,经常用手里的数据矩阵直接画热图,一眼就能看出哪些分子结构片段跟毒性、吸收率高度相关。说白了,热图就是把冰冷的数据矩阵“翻译”成眼睛能秒懂的彩色棋盘。
这一节我们不走纯理论,我把数学原理揉碎了讲,外加我踩过的坑和一些实用经验。
4.1 热图到底在干什么?
你可以把热图想象成一张数字矩阵的照片。矩阵里每个格子存了一个数值,热图把数值映射成颜色。值大一个颜色,值小另一个颜色。
举个例子,ADMET预测里我们经常算分子描述符之间的皮尔逊相关系数。一个矩阵可能长这样:
LogP MW HBA HBD TPSA
LogP 1.00 0.65 -0.32 -0.41 -0.58
MW 0.65 1.00 -0.21 -0.35 -0.49
HBA -0.32 -0.21 1.00 0.78 0.88
HBD -0.41 -0.35 0.78 1.00 0.72
TPSA -0.58 -0.49 0.88 0.72 1.00
光看数字你很难快速抓住规律。但把每个数字替换成一个色块,0.88 用深红,-0.58 用深蓝,视觉上立马就能看到两块:HBA/HBD/TPSA 这一组高度正相关(红成一片),它们跟 LogP/MW 则是负相关(蓝色区域)。不需要一行一行扫数字,大脑花不到 0.5 秒就完成模式识别了。
嗯,这就是热图的核心价值——把定量关系变成视觉直觉。
4.2 数学原理:颜色是怎么算出来的?
热图的数学部分其实就三个步骤:
- 原始数据准备——通常是矩阵形式,行和列都有实际意义
- 相似性/相关性计算——这一步决定了最终热图的信息质量
- 颜色映射——把数值通过映射函数转成 RGB 色值
4.2.1 相似度度量:热图的基础
我一开始做热图时,直接把原始数据丢进去,画出来一片乱七八糟。后来才反应过来——你需要先定义“像不像”。ADMET 场景里最常用的是以下三种:
| 度量方法 | 公式(简写) | 适用场景 |
|---|---|---|
| 皮尔逊相关系数 | r = cov(X,Y)/(σXσY) | 评估描述符之间的线性关系强度 |
| 欧几里得距离 | d = √Σ(xi−yi)² | 比较两个分子的整体特征差异 |
| 斯皮尔曼秩相关 | ρ = 1 − (6Σdi²)/n(n²−1) | 数据不满足正态分布时替代皮尔逊 |
我个人的习惯是:先算皮尔逊,画个初版热图;如果发现数据分布比较偏,换成斯皮尔曼重新跑一遍。两者差距越大,说明数据里的非线性特征越明显,这本身就是重要信息。
4.2.2 颜色映射函数
这一步最容易被忽视。但我在项目里吃过亏——有一次用默认的彩虹色映射,结果组里一个色盲同事完全看不出差别。
颜色映射公式本质是一个分段函数:
给定数值范围 [min, max]
归一化:t = (value - min) / (max - min) → t ∈ [0, 1]
颜色映射:RGB = f(t)
f(t) 的具体形式决定了配色方案。常见的包括:
- 顺序映射:从浅到深单一色系,比如浅蓝→深蓝,适合表示单一方向强度
- 发散映射:中间色(白/浅灰)代表零或均值,两端用对比色,比如蓝→白→红,相关性热图最常用
- 定性映射:离散色的切换,适合类别数据
我用 Python 画热图时,最常用的配色是:cmap='RdBu_r'(红蓝发散)。红色代表高正相关,蓝色代表高负相关,白色接近零。你想想看,一眼扫过去,哪块红得发烫,哪块蓝得发紫,马上就知道哪些描述符关系紧密。
4.3 可视化作用:为什么热图比表格管用?
这不是玄学,背后有认知心理学依据。人的视觉系统对颜色块和空间位置极度敏感,但对密集的数字串很迟钝。热图正是利用了这一点。
我把热图在 ADMET 预测里的核心用途归纳成四点:
| 作用 | 解释 |
|---|---|
| 模式发现 | 一眼看出哪些特征区块高度相关,形成“聚类块” |
| 异常检测 | 本应相关的变量却出现冷色块,说明数据或假设有问题 |
| 特征筛选 | 冗余特征成片同色,可以考虑降维或删除 |
| 结果沟通 | 给非技术同事展示时,热图比数字矩阵直观得多 |
我曾经在一个抗肿瘤项目的汇报会上,直接抛出一张描述符相关性热图。客户看了半秒就说:“哦,这部分描述符高度冗余,你们可以考虑删掉一半。”换成表格的话,光解释就要五分钟。
4.4 一张图看懂热图工作流
下面的 SVG 图总结了从原始数据到最终热图的全流程。我每次做热图都会在心里过一遍这个流程,不跳步。这样做出来的图才经得起推敲。
你看,从原始数据到最终热图,核心只有 三个必经环节:计算相似度、做颜色映射、可视化渲染。聚类重排虽然可选,但做了之后热图会更有结构感,我一般都会加上。
4.5 实操避坑:我踩过的三个坑
多年实战下来,我总结了几条铁律:
曾经有一次,我直接拿原始描述符矩阵画热图,没做任何归一化。结果 LogP 的值域是 -2~8,TPSA 是 0~200,颜色完全被 TPSA 主导。画出来的热图里,其他特征几乎全是同一个颜色。后来我在每个特征上做了 z-score 标准化,才看到真正的相关结构。
- 坑一:忘记归一化——不同尺度的特征放在一起,大数值吃掉小数值。解决:算相关系数前先做 z-score 或 min-max 归一化。
- 坑二:忽略缺失值——NaN 会在热图上形成白色空洞,这空洞不是信息而是缺失。解决:用均值填充、中位数填充或者干脆删掉缺失率超过 30% 的特征。
- 坑三:配色选错——彩虹色、热力色容易让大脑产生错觉,以为颜色变化代表有特殊含义。解决:ADMET 场景一律用发散配色(蓝-白-红),这是业界共识。
我个人的最小可行热图配置:seaborn.clustermap(data, method='ward', cmap='RdBu_r', z_score=0)。这一行代码搞定归一化、聚类、发散配色。你先跑一遍,看看大结构,再微调细节。