如何为Seaborn clustermap的指定行列添加斜线填充?
为Seaborn Clustermap指定行列添加斜线填充
seaborn.clustermap本身没有直接添加斜线填充的内置参数,但可以通过获取聚类后的轴对象,结合Matplotlib的hatch属性实现需求,具体步骤如下:
实现步骤
绘制聚类热图并保存ClusterGrid对象
先执行你的代码,保存返回的ClusterGrid实例,这样能获取聚类后的行列重排顺序:import seaborn as sns import matplotlib.pyplot as plt import numpy as np labels = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v"] # 用随机数据模拟你的数据集,实际替换为你的data即可 data = np.random.rand(22, 22) g = sns.clustermap(data, cmap=sns.cm.rocket_r, xticklabels=labels, yticklabels=labels)定位聚类后目标行列的索引
聚类会打乱原始行列顺序,需要先找到目标标签m、o、d、n、p在重排后的位置:# 提取聚类后的行/列标签文本 row_labels = [label.get_text() for label in g.ax_heatmap.get_yticklabels()] col_labels = [label.get_text() for label in g.ax_heatmap.get_xticklabels()] # 找到目标标签对应的索引 target_tags = ["m", "o", "d", "n", "p"] target_row_idx = [row_labels.get_loc(tag) for tag in target_tags] target_col_idx = [col_labels.get_loc(tag) for tag in target_tags]为目标单元格添加斜线填充
遍历热图的所有单元格,给目标行列的单元格设置hatch='//'属性:# 遍历热图的每个单元格 total_cols = len(col_labels) for i in range(len(row_labels)): for j in range(total_cols): # 判断当前单元格是否属于目标行或目标列 if i in target_row_idx or j in target_col_idx: # 获取对应单元格的矩形对象 rect = g.ax_heatmap.patches[i * total_cols + j] rect.set_hatch('//') # 调整透明度,避免遮挡热图颜色 rect.set_alpha(0.6) plt.show()
简化方案(针对整行/整列区域填充)
如果不需要给单个单元格加填充,而是给整个目标行/列区域添加斜线覆盖,可以直接绘制矩形:
# 给目标行区域添加斜线填充 y_start, y_end = g.ax_heatmap.get_ylim() for idx in target_row_idx: g.ax_heatmap.add_patch(plt.Rectangle( (0, idx), total_cols, 1, hatch='//', fill=False, alpha=0.4, color='gray' ))
内容的提问来源于stack exchange,提问作者crx91
相关产品推荐
相关产品推荐

