
代码绘制成果展示












代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_split, GridSearchCVfrom sklearn.metrics import precision_recall_fscore_support

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: {'rf_main': '#3E7E38', 'xgb_main': '#1F618D', 'cb_main': '#8B2525', 'rf_edge': '#8FBC8F', 'xgb_edge': '#85C1E9', 'cb_edge': '#F1948A', 'f1_box': '#C5E0B4', 'rec_box': '#AED6F1', 'prec_box': '#F5C1C1'},}

第三部分

# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_radar_charts(radar_data_dict, scheme_id=1):colors = COLOR_SCHEMES[scheme_id] # 提取配色方案# 创建画布fig, axes = plt.subplots(1, # 行3, # 列figsize=(18, 7), # 尺寸subplot_kw=dict(polar=True)) # 极坐标系N = len(categories) # 总类别,轴线数量angles = [n / float(N) * 2 * np.pi for n in range(N)] #均分360度,计算出每根轴线在极坐标系里的角度angles += angles[:1] #为了让多边形首尾相连形成闭合区域,将第一个角度添加到列表的最末尾# 评价指标所对应的绘制样式(边框色、背景填充色、节点形状)metric_styles = {'Precision': {'line': colors['cb_main'], 'fill': colors['prec_box'], 'marker': '^'},'Recall': {'line': colors['xgb_main'], 'fill': colors['rec_box'], 'marker': '^'},'F1 score': {'line': colors['rf_main'], 'fill': colors['f1_box'], 'marker': '^'}}

第四部分

# 遍历子图对象for i, ax in enumerate(axes.flat):ax.set_theta_offset(np.pi / 2) # 设置雷达图0度指向正上方ax.set_theta_direction(-1) # 顺时针方向ax.set_ylim(0, 1.15) # 径向范围ax.set_xticks(angles[:-1]) # 将各轴线角度设为x轴刻度,排除最后一个用于闭合的重复点ax.set_xticklabels(categories, fontsize=13) # 设置x轴刻度字体大小ax.tick_params(axis='x', pad=10) # x轴刻度标签与雷达图之间的间距ax.set_yticks([]) # 设置径向刻度# labels = ax.set_yticklabels(['0.5', '0.65'], color="black", size=11) #设置径向刻度标签文本ax.set_rlabel_position(0) # 设置径向刻度标签绘制在0度轴线

第五部分

# 遍历绘制每根刻度轴线for j, angle in enumerate(angles[:-1]):# 绘制线ax.plot([angle, angle], # 起点和终点角度[0.2, 1.02], # 径向起点、终点color=arrow_color, # 颜色linewidth=1.5, # 线粗细zorder=1) # 层# 绘制箭头ax.annotate('', # 文本xy=(angle, 1.2), # 角度、径向xytext=(angle, 1.02), # 角度、径向arrowprops=dict(arrowstyle="-|>", # 样式color=arrow_color, # 颜色lw=1.5, # 箭头线条宽度mutation_scale=16), # 缩放倍率annotation_clip=False, # 允许箭头画在子图默认边界外面zorder=1) # 层

第六部分

# 通过外层循环获取数据集名称dataset_name = datasets[i]# 绘制雷达图多边形外框和标记ax.plot(angles, # 角度values, # 径向linewidth=0, # 轮廓线宽度linestyle='-', # 样式label=metric_name, # 图例标签color=style['line'], # 颜色marker=style['marker'], # 节点标记markersize=7, # 标记大小markerfacecolor=style['line'], # 标记填充色markeredgecolor='white', # 标记边缘色zorder=3) # 层# 多边形填充ax.fill(angles, # 角度values, # 径向范围color=style['fill'], # 填充色alpha=0.65, # 透明度zorder=2) # 层

第七部分

# 构成完整圆周度数theta = np.linspace(0, 2 * np.pi, 200)# 0.5处的圆圈ax.plot(theta, # 角度np.full_like(theta, 0.5), # 半径color='white', # 颜色linestyle='--', # 样式linewidth=1.8, # 线宽zorder=4) # 层#边框色alpha=0, #透明度# 子图编号ax.text(-0.1, # x1.15, # yletters[i], # 文本transform=ax.transAxes, # 坐标系fontsize=18, # 字体大小fontweight='bold', # 加粗va='top', # 垂直ha='right') # 水平

