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

如何用Seaborn为DataFrame特定行及上三角区域生成热力图

问题:Seaborn热力图定制需求

我想用Python的Seaborn库构建热力图,具体需求如下:

  • 对角线及下方区域不显示热力图
  • 对角线上方区域显示热力图
  • 在total、cum total、%change这类总计行中,仅倒数第二行显示热力图,且配色要求:正值用深绿到浅绿渐变,负值用橙色到红色渐变

目前我已经通过识别对角线元素、创建两个热力图实现了前两点需求。针对第三点,我已经生成了一个将原DataFrame元素替换为NaN的新DataFramedf_values,现在需要完成该特定总计行的热力图配置。现有代码如下:

import numpy as np
import seaborn as sns
from matplotlib.colors import ListedColormap

# 假设clv是原始数据DataFrame,ax是绘图轴对象
diagonal_mask = np.eye(len(clv), dtype=bool)

print("diagonal_mask:", diagonal_mask)

cmap_for_diag = sns.color_palette(['white'], as_cmap=True)  # 创建对角线的单色配色

common_keywords = dict(annot=True, fmt='.2f', linecolor='Black', linewidth=.5, ax=ax)
# 绘制对角线区域的热力图
map1 = sns.heatmap(clv, cmap=cmap_for_diag, mask=~diagonal_mask, cbar=False, **common_keywords)
map1.xaxis.tick_top()
# 绘制对角线上方区域的热力图
map2 = sns.heatmap(clv, cmap='Blues', mask=diagonal_mask, cbar=False, **common_keywords)

# 待完善的总计行热力图
map3 = sns.heatmap(ax=ax, data=df_values, annot=True, fmt='g', cmap=ListedColormap(['Red']), cbar=False, linecolor='Grey', linewidth=.5)
解决方案

要搞定总计行的配色和显示需求,你可以按以下步骤修改代码:

  1. 自定义正负值渐变配色
    用matplotlib.colors.LinearSegmentedColormap制作符合要求的渐变配色:
  • 负值区域:从红色(#FF3333)过渡到橙色(#FF9933)
  • 正值区域:从浅绿(#99FF99)过渡到深绿(#339933)
  • 中间0值用白色分隔,保证正负值视觉区分清晰
  1. 精准控制总计行显示
    给df_values创建一个mask,只保留倒数第二行的非NaN数据,再应用自定义配色:

修改后的map3代码如下:

from matplotlib.colors import LinearSegmentedColormap

# 自定义配色方案:负值红→橙,正值浅绿→深绿
cmap_custom = LinearSegmentedColormap.from_list(
    'custom_cmap',
    ['#FF3333', '#FF9933', '#FFFFFF', '#99FF99', '#339933'],
    N=256
)

# 创建mask:仅保留倒数第二行的非NaN数据
total_row_mask = np.ones(df_values.shape, dtype=bool)
# 选中倒数第二行,将非NaN位置设为False(即不被mask遮挡)
total_row_mask[-2, :] = np.isnan(df_values.iloc[-2, :])

# 绘制总计行热力图
map3 = sns.heatmap(
    ax=ax,
    data=df_values,
    annot=True,
    fmt='g',
    cmap=cmap_custom,
    cbar=False,
    mask=total_row_mask,
    linecolor='Grey',
    linewidth=.5,
    vmin=df_values.min().min(),  # 根据数据实际范围设置配色极值
    vmax=df_values.max().max()
)
  1. 整体注意事项
  • 三个热力图必须在同一个ax对象上绘制,顺序为:对角线→对角线上方→总计行,避免图层覆盖导致内容被遮挡
  • 如果总计行的数值范围和上方热力图差异较大,可以单独调整vmin和vmax参数,让配色的渐变效果更贴合数据

内容的提问来源于stack exchange,提问作者Newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:44:58