如何在Seaborn或Matplotlib中为热图xticks、yticks添加分组colorbar标识
热图刻度分组颜色条实现方案
完全可以实现你需要的刻度分组色块效果,核心思路是在热图的轴外侧,根据分组的索引范围绘制对应颜色的矩形色块即可,以下是完整可运行代码:
import seaborn as sns from matplotlib import pyplot as plt import numpy as np import matplotlib.patches as patches # 原始数据 mgroup = np.array([1,1,1,2,2,3,3,3,3,4,5,5]) normal_data = np.random.randn(12, 12) # 自定义分组对应颜色,可按需修改 group_color_map = { 1: '#4e79a7', # 蓝色 2: '#f28e2c', # 橙色 3: '#59a14f', # 浅绿 4: '#1e3a8a', # 深蓝 5: '#166534' # 深绿 } # 计算每个分组的起止索引 group_intervals = [] current_g = mgroup[0] start_idx = 0 for idx in range(1, len(mgroup)): if mgroup[idx] != current_g: group_intervals.append((current_g, start_idx, idx-1)) current_g = mgroup[idx] start_idx = idx group_intervals.append((current_g, start_idx, len(mgroup)-1)) # 绘制热图 fig, ax = plt.subplots(figsize=(8, 6)) sns.heatmap(normal_data, center=0, ax=ax) # 调整画布边距,预留色块位置 plt.subplots_adjust(left=0.15, bottom=0.15) # 调整刻度边距,避免和色块重叠 ax.tick_params(axis='x', pad=15) ax.tick_params(axis='y', pad=15) # 绘制x轴下方的分组色块 for g, start, end in group_intervals: rect_width = end - start + 1 # 位置参数:x起始、y起始、宽度、高度 rect = patches.Rectangle((start, -0.6), rect_width, 0.4, color=group_color_map[g], lw=0) ax.add_patch(rect) # 绘制y轴左侧的分组色块 for g, start, end in group_intervals: rect_height = end - start + 1 rect = patches.Rectangle((-0.6, start), 0.4, rect_height, color=group_color_map[g], lw=0) ax.add_patch(rect) plt.show()
自定义调整说明
- 可修改
group_color_map的色值更换分组颜色 - 调整Rectangle的位置和宽高参数,可修改色块的大小和与热图的间距
- 如果x轴和y轴的分组规则不同,单独定义y轴的分组数组和对应区间即可
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

