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

如何为Seaborn热力图的混淆矩阵添加提示框并实现Matplotlib交互?

嘿,我来帮你搞定这两个关于混淆矩阵交互可视化的问题!下面是具体的实现方案:

一、给Seaborn热力图的混淆矩阵添加工具提示

Seaborn的热力图本身基于Matplotlib绘制,咱们可以借助mplcursors库轻松实现悬停显示工具提示的效果。步骤如下:

  1. 先安装mplcursors(如果还没装的话):
pip install mplcursors
  1. 修改你的代码,添加工具提示逻辑:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import mplcursors

# 假设你已经有了confusion_mat、pred_spectrum、actual_spectrum这些数据
confusion_mat_df = pd.DataFrame(confusion_mat, columns=pred_spectrum, index=actual_spectrum)

plt.figure(figsize=(7,5))
# 绘制热力图,保存Axes对象用于后续绑定交互
ax = sns.heatmap(confusion_mat_df, annot=True, cmap="Blues")

# 初始化鼠标悬停的cursor
cursor = mplcursors.cursor(ax, hover=True)

# 自定义工具提示内容
@cursor.connect("add")
def on_add(sel):
    # 获取当前悬停单元格的行和列索引
    row_idx, col_idx = sel.target.index
    # 提取对应类别和样本数量
    actual_class = actual_spectrum[row_idx]
    pred_class = pred_spectrum[col_idx]
    count = confusion_mat[row_idx][col_idx]
    # 设置提示文本
    sel.annotation.set_text(
        f"实际类别: {actual_class}\n预测类别: {pred_class}\n样本数量: {count}"
    )
    # 调整提示框样式,提升可读性
    sel.annotation.get_bbox_patch().set(fc="white", alpha=0.9)

plt.show()

这样鼠标悬停在任意单元格上时,就会弹出提示框,显示该单元格对应的实际类别、预测类别和样本数量啦。

二、Matplotlib实现悬停显示对应实例的交互效果

如果想要悬停时展示单元格对应的具体实例,需要提前把每个(实际类别,预测类别)组合对应的实例列表保存好,再在工具提示中调用。具体实现如下:

假设你已经构建了instance_map二维数组,其中instance_map[row_idx][col_idx]存储着对应单元格的所有实例:

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

# 假设你已经有这些数据:
# confusion_mat: 混淆矩阵数组
# pred_spectrum: 预测类别列表
# actual_spectrum: 实际类别列表
# instance_map: 二维数组,每个元素是对应(实际,预测)的实例列表,比如 [[[实例1,实例2], ...], ...]

confusion_mat_df = pd.DataFrame(confusion_mat, columns=pred_spectrum, index=actual_spectrum)

plt.figure(figsize=(7,5))
ax = sns.heatmap(confusion_mat_df, annot=True, cmap="Greens")

cursor = mplcursors.cursor(ax, hover=True)

@cursor.connect("add")
def on_add(sel):
    row_idx, col_idx = sel.target.index
    actual_class = actual_spectrum[row_idx]
    pred_class = pred_spectrum[col_idx]
    instances = instance_map[row_idx][col_idx]
    
    # 构建提示文本:先展示类别信息,再列出实例
    tip_text = f"实际类别: {actual_class}\n预测类别: {pred_class}\n对应实例:\n"
    tip_text += "\n".join([f"- {inst}" for inst in instances[:5]])  # 只显示前5个实例,避免提示框过长
    if len(instances) > 5:
        tip_text += "\n... 还有更多实例未展示"
    
    sel.annotation.set_text(tip_text)
    sel.annotation.get_bbox_patch().set(fc="white", alpha=0.9)
    # 调整提示框宽度,优化显示效果
    sel.annotation.set_width(200)

plt.show()

这里要注意,instance_map需要你根据自己的数据提前构建——比如在生成混淆矩阵时,同步记录每个(真实标签,预测标签)组合对应的样本实例。如果实例数量过多,建议只展示前几个,避免提示框过长影响体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:32:52