如何为Seaborn类热力图左侧添加多颜色预期列?
没问题,我给你整理一个能实现这个需求的具体方案,核心是用matplotlib的绘图工具在Seaborn热力图左侧额外加一个颜色展示列,完美适配每行多颜色的情况。
实现思路
我们会先处理你提供的颜色DataFrame,让它和热力图的行一一对应;然后绘制基础热力图,再在左侧创建一个独立的轴来绘制每行的预期颜色块;最后处理细节对齐,保证整体视觉协调。
完整代码示例
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import matplotlib.patches as patches # 1. 处理你提供的颜色DataFrame color_df = pd.DataFrame({ '1.row':['#002b80','',''], '2.row':['#0044cc','#002b80',''], '3.row':['#4d88ff','#002b80',''], '4.row':['#99bbff','',''], '5.row':['#ccddff','#99bbff',''], '6.row':['#ff6600','',''], '7.row':['#ff944d','',''], '8.row':['#ffc299','#ff944d','#ff6600'], '9.row':['#2d862d','',''], '10.row':['#66cc66','#2d862d',''] }).T # 转置后让行对应热力图的每行 color_df.columns = ['color1', 'color2', 'color3'] # 重命名列方便后续处理 # 2. 准备热力图数据(替换成你自己的真实数据即可) heatmap_data = pd.DataFrame( data=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16], [17,18,19,20],[21,22,23,24],[25,26,27,28],[29,30,31,32], [33,34,35,36],[37,38,39,40]], index=color_df.index # 确保行索引和颜色DataFrame完全一致 ) # 3. 绘制热力图+左侧颜色列 sns.set_style("white") fig, ax_main = plt.subplots(figsize=(8, 6)) # 绘制主热力图 sns.heatmap(heatmap_data, ax=ax_main, cmap='viridis', annot=True, fmt='d') # 在左侧创建颜色展示轴(手动调整位置参数,保证和热力图对齐) ax_color = fig.add_axes([0.05, ax_main.get_position().y0, 0.08, ax_main.get_position().height]) ax_color.set_xticks([]) # 隐藏颜色轴的刻度 ax_color.set_yticks([]) # 遍历每行绘制颜色块 n_rows = len(color_df) n_max_colors = 3 # 每行最多3种颜色 row_height = 1 / n_rows for i, (_, row_colors) in enumerate(color_df.iterrows()): # 计算当前行在轴上的y坐标范围(归一化坐标,从下到上) y_bottom = i / n_rows y_top = (i + 1) / n_rows color_segment_height = (y_top - y_bottom) / n_max_colors # 绘制每个非空颜色的矩形块 for j, color in enumerate(row_colors): if color: seg_bottom = y_bottom + j * color_segment_height seg_top = y_bottom + (j + 1) * color_segment_height rect = patches.Rectangle( (0, seg_bottom), 1, seg_top - seg_bottom, color=color ) ax_color.add_patch(rect) # 调整布局避免标签遮挡 ax_main.set_xlabel('热力图列', labelpad=15) plt.tight_layout() plt.show()
关键细节说明
- 转置颜色DataFrame是为了让它的行和热力图的行完全对应,避免顺序混乱;
- 用
add_axes手动创建左侧颜色轴,参数需要根据画布大小微调,保证和热力图的上下边界对齐; - 对空颜色值做了判断,只会绘制有效的颜色块;
- 如果用的是
seaborn.clustermap(带聚类树的热力图),需要先获取聚类后的行顺序,再重新排序颜色DataFrame,具体代码可以参考:# clustermap适配代码片段 g = sns.clustermap(heatmap_data, cmap='viridis', annot=True, fmt='d') plt.close() # 获取聚类后的行顺序 row_order = g.dendrogram_row.reordered_ind sorted_color_df = color_df.iloc[row_order] # 后续颜色轴绘制逻辑和上面一致,主轴改用g.ax_heatmap即可
自定义扩展
如果想把每行的多个颜色水平并排展示(而不是垂直堆叠),只需要把颜色块的宽度均分,高度占满整行即可,调整Rectangle的坐标参数就能实现。
内容的提问来源于stack exchange,提问作者actnmk
相关产品推荐
相关产品推荐

