
代码绘制成果展示



该图展示了一个精美的多目标分类混淆矩阵,通过多维度的视觉直观地呈现了模型的分类性能。
1. 标题与编号定位
图表标题:位于图片正上方居中位置,概括了该图的核心研究主题。
子图编号:左上角的标识 (b) 表明此图是某组多图矩阵的第二个子图。
2. 真实值 vs 预测值
真实类别:矩阵外围顶部横向排列的列标题代表了数据样本的真实类别。包含“Disturbed”与“Un-disturbed”两个类别,分别对应真实的“正类”和“负类”。
预测类别:矩阵左侧纵向排列的行标题则代表了分类模型给出的预测结果,同样包含这两个类别。
3. 核心数据区:
矩阵内部由中心十字虚线划分为四个象限,每个象限结合了定量数据与定性视觉元素,展示了四种基本的预测结果:TP(真正例)、FN(假负例)、FP(假正例)与 TN(真负例)。每个象限内不仅清晰标注了具体的数字百分比,还包含一个以中心十字虚线交叉点为圆心的四分之一扇形。扇形的半径大小与颜色深浅协同映射了对应象限的数值大小。数值越高,扇形面积越大且颜色越饱和。
4. 辅助图例与综合评价指标
颜色条:矩阵右侧配备了一条垂直的渐变颜色条,作为内部扇形颜色深浅的视觉映射图例,准确解读颜色所代表的具体数值区间。
模型性能指标:在混淆矩阵的正下方,结构清晰地列出了三大核心综合评价指标:
Precision(精确率):位于底部左侧的独立矩形框中,评估模型预测为正类的样本中实际为正类的比例。
Recall(召回率):位于底部右侧的独立矩形框中,评估在所有真实的分类样本中,被模型正确找出的比例。
F1-Score(F1分数):横跨最下方的矩形框,作为精确率与召回率的调和平均数,为模型在潜在的数据不平衡情况下提供了单一且全面的性能评价。







代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport matplotlib.pyplot as pltimport matplotlib.colors as mcolorsfrom matplotlib.patches import Wedge, Rectanglefrom sklearn.model_selection import train_test_split, GridSearchCVfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_scoreimport pandas as pdimport matplotlibmatplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42plt.rcParams['font.family'] = 'serif'plt.rcParams['font.serif'] = ['Times New Roman']plt.rcParams['axes.unicode_minus'] = False

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: ["#eefaeb", "#7ec8cc", "#1571b1", "#002868"],}SCHEME_ID = 60 #选取配色方案colors = COLOR_SCHEMES.get(SCHEME_ID, COLOR_SCHEMES[1]) #获取配色cmap = mcolors.LinearSegmentedColormap.from_list("custom_cmap", colors) #创建平滑过渡的线性渐变色图

第三部分

# =========================================================================================# ======================================4.绘图函数======================================# =========================================================================================def plot_custom_confusion_matrix(metrics):# 创建画布fig, ax = plt.subplots(figsize=(6.5, 8), dpi=150)ax.set_xlim(-0.3, 2.2) #X轴范围ax.set_ylim(-0.5, 2.5) #Y轴范围precision = metrics['precision'] #精确率recall = metrics['recall'] #召回率f1 = metrics['f1'] #F1-Score

第四部分

bg_color = '#f2f2f2' #侧边/底部标签背景色line_color = 'black' #边框线颜色lw_thick = 1.5 #框线粗细lw_thin = 1.0 #内部分割线粗细ax.add_patch(Rectangle((1, 2), 1, 0.25, facecolor=bg_color, edgecolor=line_color, lw=lw_thick, zorder=1))#底部左侧(对应列汇总/指标)背景矩形框ax.add_patch(Rectangle((0, -0.25), 1, 0.25, facecolor=bg_color, edgecolor=line_color, lw=lw_thick, zorder=1))#底部右侧(对应列汇总/指标)背景矩形框ax.add_patch(Rectangle((1, -0.25), 1, 0.25, facecolor=bg_color, edgecolor=line_color, lw=lw_thick, zorder=1))#最底部(用于放置 F1-Score)的背景矩形框ax.add_patch(Rectangle((0, -0.5), 2, 0.25, facecolor=bg_color, edgecolor=line_color, lw=lw_thick, zorder=1))#中心主数据区域背景底图ax.add_patch(Rectangle((0, 0), 2, 2, facecolor='white', edgecolor='none', zorder=1))

