本节介绍:一种论文中常见的特征间相关系数热力图。图中以 13×13 矩阵展示 Dosage、T-RW、NTU-RW、pH-RW、EC-RW、NH3-N-RW、CODMn-RW、T-TW、NTU-TW、pH-TW、EC-TW、CODMn-TW 和 WTR 等变量之间的相关关系。
本文根据原图结构和用户提供的 Jupyter Notebook 代码,对发散色带、数值标注、Colorbar 设置和批量配色导出流程进行整理说明。当前代码直接整理了原图中的相关系数矩阵,用于复现论文图形结构;正式用于自己的论文时,应从原始数据计算相关矩阵,并结合实验设计、样本量和统计检验谨慎解释。
相关系数热图主要用于展示多个变量之间的两两线性相关关系。每个小方格对应一对变量的相关系数,数值范围通常为 -1 到 1。正值表示正相关,负值表示负相关,绝对值越接近 1,说明线性相关程度越强。
这张图使用发散色带来表达相关方向:蓝色区域表示正相关,红色区域表示负相关,颜色越深表示相关强度越高。单元格中的数字保留了具体相关系数,右侧 Colorbar 则提供颜色与数值之间的对应关系。
与普通相关系数表相比,热图更适合快速识别强相关变量、变量簇和潜在共线性。例如 EC-RW 与 EC-TW 呈现很强正相关,CODMn-RW 与 T-TW 呈现较强负相关。这类图适合放在论文的数据探索、变量关系分析、建模前特征筛查或机理讨论部分。
下面代码使用整理后的相关系数矩阵进行流程演示,主要用于说明图形结构和复刻逻辑。如果迁移到自己的数据中,可以先使用 df.corr() 计算相关矩阵,再替换本文中的 data_matrix。
import matplotlib.pyplot as pltimport pandas as pdimport seaborn as snsimport osimport warningswarnings.filterwarnings("ignore")plt.rcParams["font.family"] = ["Times New Roman", "SimHei", "DejaVu Sans"]plt.rcParams["mathtext.fontset"] = "stix"plt.rcParams["axes.unicode_minus"] = Falseplt.rcParams["savefig.bbox"] = "tight"plt.rcParams["savefig.dpi"] = 600
这部分用于统一全局绘图风格,包括字体、公式显示、负号显示和保存分辨率。相关性热图中的变量名通常较长,字体和刻度布局会直接影响图形可读性。
plot_config = { "figsize": (12, 10), "annot_font_size": 11, "tick_label_size": 15, "cbar_tick_size": 13, "tick_label_weight": "bold", "annot_weight": "bold", "cbar_shrink": 0.98,}
这里将画布尺寸、单元格数字字号、坐标轴标签字号、Colorbar 字号和收缩比例集中管理。后续如果要适配不同期刊版面,只需要微调这一组参数即可。
data_matrix = [ [1, -0.71, 0.45, -0.33, 0.56, 0.87, 0.56, -0.67, -0.23, -0.9, 0.43, 0.011, -0.68], [-0.71, 1, -0.014, -0.23, -0.92, -0.63, -0.94, 1, -0.37, 0.53, -0.86, -0.67, 0.59], [0.45, -0.014, 1, -0.16, -0.24, 0.72, -0.045, 0.04, -0.44, -0.44, -0.38, -0.56, -0.44],]labels = ["Dosage", "T-RW", "NTU-RW", "pH-RW", "EC-RW", r"NH$_3$-N--RW", r"COD$_{Mn}$-RW", "T-TW", "NTU-TW", "pH-TW", "EC-TW", r"COD$_{Mn}$-TW", "WTR"]df = pd.DataFrame(data_matrix, index=labels, columns=labels)
这里展示的是数据组织方式。完整复刻代码中,data_matrix 是一个 13×13 相关系数矩阵,行列名称完全一致。用 DataFrame 包装后,seaborn.heatmap 可以自动识别横纵坐标标签。
fig, ax = plt.subplots(figsize=plot_config["figsize"])sns.heatmap( df, annot=True, fmt="g", cmap="RdBu", vmin=-1, vmax=1, linewidths=0, ax=ax, cbar_kws={"shrink": plot_config["cbar_shrink"]}, annot_kws={ "size": plot_config["annot_font_size"], "weight": plot_config["annot_weight"] })
Notebook 中还提供了多套发散色带的批量导出逻辑,便于比较不同期刊风格下的视觉效果。
scientific_cmaps = ["coolwarm", "vlag", "Spectral", "PiYG", "BrBG"]for cmap_name in scientific_cmaps: fig, ax = plt.subplots(figsize=plot_config["figsize"]) sns.heatmap( df, annot=True, fmt="g", cmap=cmap_name, vmin=-1, vmax=1, linewidths=0, ax=ax, cbar_kws={"shrink": plot_config["cbar_shrink"]}, annot_kws={ "size": plot_config["annot_font_size"], "weight": plot_config["annot_weight"] } ) save_path = os.path.join(save_dir, f"reproduce_heatmap_{cmap_name}.png") plt.savefig(save_path, dpi=600, format="png")
这段代码可以一次输出 5 张不同配色的相关性热图。正式投稿前,可以对比不同色带在打印、屏幕阅读和期刊版式中的表现,再选择最适合的一版。
第一,相关性不等于因果关系。热图只能反映变量之间的线性相关程度,不能直接证明某个指标变化导致另一个指标变化。
第二,相关系数容易受到异常值、样本量和变量分布影响。正式分析前应检查缺失值、异常值和数据单位。
第三,若变量关系具有明显非线性,仅使用 Pearson 相关可能不够,可以根据研究问题补充 Spearman 相关或其他非参数方法。
第四,强相关变量不一定要直接删除。特征筛查时应结合实验意义、采集成本、模型性能和解释需求综合判断。
👇关注公众号【嗡嗡的Python日常】
✅ 支持代码定制|承接各类定制化科研绘图|质量放心
📌 关于源码:本文核心代码为原创定制,默认不免费公开。
✅ 获取源码方式:
1、直接添加号主微信,付费购买完整源码 + 数据
2、全部完整合集158元,后续将会持续更新,决定购买请联系作者,仅分享代码文件及模拟数据,不提供答疑服务,购买后不退不换!!!
👉请直接添加号主微信联系☕️:Wjtaiztt0406