如何为Seaborn热力图的混淆矩阵添加提示框并实现Matplotlib交互?
嘿,我来帮你搞定这两个关于混淆矩阵交互可视化的问题!下面是具体的实现方案:
一、给Seaborn热力图的混淆矩阵添加工具提示
Seaborn的热力图本身基于Matplotlib绘制,咱们可以借助mplcursors库轻松实现悬停显示工具提示的效果。步骤如下:
- 先安装
mplcursors(如果还没装的话):
pip install mplcursors
- 修改你的代码,添加工具提示逻辑:
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
相关产品推荐
相关产品推荐

