如何让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
相关产品推荐
相关产品推荐

