如何为Seaborn热力图创建符合特定颜色规则的自定义颜色映射?
自定义Seaborn热力图颜色映射方案
需求
为Seaborn绘制的热力图创建自定义颜色映射:
- 数值0对应红色
- 数值1对应粉色
- 数值-3对应蓝色
- 0到1区间:红色逐渐过渡为粉色(颜色变浅)
- 0到-3区间:红色逐步过渡为蓝色
原始代码如下:
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd # 原代码遗漏pandas导入,需补充 test_data = {"a":{"a":1 , "b":0.5, "c":-0.2, "d":-2.7} , "b":{"a":0.2 , "b":0, "c":-1.3, "d":-2}, "c":{"a":0 , "b":1, "c":-2.2, "d":-0.005}, "d":{"a":-3 , "b":0.9, "c":0.01, "d":-1.15}} test_data_df = pd.DataFrame.from_dict(test_data) fig, ax = plt.subplots(figsize=(11,9)) _ = sns.heatmap(test_data_df, annot=True)
解决方案
使用matplotlib.colors.LinearSegmentedColormap自定义分段渐变的颜色映射,精准匹配你的数值-颜色对应要求:
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd from matplotlib.colors import LinearSegmentedColormap # 定义自定义颜色映射:指定关键数值对应的颜色及过渡 # 归一化位置计算:数值范围是-3到1,总跨度为4,每个数值的位置=(val - (-3))/4 custom_cmap = LinearSegmentedColormap.from_list( "my_custom_cmap", [ (0.0, "blue"), # -3对应蓝色,归一化位置=(-3 +3)/4=0.0 (0.75, "red"), # 0对应红色,归一化位置=(0 +3)/4=0.75 (1.0, "pink") # 1对应粉色,归一化位置=(1 +3)/4=1.0 ] ) test_data = {"a":{"a":1 , "b":0.5, "c":-0.2, "d":-2.7} , "b":{"a":0.2 , "b":0, "c":-1.3, "d":-2}, "c":{"a":0 , "b":1, "c":-2.2, "d":-0.005}, "d":{"a":-3 , "b":0.9, "c":0.01, "d":-1.15}} test_data_df = pd.DataFrame.from_dict(test_data) fig, ax = plt.subplots(figsize=(11,9)) # 热力图中启用自定义色卡,并锁定数值范围确保颜色映射准确 sns.heatmap( test_data_df, annot=True, cmap=custom_cmap, vmin=-3, # 最小数值匹配-3 vmax=1 # 最大数值匹配1 ) plt.show()
关键说明
- 颜色映射逻辑:通过归一化数值位置,让matplotlib自动生成区间内的平滑渐变:
- -3到0:蓝色逐步过渡到红色
- 0到1:红色逐步过渡到粉色
- 锁定数值范围:设置
vmin=-3和vmax=1是核心,避免Seaborn自动缩放颜色范围导致映射偏差 - 颜色自定义:可以替换
"blue"、"red"、"pink"为HEX色值(如#FF0000代表纯红),实现更精准的颜色控制
内容的提问来源于stack exchange,提问作者amiref
相关产品推荐
相关产品推荐

