求助:如何按指定区间自定义Seaborn相关矩阵的颜色?
自定义Seaborn相关矩阵热力图的区间颜色
需要给Seaborn绘制的相关矩阵热力图按指定区间设置色块颜色:
- (-1, -0.6):深蓝色
- (-0.6, -0.2):蓝色
- (-0.2, 0.2):白色
- (0.2, 0.6):红色
- (0.6, 1):深红色
现有代码尝试用线性渐变的自定义色卡,但无法实现离散区间的精准颜色映射,调整方案如下:
实现思路
要绑定离散区间和对应颜色,需使用matplotlib.colors.BoundaryNorm将区间边界与颜色列表一一对应,替代默认的线性颜色渐变逻辑。
修改后的完整代码
import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap, BoundaryNorm import seaborn as sns import pandas as pd # 假设df_corr是你的相关矩阵DataFrame corr = df_corr corr = corr.fillna(0) f, ax = plt.subplots(figsize=(15, 9)) f.set_facecolor('#061ab1') # 定义对应区间的颜色 my_colors = [ (0.0, 0.0, 0.5, 1.0), # 深蓝色 (-1,-0.6) (0.0, 0.0, 1, 1), # 蓝色 (-0.6,-0.2) (1, 1, 1, 1), # 白色 (-0.2,0.2) (1, 0.0, 0.0, 1.0), # 红色 (0.2,0.6) (0.5, 0.0, 0.0, 1.0) # 深红色 (0.6,1) ] # 定义区间边界(5种颜色对应6个边界点) boundaries = [-1, -0.6, -0.2, 0.2, 0.6, 1] # 创建离散颜色映射和归一化器 cmap = LinearSegmentedColormap.from_list('Custom', my_colors, len(my_colors)) norm = BoundaryNorm(boundaries, cmap.N) # 绘制热力图,传入norm实现区间颜色映射 ax = sns.heatmap( corr, cmap=cmap, norm=norm, # 关键:绑定区间与颜色的核心参数 linewidths=.5, linecolor='lightgray', annot=True, fmt=".2f", annot_kws={'fontsize': 12, 'fontstyle': 'italic', 'color':'white'} # 修正:将注释样式参数移至heatmap调用内 ) # 设置轴刻度样式 plt.xticks(rotation=20, color='white', size=10) plt.yticks(rotation=0, color='white', size=10) _, labels = plt.yticks() plt.setp(labels, rotation=0) # 调整颜色条:刻度设为区间中点,标签匹配区间含义 colorbar = ax.collections[0].colorbar # 计算每个区间的中点作为刻度位置 tick_positions = [(-1 + (-0.6))/2, (-0.6 + (-0.2))/2, (-0.2 + 0.2)/2, (0.2 + 0.6)/2, (0.6 + 1)/2] colorbar.set_ticks(tick_positions) colorbar.set_ticklabels( ['Forte corrélation \n négative', 'Correlation négative', 'Corrélation faible','Corrélation positive','Forte corrélation \n positive'], color='white' ) plt.show()
关键修改说明
- 新增区间边界定义:
boundaries列表明确划分了每个颜色对应的数值范围 - 使用BoundaryNorm:替代默认的线性归一化,确保每个区间严格对应指定颜色
- 修正注释样式参数:将
annot_kws移至sns.heatmap的参数内,确保注释样式生效 - 调整颜色条刻度:用区间中点作为刻度位置,让标签与颜色区间对应更准确
内容的提问来源于stack exchange,提问作者Adrien Savoye
相关产品推荐
相关产品推荐

