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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:24:51