当前位置:首页>python>期刊图片复现|Python绘制多分类任务shap蜂巢图+玫瑰图组合图

期刊图片复现|Python绘制多分类任务shap蜂巢图+玫瑰图组合图

  • 2026-10-11 08:26:33
期刊图片复现|Python绘制多分类任务shap蜂巢图+玫瑰图组合图

代码绘制成果展示

论文:Environmental gradients explain nearshore microplastic distribution patterns: insights from machine learning models
论文原图
五个子图a至e分别对应类别0到类别4,Y轴自上而下为按特征重要性排序的各项特征,X轴代表SHAP值的范围,中间的垂直实线为基准线;图上的散点代表各个样本数据,散点在基准线左右的分布位置反映了该特征是对预测结果起正向推力还是负向阻力,而散点颜色表示了该特征原始数值。子图的右下角内嵌了一个玫瑰图,展示了全局排名前十的特征的内部相对比例,角度越大影响越大。右下角一个由五层同心圆嵌套组成的环形图,这五个圆环与上述五个类别一一对应,环内被切分为长短不一的色段,刻画了各个核心特征在该类中的整体贡献权重分布。
仿图
多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlib.pyplot as pltimport numpy as npimport matplotlib.gridspec as gridspecimport shapimport pandas as pd

第二部分

颜色库
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: {        'beeswarm': 'Spectral_r',        'rose': ['#4A1028', '#7B241C', '#A93226', '#CB4335', '#E67E22', '#F5B041', '#F7DC6F', '#76D7C4', '#1F618D', '#2874A6']    },}

第三部分

蜂巢图抖动计算函数,还是之前用的那个不介绍了
# =========================================================================================# ======================================3.蜂巢图抖动计算函数=======================================# =========================================================================================def simple_beeswarm(x_values, nbins=40, width=0.1):    hist_range = (np.min(x_values), np.max(x_values))  #数据的最小值和最大值范围    if hist_range[0] == hist_range[1]:  # 如果最大值等于最小值        hist_range = (hist_range[0] - 0.1, hist_range[1] + 0.1)  #手动扩展范围    counts, edges = np.histogram(x_values, bins=nbins, range=hist_range)  #计算直方图,获取各区间的计数和边界        current_width = (counts[i] / max_count) * width  # 根据当前箱子的密度计算抖动宽度        ys = np.linspace(-current_width, current_width, len(idxs))  # 在宽度范围内生成均匀分布的Y值        np.random.shuffle(ys)  # 打乱Y值顺序        y_values[idxs] = ys  # 将计算好的Y值赋给对应的数据点    return y_values  # 返回计算好的Y轴抖动坐标

第四部分

单幅蜂巢图及玫瑰图绘制函数:定义函数,初始化图表的配色变量,计算输入特征集合在当前类别的SHAP绝对值均值,根据重要性对特征进行排序。归一化特征的原始值,决定散点的颜色深度),计算抖动,绘制散点图。
# =========================================================================================# ======================================4.单幅蜂巢图及玫瑰图绘制函数=======================================# =========================================================================================def plot_shap_beeswarm(ax, features_base, shap_values, feature_values, title, letter, config, top_k_global_inds):    beeswarm_cmap = config['beeswarm'] #蜂巢图颜色    rose_colors = config['rose'] #玫瑰图颜色    n_features = len(features_base) #特征总数    num_colors = len(rose_colors) #玫瑰图特征数        fv_norm = (fv - fv_min) / (fv_max - fv_min) # 将特征值进行Min-Max归一化,缩放到[0, 1]区间以匹配颜色映射条        #调用函数根据SHAP值的密度分布计算Y轴方向的偏移量        y_offset = simple_beeswarm(sv,nbins=100,width=0.25)        #绘制散点        ax.scatter(sv,  #x                   i + y_offset, #y                   c=fv_norm,  #根据归一化后的特征大小来决定颜色                   cmap=beeswarm_cmap, #颜色映射方案                   s=12,  #散点大小                   alpha=1, #透明度                   edgecolors='none') #不绘制边缘线

