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

如何修复Seaborn热力图值范围跨度大时的颜色映射问题

解决Seaborn热力图自定义颜色映射的问题

为啥会出问题?

你用的ListedColormap默认是把颜色列表按顺序对应到从数据最小值到最大值的连续区间,不是直接匹配你写的键值对。你的数据里有0、1、6、7、8、9,最小值0最大值9,所以颜色会被匀分到0-9这10个数值的区间里,自然2-5这些没数据的也被分配了中间颜色。

怎么改?

得用BoundaryNorm来指定每个数值对应的专属颜色区间,让颜色只绑定你定义的那6个值,直接用下面的代码就行:

import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, BoundaryNorm

# 你的自定义颜色映射
cmap_new = {0: '#faf5f5', 1: '#ff0303', 6: '#1f78b4', 7: '#b2df8a', 8: '#33a02c', 9: '#fb9a99'}

# 先把要匹配的数值排好序,再对应取颜色
sorted_vals = sorted(cmap_new.keys())
colors = [cmap_new[v] for v in sorted_vals]

# 创建颜色映射
cmap = ListedColormap(colors)

# 给每个数值设置上下边界,比如0对应[-0.5, 0.5],确保每个值独占一个颜色区间
bounds = [v - 0.5 for v in sorted_vals] + [sorted_vals[-1] + 0.5]
norm = BoundaryNorm(bounds, cmap.N)

# 绘制热力图,关键是加上norm参数
ax = sns.heatmap(
    data=tmp_df,
    cmap=cmap,
    norm=norm,
    yticklabels=True,
    xticklabels=False,
    linewidths=1,
    square=True,
    annot=True
)
plt.show()

额外提示

  • 排序sorted_vals是为了让边界顺序和数值对应,避免映射混乱
  • 如果想让右侧颜色条只显示你定义的数值,就在sns.heatmap里加cbar_kws={'ticks': sorted_vals}参数
  • 改完后,只有0、1、6、7、8、9会对应你设置的颜色,2-5因为数据里没有,也不会被分配颜色

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:23