绘制四场野外试验相关矩阵热力图遇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
相关产品推荐
相关产品推荐

