当前位置:首页>python>用Python做科研级画图——相关矩阵热力图

用Python做科研级画图——相关矩阵热力图

  • 2026-10-11 07:48:40
用Python做科研级画图——相关矩阵热力图

大家好,我是你们的小帅学长。

做相关分析时,很多人都会画一张热力图。

但你有没有遇到过这些问题:

颜色一片红蓝,看不出重点

数字密密麻麻,读不清

对角线重复信息,占了一半空间

变量顺序杂乱,结构完全看不出来

于是图变成了,信息很多,但没有结论。

这一篇,我们只做一件事:把相关矩阵热力图,画成“有结构、有重点、可读性强”的论文级图

01.热力图的本质:表达“结构”,不是“数值”

热力图不是用来看每一个数值的,而是用来看“整体关系结构”。

也就是说:哪些变量相关?哪些变量成簇?是否存在模块结构?

这才是重点。

02.第一步:mask

相关矩阵是对称的:

corr(A,B) = corr(B,A)

所以,一半是重复信息。

标准做法:只画上三角 or 下三角

好处:减少信息量、更干净、更论文

03.第二步:排序

默认顺序是“变量输入顺序”,但这通常没有意义。

应该做的是让“相关的变量靠在一起”

方法:按相关性排序

   层次聚类(clustering)

效果:结构会自动“显现出来”

04.第三步:注释

很多人会每个格子都写数值,但结果是图变成“Excel截图”

正确做法:只标注重要值

      限制小数位(2位)

      只标注上三角

05.第四步:颜色

推荐:RdBu_r(经典相关图)

  中心值 = 0

  红:正相关

  蓝:负相关

关键设置:

vmin=-1, vmax=1, center=0

06.论文级热力图模板

好的相关热力图,不是让你看到所有数值,而是让你一眼看到变量之间的结构关系。下面是一段可以直接复用的代码:

import osimport numpy as npimport pandas as pdimport seaborn as snsimport matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib import font_manager as fm# =========================# 字体设置# =========================win_fonts = r"C:\Windows\Fonts"for p in [    os.path.join(win_fonts, "times.ttf"),    os.path.join(win_fonts, "timesbd.ttf"),    os.path.join(win_fonts, "timesi.ttf"),    os.path.join(win_fonts, "simsun.ttc"),]:    if os.path.exists(p):        try:            fm.fontManager.addfont(p)        except Exception:            passmpl.rcParams["font.family"] = ["Times New Roman", "SimSun"]mpl.rcParams["axes.unicode_minus"] = False# =========================# 输出路径# =========================OUT_DIR = r"D:\py_figs"os.makedirs(OUT_DIR, exist_ok=True)# =========================# 构造示例数据# =========================np.random.seed(42)data = pd.DataFrame({    "Var1": np.random.normal(0,1,200),    "Var2": np.random.normal(0,1,200),    "Var3": np.random.normal(0,1,200),    "Var4": np.random.normal(0,1,200),    "Var5": np.random.normal(0,1,200),})data["Var2"] = data["Var1"] * 0.8 + np.random.normal(0,0.2,200)data["Var4"] = data["Var3"] * -0.7 + np.random.normal(0,0.3,200)# =========================# 计算相关矩阵# =========================corr = data.corr()corr = corr.sort_values(by=corr.columns[0], ascending=False)corr = corr.loc[corr.index]mask = np.triu(np.ones_like(corr, dtype=bool))# =========================# 绘图# =========================fig, ax = plt.subplots(figsize=(6,5))sns.heatmap(    corr,    mask=mask,    cmap="RdBu_r",    vmin=-1, vmax=1, center=0,    annot=True,    fmt=".2f",    annot_kws={"size":9},    square=True,    cbar_kws={"shrink":0.8})ax.set_title("Correlation Matrix / 相关矩阵", fontsize=14)# =========================# 保存# =========================out_path = os.path.join(OUT_DIR, "correlation_heatmap.jpg")fig.savefig(out_path, dpi=300, bbox_inches="tight")plt.close()print("Saved:", out_path)

相关矩阵不是“数据表”,而是“结构图”。

07.下一篇预告

这里有一个非常重要的问题:相关 ≠ 因果。很多论文最严重的错误就是用相关性暗示因果关系。所以下一篇我们讲:《避免误导(相关 ≠ 因果:可视化怎么写更严谨)》

我会告诉你,哪些表达是“危险的”?图和文字怎么避免误导?如何让你的结论更严谨?这一篇,会直接提升你的论文水平。

——期待你的关注——

往期内容:

用Python做科研级画图——雨云图

用Python做科研级画图——小提琴图

用Python做科研级画图——残差图

用Python做科研级画图——回归拟合线

用Python做科研级画图——异常值可视化

最新文章

随机文章