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

如何让Seaborn热力图从每行第二个非NaN值开始绘制

问题:Seaborn热力图从每行第二个值开始渲染的实现方法

我正在使用Seaborn绘制热力图,需要让热力图从每行的第二个值开始渲染(起始列并非固定列),但当前代码生成的热力图呈对角线分布,不符合需求,求实现方法。

现有代码

fig, ax = plt.subplots(figsize=(15, 15))
sns.set(font_scale=0.7)

map1=sns.heatmap(ax = ax, data = clv, annot = True, fmt='0.2f', cmap = 'Blues',linecolor='Grey',linewidth=.5, cbar=False)

st.write(fig)

示例数据

Column A B C D E F G H I J K L M N 
A 2.19 1.12 1.06 1.24 0.89 0.93 0.71 0.97 0.61 0.68 0.72 0.55 0.59 0.58 
B      31.05 9.31 16.48 10.77 11.60 8.43 12.33 7.89 8.49 8.61 6.95 7.23 6.97 
C            50.34 17.34 19.69 15.70 13.50 16.95 12.51 12.12 12.12 9.83 10.48 9.56 
D                  124.00 25.07 40.78 32.21 44.23 29.97 30.92 28.58 23.77 24.71 22.80 
E                         182.82 28.25 51.04 62.91 47.92 43.83 41.84 33.66 35.66 31.94 
F                                207.76 26.22 68.38 50.90 51.71 43.71 37.00 37.97 34.58 
G                                       216.92 32.33 53.02 47.19 42.77 32.44 34.16 30.33 
H                                              250.60 27.36 47.94 46.47 37.61 35.55 33.62 
I                                                     223.64 19.83 35.02 31.58 33.43 28.96 
J                                                            213.82 17.22 28.91 34.00 31.92 
K                                                                   201.36 13.90 28.63 29.06 
L                                                                          163.07 13.71 22.24 
M                                                                                177.52 11.58 
N                                                                                     1701.76

解决方案

核心思路是通过构造遮罩(mask)矩阵,将每行需要隐藏的前n个元素(即第二个值之前的所有元素)标记为需要遮罩的区域,让Seaborn只渲染遮罩外的内容。

步骤1:构造遮罩矩阵

根据需求,每行的第二个值起始位置随行数变化(第i行从第i+1列开始渲染),因此可以遍历每行,将该行前i+1个元素设为True(表示需要遮罩):

import numpy as np

# 构造与数据同形状的布尔遮罩矩阵
mask = np.zeros_like(clv, dtype=bool)
for i in range(mask.shape[0]):
    # 第i行遮罩前i+1个元素,从第i+1列开始渲染
    mask[i, :i+1] = True

步骤2:修改热力图代码

将构造好的mask传入seaborn.heatmap的mask参数,即可实现从每行第二个值开始渲染:

fig, ax = plt.subplots(figsize=(15, 15))
sns.set(font_scale=0.7)

# 传入mask参数,只渲染未遮罩的区域
map1 = sns.heatmap(ax=ax, data=clv, annot=True, fmt='0.2f', cmap='Blues',
                   linecolor='Grey', linewidth=.5, cbar=False, mask=mask)

st.write(fig)

补充说明

  • 如果你的数据中空值未被识别为缺失值,需要先将空值转换为NaN:
    clv = clv.replace('', np.nan)
    
  • 遮罩矩阵的逻辑可以根据实际需求调整,比如如果“每行第二个值”指的是每行的第二个非空值,可通过遍历每行找到第一个非空值的位置,再将该位置之前(包括该位置)的元素设为遮罩。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:40:37