如何修复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
相关产品推荐
相关产品推荐

