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

如何在Seaborn热力图中按{1:'A',2:'B',3:'C',4:'NA'}映射自定义颜色条

解决Seaborn离散热力图的颜色与标签映射问题

你的需求是让数据里的1→A、2→B、3→C、4→NA和对应的颜色严格对应,之前手动设置色条刻度的方式容易出错,我们可以通过更清晰的映射逻辑来实现:

核心思路

  1. 明确数据值→标签的映射字典,同时按数据值的顺序定义对应的颜色列表,确保两者一一对应
  2. 让热力图的颜色范围刚好覆盖每个离散值的区间(比如值1对应[0.5,1.5),值2对应[1.5,2.5),以此类推)
  3. 直接将色条刻度放在每个离散值的位置,对应到我们的标签

修改后的完整代码

import seaborn as sns 
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors

# 定义数据值到标签的映射
value_label_map = {1: 'A', 2: 'B', 3: 'C', 4: 'NA'}
# 按数据值的顺序(1、2、3、4)对应颜色,确保和映射字典顺序一致
color_list = ['red', 'blue', 'black', 'yellow']

# 你的原始数据
data = np.array([
    [2, 1, 1, 1, 2, 3, 3, 3, 3, 3], 
    [3, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
]) 
x_labels = ['a', 'b', 'c', 'd'] 
dataFrame = pd.DataFrame(data.T) 

# 创建离散色图,颜色顺序和数据值顺序对应
cmap = colors.ListedColormap(color_list)
# 绘制热力图,设置vmin和vmax让颜色范围覆盖所有离散值的区间
ax = sns.heatmap(
    dataFrame, 
    cmap=cmap, 
    linewidths=.5, 
    linecolor='lightgray',
    vmin=0.5,  # 第一个离散值1的下限
    vmax=4.5   # 最后一个离散值4的上限
) 

# 设置轴标签
ax.set_xticklabels(x_labels) 
ax.set_yticklabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']) 

# 配置颜色条:刻度放在每个离散值的位置,对应我们的标签
colorbar = ax.collections[0].colorbar 
colorbar.set_ticks(list(value_label_map.keys()))  # 刻度为1、2、3、4
colorbar.set_ticklabels(list(value_label_map.values()))  # 对应标签A、B、C、NA

plt.show()

关键说明

  • 我们把value_label_map和color_list绑定在一起,只要保持两者的顺序和数据值对应,后续修改映射关系会非常方便
  • 设置vmin=0.5和vmax=4.5,是为了让每个数据值刚好对应色条上的一个独立色块,避免颜色过渡
  • 直接用映射字典的键作为刻度位置,值作为标签,完全不需要手动计算刻度的偏移量,逻辑更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:22:31