如何用Seaborn绘制带彩色线条副坐标轴的热力图
给Seaborn Heatmap添加彩色轴线条
要实现你要的效果,核心是利用Matplotlib的自定义轴绘制和主刻度对齐的彩色条,下面是具体实现代码和说明:
首先准备基础热力图数据,以及每个类别对应的颜色数值(可替换为你的实际数据):
import numpy as np import seaborn as sns import matplotlib.pyplot as plt import matplotlib.cm as cm from matplotlib.colors import Normalize # 基础数据 vals = np.array(['A','B','C','D']) corrs = np.array([[0, 1, 0.5, 3],[1,0,2,0],[0.5, 2,0, 3],[3,0,3,0]]) # 模拟每个类别对应的颜色数值(替换成你的实际数据) color_x = np.array([0.1, 0.6, 0.3, 0.9]) color_y = np.array([0.4, 0.7, 0.2, 0.8]) # 配置配色和归一化(确保颜色值映射到正确色域) cmap = plt.cm.viridis norm_x = Normalize(vmin=color_x.min(), vmax=color_x.max()) norm_y = Normalize(vmin=color_y.min(), vmax=color_y.max())
接下来绘制基础热力图,并创建副轴添加彩色线条:
# 创建画布和主轴 fig, ax = plt.subplots(figsize=(7, 7)) sns.heatmap(corrs, xticklabels=vals, yticklabels=vals, ax=ax, cmap='coolwarm') # --- 添加X轴下方的彩色条 --- # 副轴位置参数:[左偏移, 底部偏移, 宽度, 高度],基于主轴位置调整 ax_x = fig.add_axes([ax.get_position().x0, ax.get_position().y0 - 0.06, ax.get_position().width, 0.03]) ax_x.set_xticks([]) ax_x.set_yticks([]) # 为每个刻度绘制彩色块,和热力图单元格对齐 for idx in range(len(vals)): rect = plt.Rectangle((idx, 0), 1, 1, color=cmap(norm_x(color_x[idx]))) ax_x.add_patch(rect) ax_x.set_xlim(ax.get_xlim()) # 对齐主轴X范围 # --- 添加Y轴右侧的彩色条 --- ax_y = fig.add_axes([ax.get_position().x1 + 0.03, ax.get_position().y0, 0.03, ax.get_position().height]) ax_y.set_xticks([]) ax_y.set_yticks([]) for idx in range(len(vals)): rect = plt.Rectangle((0, idx), 1, 1, color=cmap(norm_y(color_y[idx]))) ax_y.add_patch(rect) ax_y.set_ylim(ax.get_ylim()) # 对齐主轴Y范围 # 可选:添加彩色条的颜色标尺 sm_x = cm.ScalarMappable(cmap=cmap, norm=norm_x) sm_x.set_array([]) fig.colorbar(sm_x, ax=ax_x, orientation='horizontal', pad=0.1) sm_y = cm.ScalarMappable(cmap=cmap, norm=norm_y) sm_y.set_array([]) fig.colorbar(sm_y, ax=ax_y, orientation='vertical', pad=0.1) plt.show()
关键说明:
- 副轴位置通过
add_axes()手动指定,基于主轴位置计算,确保和热力图精准对齐; - 彩色块的位置对应热力图每个单元格,通过循环逐个绘制;
Normalize可将任意范围的颜色数值映射到配色方案的完整色域,避免颜色失真;- 不需要颜色标尺的话,可删除最后几行colorbar相关代码。
内容的提问来源于stack exchange,提问作者IronicOwl
相关产品推荐
相关产品推荐