第五部分

单幅蜂巢图及玫瑰图绘制函数:坐标轴设置、刻度线、刻度标注设置,图上标注文本设置
    #X=0的垂直辅助线    ax.axvline(x=0, #x               color='grey', #颜色               linestyle='-', #样式               linewidth=2,  #粗细               alpha=1) #透明度    ax.set_xlabel('Feature Impact model output (SHAP)', fontsize=20, fontweight='bold') #x轴标题    ax.set_yticks(range(n_features)) #Y轴上为每一个特征刻度    ax.text(-0.1, #x            1.05,  #y            letter,  #编号            transform=ax.transAxes, #坐标系            fontsize=20, #大小            va='top',  #垂直            ha='right',  #水平            fontweight='bold') #加粗    #目标类    ax.text(0.95, #x            0.05,  #y            title,  #文本            transform=ax.transAxes,  #坐标系            fontsize=20,  #字体大小            fontweight='bold', #加粗            ha='right') #水平

第六部分

单幅蜂巢图及玫瑰图绘制函数:内嵌玫瑰图绘制,嵌入一个极坐标系来绘制南丁格尔玫瑰图。首先通过全局重要特征的索引提取它们在该类别下的绝对贡献均值,并转化为百分比。然后循环遍历这几个特征,在极坐标上以动态计算的弧度宽度和向外递增的半径绘制扇形区域,标出其具体的占比数值百分比文本(10特征内部的相对占比)。
    #==================================================================================================================================    #========================================================内嵌玫瑰图============================================================    #==================================================================================================================================    #创建轴    inset_ax = ax.inset_axes([0.6, -0.1, 0.65, 0.65], polar=True)    inset_ax.set_theta_offset(np.pi / 2) #起始角度    inset_ax.set_theta_direction(-1) #系绘图方向    top_k_inds = top_k_global_inds #全局排名前10的特征索引    raw_contributions = mean_abs_shap[top_k_inds] #提取绝对SHAP平均值    contributions = raw_contributions / (raw_contributions.sum() + 1e-8) #百分比归一化            #添加文本            inset_ax.text(current_theta + width_val / 2,  #角度                          radius_val + 4,  #半径                          f"{prob * 100:.1f}%", #文本                          fontsize=13, #字体大小                          ha='center',  #水平                          va='center', #垂直                          fontweight='bold') #加粗        current_theta += width_val #更新起始角度    inset_ax.axis('off') #去掉默认网格线及刻度标签

第七部分

主绘图函数:构建整张组图大画布,初始化颜色;构建网格布局框架;计算跨所有类别的全局特征均值以确定最重要特征;调用子图绘制函数填充前5个网格位置,每个位置对应多分类的其中一类。右下角绘制一个多层同心圆环图,汇总各类别的SHAP占比,将结果导出为PNG和PDF文件。
# =========================================================================================# ======================================5.主绘图函数=======================================# =========================================================================================def generate_shap_plots(shap_values_list, X_eval, features_base, dataset_name, scheme_id):    current_config = COLOR_SCHEMES.get(scheme_id, COLOR_SCHEMES[1]) #提取配色方案    rose_colors = current_config['rose'] #玫瑰图配色    num_colors = len(rose_colors) #获取数量长度    #创建画布    fig = plt.figure(figsize=(17, 14), constrained_layout=True)    #设置布局    gs = gridspec.GridSpec(2,  #行                           3,  #列                           figure=fig, #图表对象                           wspace=0.05, #水平间                           hspace=0.05) #垂直间        #如果是第一张子图        if letters[i] == "a":            ax.text(-0.15,  #x                    1.1,  #y                    "Features",  #文本                    transform=ax.transAxes,  #坐标系                    fontsize=20, #文字大小                    fontweight='bold') #加粗    #右下角子图    ax_f = fig.add_subplot(gs[1, 2])    ax_f.axis('off') #去掉坐标轴线、刻度标签    #圆环图标题    ax_f.text(0.25,  #x              1.35,  #y              f"SHAP summary for diffrent classess\nwith contrubution for CatBoost % ({dataset_name})\nCatboost", #文本              ha='center',  #水平              fontsize=20,  #字体大小              fontweight='bold') #加粗    radius =1.2 #最外层圆环半径    ring_width = 0.14  #圆环厚度                      legend_labels,  #文本                      loc='lower center',  #位置                      bbox_to_anchor=(0.5, -0.72), #精确位置                      ncol=3,  #列                      frameon=False, #去掉边框                      title='Rosechart Feature Contribution %',#图例标题                      handlelength=2,  #长                      handleheight=1.2,  #高                      fontsize=16,  #字体大小。                      title_fontsize=20  #标题的字体大小。                      )

