如何在Seaborn热力图中按{1:'A',2:'B',3:'C',4:'NA'}映射自定义颜色条
解决Seaborn离散热力图的颜色与标签映射问题
你的需求是让数据里的1→A、2→B、3→C、4→NA和对应的颜色严格对应,之前手动设置色条刻度的方式容易出错,我们可以通过更清晰的映射逻辑来实现:
核心思路
- 明确数据值→标签的映射字典,同时按数据值的顺序定义对应的颜色列表,确保两者一一对应
- 让热力图的颜色范围刚好覆盖每个离散值的区间(比如值1对应
[0.5,1.5),值2对应[1.5,2.5),以此类推) - 直接将色条刻度放在每个离散值的位置,对应到我们的标签
修改后的完整代码
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
相关产品推荐
相关产品推荐