第八部分

# 手动创建填充色图例legend_elements_models = [Line2D([0], # 占位[0], # 占位color='w', # 线段颜色marker='s', # 标记点markerfacecolor=colors['rf_main'], # 填充色markeredgecolor=colors['rf_edge'], # 边缘色markersize=14, # 大小label='Random Forest'), # 文字标签Line2D([0], [0], color='w', marker='s', markerfacecolor=colors['xgb_main'], markeredgecolor=colors['xgb_edge'],markersize=14, label='XGBoost'),Line2D([0], [0], color='w', marker='s', markerfacecolor=colors['cb_main'], markeredgecolor=colors['cb_edge'],markersize=14, label='CatBoost')]legend_elements_metrics = [(prec_tri, prec_box),(rec_tri, rec_box),(f1_tri, f1_box)]labels_metrics = ['Precision', 'Recall', 'F1 score'] # 配置图例元素文本handler_map={tuple: HandlerTuple(ndivide=None, pad=0.3)})plt.subplots_adjust(wspace=0.3, bottom=0.22) # 自动调节子图# 保存plt.savefig(fr'radar_charts_scheme_{scheme_id}.png', dpi=300,bbox_inches='tight')plt.savefig(fr'radar_charts_scheme_{scheme_id}.pdf', bbox_inches='tight')plt.close()

第九部分

# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == '__main__':excel_filename = r'simulated_microplastic_data.xlsx' # 原始数据df_main = pd.read_excel(excel_filename) # 读取数据X_main = df_main.drop(columns=['Target_Class']).values # 特征y_main = df_main['Target_Class'].values # 目标# 划分数据X_train, X_test, y_train, y_test = train_test_split(X_main, y_main, test_size=0.2, random_state=42)ind_excel_filename = r'independent_validation_data.xlsx' # 独立验证数据df_ind = pd.read_excel(ind_excel_filename) # 读取X_ind = df_ind.drop(columns=['Target_Class']).values # 特征y_ind = df_ind['Target_Class'].values # 目标

第十部分

GridSearchCV进行交叉验证寻找最佳参数并保存。print("正在训练模型并进行超参数寻优")# 保存筛选出来的带有最佳参数的三个模型best_models = {}# 模型名称model_names = ['Random Forest', 'XGBoost', 'CatBoost']# 超参数网格rf_param = {'n_estimators': [50, 100],'max_depth': [5, 10, None]}# 配置网格搜索cb_grid = GridSearchCV(CatBoostClassifier(random_state=42, verbose=0), cb_param, cv=3, n_jobs=-1)cb_grid.fit(X_train, y_train) # 拟合best_models['CatBoost'] = cb_grid.best_estimator_ # 最佳CatBoost模型

第十一部分

# 需要评估的数据集字典,训练集、测试集和独立验证集evaluation_datasets = {'Training': (X_train, y_train),'Hold-out': (X_test, y_test),'Independent': (X_ind, y_ind)}# 用于存储每个数据集下各模型的性能指标数据radar_data_dict = {'Training': {}, 'Hold-out': {}, 'Independent': {}}# 将三项指标按字典结构存储,以便画图时按指标调用radar_data_dict[dataset_name][name] = {'Precision': precision,'Recall': recall,'F1 score': f1}

如何应用到你自己的数据

1.设置是一次绘制一张图还是一次性绘制出所有配色的图,执行部分:
# 决定是否批量绘制plot_all = True
2.设置模型数据集保存路径,执行部分:
excel_filename = r'simulated_microplastic_data.xlsx' 3.设置外部独立验证数据集的保存路径,执行部分:
ind_excel_filename = r'independent_validation_data.xlsx' # 独立验证数据4.设置目标变量,执行部分:
y_main = df_main['Target_Class'].values # 目标5.设置特征变量,执行部分:
X_main = df_main.drop(columns=['Target_Class']).values # 特征6.设置超参数,执行部分:
rf_param = {'n_estimators': [50, 100],'max_depth': [5, 10, None]}
7.设置绘图结果的保存地址,执行部分:
plt.savefig(fr'radar_charts_scheme_{scheme_id}.png', dpi=300,bbox_inches='tight')
推荐


获取方式
