如何修改seaborn的sns.heatmap配置实现横向颜色缩放且不改变原始数值
解决方案
你可以通过将颜色映射用的矩阵和标注展示用的矩阵分开传入sns.heatmap来实现需求,两者维度匹配即可独立生效,不需要做耦合修改。
修改后的完整代码如下:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 保留原始计数矩阵,用于标注展示 z = df2.groupby(["winner", "opening_name"]).size().unstack().fillna(0).astype(int) # 单独计算按行归一化的矩阵,仅用于控制颜色映射规则 z_row_norm = z.apply(lambda x: x/x.sum(), axis=1) fig, ax = plt.subplots(figsize=(32, 16)) sns.heatmap( # 颜色映射规则由行归一化后的矩阵决定 data=z_row_norm, # 标注内容直接使用原始计数矩阵 annot=z, xticklabels=True, yticklabels=True, cmap='YlOrBr', linewidths=0.005, linecolor='black', annot_kws={"fontsize":16}, # 原始z为整数,格式符用d,若需要展示小数可调整为对应格式如'.2f' fmt='d', cbar=False ) plt.xticks(fontsize = 16) plt.yticks(fontsize=16) plt.show() del z, z_row_norm
如果你的需求是保留原先展示的按列归一化比例数值,仅修改颜色映射为按行规则,只需要将annot参数替换为你原来的按列归一化矩阵即可:
# 按列归一化的矩阵,用于标注展示 z_col_norm = z.apply(lambda x: x/x.sum()) # 按行归一化的矩阵,用于颜色映射 z_row_norm = z.apply(lambda x: x/x.sum(), axis=1) # 调用heatmap时对应传参即可 sns.heatmap(data=z_row_norm, annot=z_col_norm, fmt='.2f', ...)
内容的提问来源于stack exchange,提问作者Keperoze
相关产品推荐
相关产品推荐

