如何在Seaborn热力图中用自定义颜色标注NaN值?
Seaborn热力图NaN单元格自定义样式实现方案
问题场景
使用包含NaN值的DataFrame绘制Seaborn热力图时,NaN对应的单元格显示为空白,需要将这些单元格设置为浅灰色,并标注“NaN”。
实现步骤
- 移除
heatmap中的mask参数:原代码的mask=merged_summary.isna()会隐藏NaN单元格,导致无法显示背景色和标注 - 自定义颜色映射(cmap):通过
set_bad方法给NaN值指定浅灰色背景 - 调整标注矩阵:确保NaN位置的标注为“NaN”(可按需修改为其他文本)
修改后的完整代码
import seaborn as sns import matplotlib.pyplot as plt from matplotlib.colors import LogNorm, Normalize import numpy as np import pandas as pd data = { "Server (%)": [np.nan, 0.2, 2.4], "Scheduler (%)": [np.nan, 2.3, 4.5] } merged_summary = pd.DataFrame(data) # 准备标注矩阵 annot = merged_summary.copy() for i in range(annot.shape[0]): for j in range(annot.shape[1]): val = annot.iat[i, j] if pd.isna(val): annot.iat[i, j] = "NaN" # 设置NaN对应的标注文本 elif val > 1: annot.iat[i, j] = f"{val:.1f} %" else: annot.iat[i, j] = f"{val:.3f} %" fig, ax = plt.subplots(3,1, figsize=(5,7), constrained_layout=True) cmap = plt.cm.get_cmap("coolwarm") cmap.set_bad(color="#f0f0f0") # 为NaN值设置浅灰色背景 h2 = sns.heatmap( data=merged_summary, annot=annot.values, fmt='', cmap=cmap, cbar=False, linewidths=0.5, linecolor='white', # 移除mask参数,避免隐藏NaN单元格 vmin=0.1, vmax=30, norm=LogNorm(vmin=0.1, vmax=30), annot_kws={"size": 8}, ax=ax[2], ) plt.show()
效果说明
修改后,NaN对应的单元格会显示浅灰色背景,同时标注“NaN”;非NaN值保持原有的颜色映射和数值格式标注。
内容的提问来源于stack exchange,提问作者Mr. Discuss
相关产品推荐
相关产品推荐

