如何用Seaborn绘制每行对应不同色阶的热力图?
实现每行独立色阶的Seaborn热力图
要实现每行使用不同颜色范围的热力图,核心思路是对每行数据单独做归一化处理,再为每行分配专属的颜色映射,最后通过Matplotlib手动构建颜色矩阵来绘制。以下是完整实现代码和步骤说明:
完整代码
import pandas as pd import matplotlib.pyplot as plt import numpy as np from sklearn.preprocessing import MinMaxScaler # 原始数据 d = {'jan': [44, 2, 3, 4], 'feb': [33, 4, 6, 8], 'mar': [50, 10, 15, 20], 'abr': [11, 12, 13, 14], 'mai': [3, 40, 6, 60], 'jun': [40, 8, 12, 16]} idx = ['A', 'B', 'C', 'D'] df = pd.DataFrame(d, index=idx) # 1. 对每行数据做min-max归一化(缩放到0-1区间) scaler = MinMaxScaler() df_scaled = pd.DataFrame(scaler.fit_transform(df.T).T, index=idx, columns=df.columns) # 2. 为每行指定对应颜色映射 row_cmaps = [ plt.cm.YlOrBr, # A行:黄色系 plt.cm.Blues, # B行:蓝色系 plt.cm.Greens, # C行:绿色系 plt.cm.Reds # D行:红色系 ] # 3. 构建颜色矩阵(存储每个单元格的RGB值) color_matrix = np.zeros((df.shape[0], df.shape[1], 3)) for row_idx in range(df.shape[0]): # 获取当前行归一化后的值,匹配对应色映射的颜色 row_colors = row_cmaps[row_idx](df_scaled.iloc[row_idx].values) # 提取RGB通道(丢弃alpha通道) color_matrix[row_idx] = row_colors[:, :3] # 4. 绘制热力图并添加注释 fig, ax = plt.subplots(figsize=(8, 4)) ax.imshow(color_matrix, aspect='auto') # 添加每个单元格的原始数值注释 for i in range(df.shape[0]): for j in range(df.shape[1]): ax.text(j, i, df.iloc[i, j], ha='center', va='center', color='black') # 设置轴标签与样式 ax.set_xticks(np.arange(df.shape[1])) ax.set_xticklabels(df.columns) ax.set_yticks(np.arange(df.shape[0])) ax.set_yticklabels(df.index, rotation=0) ax.tick_params(top=False, bottom=True, labeltop=False, labelbottom=True) plt.tight_layout() plt.show()
关键步骤说明
- 行级归一化:使用
MinMaxScaler将每行数据独立缩放到0-1区间,确保每行的最大值对应色映射的最深色、最小值对应最浅色,实现行内独立的颜色对比。 - 自定义颜色映射:为每行指定不同的Matplotlib内置色映射,满足A黄、B蓝、C绿、D红的需求。
- 构建颜色矩阵:遍历每行每列,从对应色映射中提取归一化值对应的RGB颜色,生成可直接绘制的颜色矩阵。
- 手动绘制与注释:用
imshow绘制颜色矩阵,再通过text函数添加原始数值注释,模拟Seaborn热力图的标注效果。
内容的提问来源于stack exchange,提问作者Marcos Saporiti
相关产品推荐
相关产品推荐

