You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:32:33