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

绘制四场野外试验相关矩阵热力图遇NameError错误,求解决方案

解决热力图绘制中的NameError: name 'mask' is not defined问题

错误详情

运行代码时触发如下错误:

NameError
                               
~\AppData\Local\Temp\ipykernel_19684\903953116.py in <module>

      8 corr_Field1 = df_corr_Field1.corr()
     10 sns.heatmap(corr_Field1, annot=True, cmap='coolwarm', ax=axes[0], center=0,mask=mask)
     11 axes[0].set_title('Field1')

NameError: name 'mask' is not defined

核心问题

这个错误的直接原因是:你调用sns.heatmap()时传入了mask=mask参数,但从未定义过mask变量,Python找不到这个变量就会报错。

解决办法

分两种场景处理:

场景1:不需要遮罩效果

直接删除所有sns.heatmap()调用里的mask=mask参数即可,这是最快的解决方式。

场景2:需要遮罩(比如隐藏上三角/下三角)

如果想隐藏热力图的重复区域(如上三角),需要先导入numpy并定义mask变量。比如生成上三角遮罩的代码:

import numpy as np
# 生成与相关矩阵形状匹配的上三角遮罩
mask = np.triu(np.ones_like(corr_Field1, dtype=bool))

如果四个子图用相同遮罩,定义一次即可;若需不同遮罩,可分别为每个子图生成。

顺便修正代码里的其他问题

原代码还有几个拼写错误和子图索引问题,一起修正:

  • 拼写错误:Fiedl1→Field1,df_corr_Fiedl2→df_corr_Field2,df_corr_Field.corr()→df_corr_Field4.corr()
  • 子图索引错误:2行2列的子图,axes是二维数组,应该用axes[0,0]、axes[0,1]、axes[1,0]、axes[1,1]指定子图,避免重复使用axes[2]导致子图覆盖。

修正后的完整代码(无遮罩版本)

import matplotlib.pyplot as plt
import seaborn as sns

# 初始化画布和子图
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(20, 6))

# 提取需要计算相关性的列
df_corr = dt[['Label','CE(µS/cm)', 'pH','HCO3-','Cl-', 'SO4', 'NO3-', 'Na+', 'K+', 'Ca2+', 'Mg2+', 'NH4+', 'TC', 'IC', 'COT']]

# Field1 热力图
df_corr_Field1 = df_corr[df_corr['Label'] == 'Field1']
corr_Field1 = df_corr_Field1.corr()
sns.heatmap(corr_Field1, annot=True, cmap='coolwarm', ax=axes[0,0], center=0)
axes[0,0].set_title('Field1')

# Field2 热力图
df_corr_Field2 = df_corr[df_corr['Label'] == "Field2"]
corr_Field2 = df_corr_Field2.corr()
sns.heatmap(corr_Field2, annot=True, cmap='coolwarm', ax=axes[0,1], center=0)
axes[0,1].set_title("Field2")

# Field3 热力图
df_corr_Field3 = df_corr[df_corr['Label'] == 'Field3']
corr_Field3 = df_corr_Field3.corr()
sns.heatmap(corr_Field3, annot=True, cmap='coolwarm', ax=axes[1,0], center=0)
axes[1,0].set_title('Field3')

# Field4 热力图
df_corr_Field4 = df_corr[df_corr['Label'] == 'Field4']
corr_Field4 = df_corr_Field4.corr()
sns.heatmap(corr_Field4, annot=True, cmap='coolwarm', ax=axes[1,1], center=0)
axes[1,1].set_title('Field4')

# 调整子图间距并展示
plt.tight_layout()
plt.show()

带遮罩的版本(以上三角遮罩为例)

只需在代码开头导入numpy并定义遮罩:

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 初始化画布和子图
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(20, 6))

# 提取需要计算相关性的列
df_corr = dt[['Label','CE(µS/cm)', 'pH','HCO3-','Cl-', 'SO4', 'NO3-', 'Na+', 'K+', 'Ca2+', 'Mg2+', 'NH4+', 'TC', 'IC', 'COT']]

# 生成上三角遮罩(所有子图共用)
sample_corr = df_corr[df_corr['Label'] == 'Field1'].corr()
mask = np.triu(np.ones_like(sample_corr, dtype=bool))

# Field1 热力图
df_corr_Field1 = df_corr[df_corr['Label'] == 'Field1']
corr_Field1 = df_corr_Field1.corr()
sns.heatmap(corr_Field1, annot=True, cmap='coolwarm', ax=axes[0,0], center=0, mask=mask)
axes[0,0].set_title('Field1')

# 其余子图代码同上,保留mask=mask参数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 17:22:18