Matlab和Python实现带百分比颜色多变风格的混淆矩阵绘制
·
Matlab&python绘制混淆矩阵求解绘图,带百分比的混淆矩阵,颜色多变风格多样。
最近在模型评估的时候发现,带百分比的混淆矩阵比纯数字版本直观太多了。今天直接上代码,聊聊Matlab和Python两种实现方案,顺便分享几个配色魔改小技巧。
先说Matlab党怎么玩
官方自带的confusionchart函数其实藏了不少彩蛋。先看基础操作:
% 生成混淆矩阵
C = confusionmat(actual,predicted);
% 画图
figure;
cm = confusionchart(C, class_names);
cm.Title = 'Confusion Matrix (Counts)';
这时候出来的图只有原始数值。想要百分比?手动给每个格子加上标签:
% 转换为百分比
C_percent = C ./ sum(C,2) * 100; % 按行归一化
% 绘制双标签混淆矩阵
figure;
cm = confusionchart(C, class_names, ...
'Title','Confusion Matrix with Percentage',...
'Colormap', parula); % 换色秘籍在这
% 魔改标签内容
textObjs = cm.NodeChildren;
for i = 1:numel(textObjs)
if strcmp(textObjs(i).Type, 'text')
original = str2double(textObjs(i).String);
percent = C_percent(textObjs(i).UserData==1);
textObjs(i).String = sprintf('%.0f\n(%.1f%%)', original, percent);
end
end
这里有个骚操作:通过NodeChildren属性挖出底层Text对象,把数值和百分比拼接显示。配色方案推荐试jet、hsv这类彩虹色系,注意别用默认的淡色系,对比度太低打印容易翻车。
Python选手这边更简单
sklearn+seaborn组合拳直接搞定:
import seaborn as sns
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_true, y_pred)
cm_percent = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] * 100
plt.figure(figsize=(10,8))
ax = sns.heatmap(cm, annot=True, fmt='d',
cmap='RdYlGn', # 红黄绿经典配色
linewidths=0.5,
cbar_kws={'shrink': 0.8})
for i in range(cm.shape[0]):
for j in range(cm.shape[1]):
ax.text(j+0.5, i+0.5,
f"{cm[i,j]}\n({cm_percent[i,j]:.1f}%)",
ha='center', va='center',
color='black' if cm[i,j] < cm.max()/2 else 'white') # 自动反色
重点是这个颜色判断逻辑——当格子底色太深时自动切换文字为白色,避免看不清。想玩点新配色可以试试cubehelix调色板,或者自定义渐变色:
from matplotlib.colors import LinearSegmentedColormap
custom_cmap = LinearSegmentedColormap.from_list(
'diy',
['#FFEEEE', '#FF9999', '#FF4444'] # 粉红渐变
)
最后提醒:混淆矩阵的归一化方向(按行/按列)直接影响百分比计算,医疗领域常用敏感度特异度得按行归一化,分类任务可能用总量归一化,别搞混了。可视化只是工具,背后的统计逻辑才是核心。
(代码测试环境:Matlab R2021a / Python 3.8 + sklearn 1.0.2)

Matlab&python绘制混淆矩阵求解绘图,带百分比的混淆矩阵,颜色多变风格多样。





更多推荐



所有评论(0)