如何将Seaborn heatmap最后一行和最右列设为白并保留数值与索引
Seaborn热图指定单元格设为白色且保留标注的解决方案
不要用mask参数实现该需求,mask的设计逻辑就是同时隐藏对应位置的色块和标注,不符合你的使用场景。你可以在热图绘制完成后,直接修改指定位置单元格的背景色,完全不影响标注、行/列索引的正常显示。
实现代码
import numpy as np import matplotlib.pyplot as plt import seaborn as sns import pandas as pd np.random.seed(2021) df = pd.DataFrame(np.random.normal(0, 1, (6, 4))) df = df.rename(columns = {0:"a", 1:"b", 2:"c", 3:"d"}) df.index = [value for key, value in {0:"a", 1:"b", 2:"c", 3:"d", 4:"e", 5:"f"}.items()] # 正常绘制热图,接收返回的Axes对象 ax = sns.heatmap(df, annot = True) n_rows, n_cols = df.shape # 遍历修改最后一行、最右列的单元格背景色 for row_idx in range(n_rows): for col_idx in range(n_cols): # 匹配最后一行 或 最右列的单元格 if row_idx == n_rows - 1 or col_idx == n_cols - 1: # 按顺序定位对应单元格的色块,修改背景为白色 ax.patches[row_idx * n_cols + col_idx].set_facecolor('white') plt.show()
原理解释
sns.heatmap返回的Axes对象的patches属性存储了所有单元格的色块对象,排列规则为从上到下逐行排列、每行内从左到右排列,可以通过行号、列号直接计算对应色块的索引- 仅修改色块的
facecolor属性,不会影响已经渲染完成的数值标注、行/列文本索引 - 代码适配任意大小的DataFrame,不需要硬编码行/列数量
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