第五部分

center = (1, 1) #中心扇形图表的圆心坐标# 代表FN的扇形ax.add_patch(Wedge(center, fn, 0, 90, facecolor=cmap(fn), edgecolor='none', zorder=3))# 代表FP的扇形ax.add_patch(Wedge(center, fp, 180, 270, facecolor=cmap(fp), edgecolor='none', zorder=3))# 代表TN的扇形ax.add_patch(Wedge(center, tn, 270, 360, facecolor=cmap(tn), edgecolor='none', zorder=3))

第六部分

#中心区域的水平十字分割线ax.plot([0, 2], #X[1, 1], #Ycolor='gray', #线条颜色lw=lw_thin, #线宽zorder=4) #图层ax.add_patch(Rectangle((0, 0), #左下角起点2, #宽度2, #高度fill=False, #填充颜色edgecolor=line_color, #边框颜色lw=lw_thick, #边框宽度zorder=5)) #图层

第七部分

#子图编号ax.text(-0.2, #X2.35, #Y'(b)', #文本ha='left', #水平va='center', #垂直fontweight='bold', #加粗fontsize=20) #字体大小#底部左侧精确率指标及数值ax.text(0.5, -0.125, f'Precision={precision * 100:.2f}%', ha='center', va='center', fontweight='bold', fontsize=13)#底部右侧召回率指标及数值ax.text(1.5, -0.125, f'Recall={recall * 100:.2f}%', ha='center', va='center', fontweight='bold', fontsize=13)#最下方F1-Score 及数值ax.text(1.0, -0.375, f'F1-Score={f1 * 100:.2f}%', ha='center', va='center', fontweight='bold', fontsize=15)

第八部分

#颜色条几何参数cb_x, cb_y, cb_w, cb_h = 2, 0, 0.2, 2#外边框ax.add_patch(Rectangle((cb_x, cb_y), #坐标cb_w, #宽cb_h, #高fill=False, #透明edgecolor=line_color, #边框颜色lw=lw_thick, #边框线宽zorder=2)) #层ax.text(cb_x + cb_w / 2, cb_y + cb_h + 0.05, '100%', ha='center', va='bottom', fontweight='bold', fontsize=14) #上方文本ax.text(cb_x + cb_w / 2, cb_y - 0.05, '0%', ha='center', va='top', fontweight='bold', fontsize=14) #下方文本plt.tight_layout() #自动调整子图参数

第九部分

# =========================================================================================# ======================================4.执行部分=====================================# =========================================================================================if __name__ == '__main__':excel_path = r"data.xlsx" #原始文件路径df_data = pd.read_excel(excel_path) #读取数据X = df_data.iloc[:, :-1].values #Xy = df_data.iloc[:, -1].values #y#划分数据X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)#参数网格字典param_grid = {'n_estimators': [50, 100, 200],}#实例化GridSearchCV对象grid_search = GridSearchCV(estimator=RandomForestClassifier(random_state=42), param_grid=param_grid, cv=5, scoring='f1')grid_search.fit(X_train, y_train) #执行网格搜索拟合best_model = grid_search.best_estimator_ #提取最佳模型print(f"最佳超参数: {grid_search.best_params_}")y_pred = best_model.predict(X_test) #对测试集进行预测#将刚计算出的所有比例和性能指标整合打包metrics = {'TP_perc': TP_perc, 'FP_perc': FP_perc,'FN_perc': FN_perc, 'TN_perc': TN_perc,'precision': precision, 'recall': recall, 'f1': f1}#调用绘图函数plot_custom_confusion_matrix(metrics)

如何应用到你自己的数据

1.设置配色方案:
SCHEME_ID = 60 #选取配色方案2.设置绘图结果的保存地址:
plt.savefig(fr"{SCHEME_ID}.pdf", bbox_inches='tight')3.设置原始数据保存的路径:
excel_path = r"data.xlsx" #原始文件路径4.提取特征变量:
X = df_data.iloc[:, :-1].values #X5.提取目标:
y = df_data.iloc[:, -1].values #y6.划分数据集:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)7.设置模型的超参数网格:
param_grid = { 'n_estimators': [50, 100, 200],}
推荐


获取方式
