
代码绘制成果展示












代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport matplotlib.patches as patchesfrom matplotlib.colors import LinearSegmentedColormapfrom sklearn.model_selection import train_test_split, GridSearchCV

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================color_schemes = {1: {'cat': ['#075697', '#f48120', '#c0628d', '#19a5c8'], 'imp': ['#3b4cc0', '#8b58a7', '#c62b75', '#d41125'],'shap': 'coolwarm'},}

第三部分

# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_feature_importance_ring(features_data, categories_colors, ranks, norm_imps, num_features, shap_dict,fval_dict,imp_colors, shap_cmap, scheme_id):# 创建画布fig = plt.figure(figsize=(15, 15), facecolor='white')# 在画布上添加子图轴ax = fig.add_axes([0.1, # 左0.1, # 下0.8, # 宽0.8], # 高projection='polar') # 极坐标r_cat_in, r_cat_out = 3.0, 4.2 # 内侧第一环(类别环)的内径和外径r_imp_in, r_imp_out = 4.4, 5.8 # 第二环(特征重要性环)的内径和外径r_rank_in, r_rank_out = 6.0, 6.6 # 第三环(排名数字环)的内径和外径r_shap_in, r_shap_out = 6.8, 9.5 # 最外侧区域(SHAP散点图所在区域)的内径和外径

第四部分

r_shap_base = 8.0 # SHAP值为0时的基准线的半径位置r_text = 9.7 # 最外圈特征名称文本的半径位置c_import = LinearSegmentedColormap.from_list('imp', imp_colors) # 根据重要性颜色列表,创建一个线性渐变颜色映射对象# 生成用于绘制基准弧线的角度数组theta_full = np.linspace(0, 1.5 * np.pi, 300)# SHAP=0基准线ax.plot(theta_full, # 角度[r_shap_base] * 300, # 半径color='#8cb369', # 颜色lw=1.2, # 线条宽zorder=1) # 层

第五部分

# 遍历每一个特征及其对应的特征类别for i, (name, cat) in enumerate(features_data):angle = angles[i] # 当前特征对应的中心极角位置# 绘制特征类别环柱状图ax.bar(angle, # 角r_cat_out - r_cat_in, # 高度bottom=r_cat_in, # 底部起始半径width=width, # 宽度color=categories_colors[cat], # 颜色edgecolor='black', # 边框色lw=0.5, # 边框线宽zorder=2) # 层deg = np.rad2deg(angle) # 将极角从弧度格式转换为角度度数格式rot_text = 90 - deg if deg <= 180 else 270 - deg # 根据文字所处半圆位置动态设置旋转角度halign = 'left' if deg <= 180 else 'right' # 根据文字所处左右半部分,设置水平对齐方式# 排名环中文本ax.text(angle, # 角(r_rank_in + r_rank_out) / 2, # 半径str(ranks[i]), # 文本ha='center', # 水平va='center', # 垂直rotation=rot_text, # 旋转角度fontsize=12) # 字体大小

第六部分

# 绘制SHAP散点的空白环形边框ax.bar(angle, # 角度r_shap_out - r_shap_in, # 边框高度bottom=r_shap_in, # 起始底部位置width=width, # 宽color='none', # 填充色edgecolor='black', # 边框色lw=0.5, # 线宽zorder=3) # 层# 各个特征的名字ax.text(angle, # 角度r_text, # 半径name, # 文本ha=halign, # 水平va='center', # 垂直rotation=rot_text, # 旋转角度rotation_mode='anchor', # 以文本锚点作为旋转的中心点fontsize=14, # 字体大小color='black') # 颜色

第七部分

ax.set_axis_off() # 隐藏极坐标系自带的背景网格线、刻度和坐标轴边框ax.set_ylim(0, 12) # 设定极坐标系的径向界限pos_min = r_shap_base + (min_shap / max_abs_shap) * 1.2 # 最小SHAP值对应的半径位置pos_max = r_shap_base + (max_shap / max_abs_shap) * 1.2 # 最大SHAP值对应的半径位置# 刻度文本标注ax.text(-0.04, # 角度pos_min, # 半径f"{min_shap:.3f}", # 文本ha='right', # 水平va='center', # 垂直fontsize=14) # 大小ax.text(-0.04, # 角度r_shap_base, # 半径'0', # 文本ha='right', # 水平va='center', # 垂直fontsize=14) # 大小ax.text(-0.04, # 角度pos_max, # 半径f"{max_shap:.3f}", # 文本ha='right', # 水平va='center', # 垂直fontsize=14) # 大小

