You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Seaborn热力图(Heatmap)空白区域填充黑色的颜色映射与标注问题解决问询

解决热力图空白单元格填充黑色且保持原颜色映射的问题

我来帮你搞定这个问题!你的核心需求是让热力图里的空白(NaN)单元格显示黑色,同时保留prediction各值的正确颜色映射,而且空白处不显示占位数字。之前用fill_value=99的方法之所以出问题,是因为这个占位值会干扰颜色映射,还会显示不需要的标注。下面是正确的解决方案:

正确代码实现

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import seaborn as sns

# 原数据不变
data = {'trajectory': [101,102,102,102,102,102,102,102,104,104,104,104,104,104,104,107,107,107,107, 107,107,107,107,107,108,108,108,108,108,108,108,109,109,109,109,109,109,112, 112,112,112,112,113,113,113,113,114,114,114,114],
        'segment': [1,1,1,1,2,2,3,3,1,1,2,2,2,3,3,1,1,2,2,2,2,3,3,3,1,1,1, 2,2,2,2,1,1,1,2,2,2,1,1,2,2,2,1,2,2,3,1,2,2,2],
        'prediction': [3,0,0,1,3,3,2,2,0,0,4,4,2,0,0,0,0,2,2,2,3,0,0,2,0,0,1,1, 1,1,0,1,2,1,3,3,3,1,1,4,4,2,1,4,4,3,0,3,3,2]}
df = pd.DataFrame(data)

# 生成plot_data时不要替换NaN,保留原缺失值
plot_data = (df.value_counts()
             .sort_values(ascending=False)
             .reset_index()
             .drop_duplicates(['trajectory', 'segment'])
             .pivot_table(index='trajectory', columns='segment', values='prediction'))

# 创建颜色映射,并设置NaN(空白)对应的颜色为黑色
cmap = mcolors.ListedColormap(['c', 'b', 'g', 'y','m'])
cmap.set_bad(color='k')  # 关键:把缺失值的颜色设为黑色

# 绘制热力图
fig, ax = plt.subplots(figsize=(10,6))
sns.heatmap(plot_data, 
            vmin=-0.5, 
            vmax=4.5, 
            cmap=cmap, 
            annot=True)
plt.show()

为什么这个方法能解决问题?

  1. 保留NaN,不用占位值:这样seaborn.heatmap默认不会在空白单元格显示任何标注,完美解决“显示99”的问题。
  2. cmap.set_bad()设置缺失值颜色:专门针对NaN值设置黑色,不会干扰正常prediction值的颜色映射。
  3. 保持原颜色映射逻辑vmin=-0.5vmax=4.5的设置,让0-4每个值刚好对应cmap里的一个颜色(0→青色,1→蓝色,2→绿色,3→黄色,4→洋红色),完全符合你的预期。

解释之前的错误

  • fill_value=99会让空白单元格被填充为99,这个值超出了vmax=4.5的范围,所以会被映射到颜色映射表的最后一个颜色(黑色),同时annot=True会显示这个99,导致两个问题。
  • 而用set_bad()的方式,是直接告诉matplotlib如何处理缺失值,不会影响正常数据的颜色和标注。

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

火山引擎 最新活动