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

如何配置精细化热力图及注释文字颜色、色标范围调整问题求助

解决Seaborn热力图的两个配置问题

针对你遇到的这两个Seaborn热力图配置问题,我来给你详细的解决方案:

问题1:根据数值动态设置注释文字颜色

默认的annot_kws只能设置统一的文字颜色,要实现91及以上显示白色,90及以下显示黑色,我们可以在绘制热力图之后,遍历所有注释文本元素,根据其数值内容来修改颜色:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame(
    data = {
        'Set_A' : [91, 91, 91, 90, 91, 91, 91],
        'Set_B' : [91, 92, 91, 89, 91, 91, 91],
        'Set_C' : [89, 90, 89, 88, 90, 89, 89],
        'model' : ['SVM', 'RF', 'LR', 'KNN', 'NB', 'MLP', 'LGB'],
    }
)
df = df.set_index('model')

# 先绘制热力图,暂不统一设置注释颜色
ax = sns.heatmap(df, cmap='Reds', annot=True, vmin=85, vmax=95, linewidths=.5)

# 遍历每个注释文本,根据数值动态调整颜色
for text in ax.texts:
    val = float(text.get_text())
    text.set_color('white' if val >= 91 else 'black')

plt.show()

解释:通过ax.texts可以获取热力图上所有的注释文本对象,逐个提取数值进行判断后修改颜色,就能实现你需要的差异化文字颜色效果。

问题2:调整色标范围为85-95,及精细化热力图配置

固定色标范围为85-95

你已经设置了vmin=85和vmax=95,但色标刻度显示为86-94,是因为Seaborn默认会自动优化刻度显示范围。要强制显示85到95的完整刻度,我们可以手动指定色标的刻度值:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame(
    data = {
        'Set_A' : [91, 91, 91, 90, 91, 91, 91],
        'Set_B' : [91, 92, 91, 89, 91, 91, 91],
        'Set_C' : [89, 90, 89, 88, 90, 89, 89],
        'model' : ['SVM', 'RF', 'LR', 'KNN', 'NB', 'MLP', 'LGB'],
    }
)
df = df.set_index('model')

ax = sns.heatmap(df, cmap='Reds', annot=True, vmin=85, vmax=95, linewidths=.5)

# 手动设置色标刻度,覆盖默认的自动刻度
cbar = ax.collections[0].colorbar
cbar.set_ticks(np.arange(85, 96, 1))  # 从85到95,步长为1
cbar.set_ticklabels(np.arange(85, 96, 1))  # 设置对应的刻度标签

# 同时结合问题1的注释颜色调整逻辑
for text in ax.texts:
    val = float(text.get_text())
    text.set_color('white' if val >= 91 else 'black')

plt.show()

精细化热力图配置的常用技巧

这里整理几个实用的精细化配置方向,你可以按需调整:

  • 注释样式优化:通过annot_kws设置字体大小、加粗等,比如annot_kws={'size':12, 'weight':'bold'}
  • 自定义颜色映射:除了'Reds',可以使用cmap='coolwarm'或者自定义渐变,比如sns.color_palette("YlOrRd", as_cmap=True)
  • 添加标题与轴标签:用ax.set_title('模型性能热力图', fontsize=14, pad=20)、ax.set_xlabel('数据集', fontsize=12)等语句补充说明
  • 调整画布与单元格大小:绘制前用plt.figure(figsize=(8,6))设置画布尺寸,让热力图比例更协调
  • 色标精细化配置:在sns.heatmap中通过cbar_kws调整色标大小、间距、标签,比如cbar_kws={'shrink':0.8, 'pad':0.02, 'label':'性能得分'}
  • 边框与线条优化:设置linecolor='white'区分单元格,或者用ax.spines[['top', 'right']].set_visible(False)隐藏多余边框

整合这些配置的完整示例代码:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame(
    data = {
        'Set_A' : [91, 91, 91, 90, 91, 91, 91],
        'Set_B' : [91, 92, 91, 89, 91, 91, 91],
        'Set_C' : [89, 90, 89, 88, 90, 89, 89],
        'model' : ['SVM', 'RF', 'LR', 'KNN', 'NB', 'MLP', 'LGB'],
    }
)
df = df.set_index('model')

# 设置画布大小
plt.figure(figsize=(8, 6))

# 绘制配置更丰富的热力图
ax = sns.heatmap(
    df,
    cmap='YlOrRd',  # 自定义暖色调映射
    annot=True,
    vmin=85,
    vmax=95,
    linewidths=.5,
    linecolor='white',  # 单元格分隔线颜色
    annot_kws={'size':12, 'weight':'bold'},  # 注释字体样式
    cbar_kws={'shrink':0.8, 'pad':0.02, 'label':'性能得分'}  # 色标配置
)

# 添加标题和轴标签
ax.set_title('各模型在不同数据集上的性能热力图', fontsize=14, pad=20)
ax.set_xlabel('数据集', fontsize=12)
ax.set_ylabel('模型', fontsize=12)

# 设置色标完整刻度
cbar = ax.collections[0].colorbar
cbar.set_ticks(np.arange(85, 96, 1))
cbar.set_ticklabels(np.arange(85, 96, 1))

# 动态调整注释颜色
for text in ax.texts:
    val = float(text.get_text())
    text.set_color('white' if val >= 91 else 'black')

# 隐藏顶部和右侧边框
ax.spines[['top', 'right']].set_visible(False)

plt.tight_layout()  # 自动调整布局,避免元素重叠
plt.show()

内容的提问来源于stack exchange,提问作者Dai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:22:26