You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jupyter与Python脚本中Matplotlib热力图渲染差异及一致性解决

差异原因分析

  1. 对角线显示差异
    核心是matplotlib版本迭代带来的默认参数逻辑变化:
  • 你Jupyter环境用的3.1.3版本,会自动将0-1的值范围完整映射到colormap全区间,所以值为1的对角线会显示为colormap的极值颜色(红色);
  • 终端的3.9.2版本在矩阵包含NaN时,默认会忽略NaN计算颜色范围,或者对colormap边界值的处理更严格,导致原本值为1的单元格没有被正确映射到colormap的红色端,甚至被误识别为NaN显示白色(新版默认NaN显示白色)。
  1. 文件大小差异
    matplotlib 3.4+版本调整了PNG保存的默认压缩等级,新版默认使用更高的压缩比(比如默认从无压缩的0改为中等压缩的6),因此同样300dpi的PNG文件体积大幅缩小。

解决方法

要让终端脚本输出和Jupyter完全一致,需要显式指定关键参数覆盖新版默认值:

1. 修复对角线颜色问题

绘制热力图时,强制锁定颜色映射的极值范围,并明确NaN的显示颜色:

# 以seaborn heatmap为例
import seaborn as sns
import matplotlib.pyplot as plt

# 加载你的矩阵数据data
sns.heatmap(data,
            vmin=0, vmax=1,  # 强制0-1对应colormap全范围
            nan_color='lightgray',  # 自定义NaN颜色,避免和对角线混淆
            cmap='RdBu_r')  # 匹配旧版默认colormap

# 如果使用matplotlib原生imshow
plt.imshow(data, vmin=0, vmax=1, cmap='RdBu_r', interpolation='nearest')

这样就能确保值为1的对角线被稳定映射到colormap的红色端,不受NaN干扰。

2. 匹配文件大小

保存图片时,显式设置PNG压缩等级为旧版默认的无压缩模式:

plt.savefig('heatmap.png', dpi=300, png_compression=0)

png_compression参数范围0-9,0为无压缩,9为最高压缩。设置为0后,文件体积会和Jupyter生成的一致。


额外验证

  • 打印脚本中矩阵的对角线值,用np.array_equal()对比Jupyter中的矩阵,确保数据完全一致;
  • 检查脚本中是否存在mask、alpha等额外绘图参数,避免这些参数意外影响显示效果。

内容的提问来源于stack exchange,提问作者n3lmnTrxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:08:13