如何将热力图的实际数值与按行着色的热力图效果相结合?
解决方案:保留原始数值标注 + 每行内部归一化着色
我来帮你搞定这个需求!你想要的效果是显示原始实际数值,但按照每行内部的相对大小来着色,其实不用生成两个独立的热力图,只需要在seaborn.heatmap里分开指定控制颜色的数据集和显示标注的数据集就行。
完整实现代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 1. 生成原始透视表(和你之前的步骤一致) df = pd.pivot_table(table, 'avg', index=['col_1'], columns=['col_2']) # 2. 计算每行内部归一化的数据(用于控制热力图颜色) # 这里和你生成第二个热力图的逻辑相同:每行除以该行的最大值 df_n = df.div(df.max(axis=1), axis=0) # 3. 生成目标热力图:核心是分开指定data和annot参数 plt.figure(figsize=(10, 6)) # 可根据需求调整图大小 sns.heatmap( df_n, # 用归一化后的数据集决定着色规则 linewidths=.5, annot=df, # 显示原始透视表的实际数值 cbar=True, # 保留色条,方便查看归一化后的相对刻度 fmt='g', # 保持数值的原始格式(不做小数格式化) annot_kws={'size':14}, # 调整标注文字大小 cmap='YlOrBr' # 沿用你指定的配色方案 ) plt.show()
关键逻辑说明
data=df_n:让热力图根据每行归一化后的数值计算颜色,实现“每行内部数值相对着色”的效果annot=df:强制显示原始透视表的实际数值,而不是归一化后的小数- 其他参数(
linewidths、cmap等)可以完全沿用你之前的设置,不需要修改
这样就能一次性生成你想要的热力图,既保留了真实数值的可读性,又实现了每行独立的颜色对比效果。
内容的提问来源于stack exchange,提问作者Zole72




