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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:15:09