第八部分

#第一个颜色条坐标轴cax1 = fig.add_axes([0.18, # 左0.52, # 下0.02, # 宽0.37]) # 高cb1 = plt.colorbar(plt.cm.ScalarMappable(cmap=shap_cmap), cax=cax1) # 生成颜色条 # 颜色条标题# 第二个颜色条坐标轴cax2 = fig.add_axes([0.25, # 左0.52, # 下0.02, # 宽0.37]) # 高cax2.set_xticks([]) # 去掉横坐标轴上的刻度cax2.set_yticks([]) # 去掉纵坐标轴上的刻度cax2.set_ylabel('Average ranking', fontsize=18) # 标题# 特征标题fig.text(0.12, # x0.525, # y'Factors', # 文本rotation=90, # 竖向fontsize=18, # 大小color='red',va='center') # 垂直

第九部分

# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == '__main__':file_path = r'data.xlsx' # 原始数据路径df = pd.read_excel(file_path) # 读取数据# 切出特征数据cols = [col for col in df.columns if col != 'Target']# 划分数据X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size=0.3, random_state=42)# 归一化scaler = MinMaxScaler()X_train = pd.DataFrame(scaler.fit_transform(X_train), columns=all_feature_names)X_test = pd.DataFrame(scaler.transform(X_test), columns=all_feature_names)X_test_scaled_df = X_test

第十部分

# 参数网格param_grid = {'max_depth': range(2, 11, 1),'n_estimators': range(10, 200, 20),}# 创建XGB模型xgb_model = xgb.XGBRegressor(random_state=42, objective='reg:squarederror')# 配置网格搜索print("=" * 50)print("模型评估结果:")print(f"训练集R2:{r2_train:.3f} | RMSE: {rmse_train:.3f} | MAE: {mae_train:.3f} | MSE: {mse_train:.3f}")print(f"测试集R2:{r2_test:.3f} | RMSE: {rmse_test:.3f} | MAE: {mae_test:.3f} | MSE: {mse_test:.3f}")print("=" * 50)

第十一部分

# =================================================================explainer = shap.TreeExplainer(best_model) # 创建SHAP树解释器shap_values_raw = explainer.shap_values(X_test) # 计算测试集SHAP值importances = np.abs(shap_values_raw).mean(axis=0) # SHAP值取绝对平均值sorted_idx = np.argsort(importances)[::-1] # 特征重要性排序sorted_features = [all_feature_names[i] for i in sorted_idx] # 排序特征# 创建一个字典,将特征名称映射为其重要性排名feature_ranks = {feat: rank + 1 for rank, feat inenumerate(sorted_features)}for i, name in enumerate(all_feature_names):shap_dict[name] = shap_values_raw[:, i] # SHAP值fval_dict[name] = X_test_scaled_df[name].values # 特征值

第十二部分

plot_all = True # 是否批量出图current_scheme = color_schemes[i] # 提取配色方案category_color_map = dict(zip(category_keys, current_scheme['cat'])) # 类别颜色imp_colors = current_scheme['imp'] # 提取重要性渐变色shap_cmap = current_scheme['shap'] # 提取散点图颜色# 绘图plot_feature_importance_ring()target_scheme = 1 # 要使用的配色方案current_scheme = color_schemes[target_scheme] # 提取配色方案category_color_map = dict(zip(category_keys, current_scheme['cat'])) # 类别颜色imp_colors = current_scheme['imp'] # 提取重要性渐变色shap_cmap = current_scheme['shap'] # 提取散点图颜色# 调用绘图函数plot_feature_importance_ring()

如何应用到你自己的数据

1.设置是一次绘制一张图还是一次性绘制出所有配色的图,执行部分:
plot_all = True # 是否批量出图2.设置原始数据文件的路径地址,执行部分:
file_path = r'data.xlsx' # 原始数据路径3.切除不同类别数据,执行部分:
internal_features = cols[0:15]external_features = cols[15:28]firm_features = cols[28:58]macro_features = cols[58:67]
4.定义类别,执行部分:
category_keys = ['Internal stakeholders', 'External stakeholders', 'Firm characteristics', 'Macro environment']5.划分数据,执行部分:
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size=0.3, random_state=42)6.设置模型的超参数网格,执行部分:
param_grid = {'max_depth': range(2, 11, 1),'n_estimators': range(10, 200, 20),}
7.设置绘图结果的保存地址,绘图函数部分:
plt.savefig(fr'feature_importance_ring_{scheme_id}.png', dpi=300, bbox_inches='tight')
推荐


获取方式