第八部分

执行部分:读取数据,并拆分为训练集、测试集以及单独的验证集。配置CatBoost分类模型,利用GridSearchCV寻找表现最优的超参数。进行模型性能评估。调用SHAP的树解释器为验证集进行分析,批量生成并保存绘图结果。
# =========================================================================================# ======================================7.执行部分=======================================# =========================================================================================if __name__ == "__main__":    df_train_test = pd.read_excel(r'dataset_train_test.xlsx') #模型数据集    df_val = pd.read_excel(r'dataset_validation.xlsx') #独立验证数据    X_train_test = df_train_test.drop(columns=['Target_Class']) #特征数据    y_train_test = df_train_test['Target_Class'] #目标数据    features_base = X_train_test.columns.tolist() #特征名    #划分书记    X_train, X_test, y_train, y_test = train_test_split(X_train_test, y_train_test, test_size=0.3, random_state=42)    X_val = df_val.drop(columns=['Target_Class']) #特征数据    y_val = df_val['Target_Class'] #目标数据    print("网格搜索")    #实例化模型    base_model = CatBoostClassifier(loss_function='MultiClass', verbose=0, random_state=42)    plot_all =True    if plot_all:        for i in COLOR_SCHEMES.keys():            generate_shap_plots(shap_values_val_list, X_val.values, features_base, "Validation_Set", scheme_id=i)    else:        target_scheme = 1        generate_shap_plots(shap_values_val_list, X_val.values, features_base, "Validation_Set",scheme_id=target_scheme)

如何应用到你自己的数据

1.设置是一次绘制一张图还是一次性绘制出所有配色的图,执行部分:

plot_all =True

2.设置模型数据集保存的路径,执行部分:

df_train_test = pd.read_excel(r'dataset_train_test.xlsx') #模型数据集

3.设置独立验证数据集保存的路径,执行部分:

df_val = pd.read_excel(r'dataset_validation.xlsx') #独立验证数据

4.设置目标变量,执行部分:

y_train_test = df_train_test['Target_Class'] #目标数据

5.设置特征变量,执行部分:

X_train_test = df_train_test.drop(columns=['Target_Class']) #特征数据

6.设置超参数,执行部分:

param_grid = {    'iterations': [100, 200, 300],    'learning_rate': [0.01, 0.05, 0.1],    'depth': [4, 6, 8],}

7.设置保存路径,主绘图函数:

plt.savefig(fr'\shap_results_{dataset_name}_scheme{scheme_id}.png', dpi=300, bbox_inches='tight')

推荐

期刊图片复现|Python绘制二维偏依赖PDP图
期刊复现|python绘制基于SHAP分析和GAM模型拟合的单特征依赖图
期刊复现|用Python绘制SHAP特征重要性总览图、依赖图、双特征交互效应SHAP图,解锁XGBoost模型的终极奥秘
期刊图片复现|Python绘制shap重要性蜂巢图+单特征依赖图+交互效应强度气泡图+交互效应依赖图(回归+二分类+分类)

获取方式

公众号中的所有所有的免费代码都已经下架了,都并入到付费部分里了,付费合集代码和数据的购买通道已经开通,全部合集100元,后续将会持续更新,决定购买请后台私信我,注意只会分享练习数据和代码文件,不会提供答疑服务,代码文件中已经包含了每行代码的完整注释,购买前请确保真的需要!!!

最新文章

随机文章