当前位置:首页>python>期刊图片复现|Python绘制带有回归拟合图、相对误差散点图及残差分布直方图的模型性能综合评估图

期刊图片复现|Python绘制带有回归拟合图、相对误差散点图及残差分布直方图的模型性能综合评估图

  • 2026-09-08 19:14:55
期刊图片复现|Python绘制带有回归拟合图、相对误差散点图及残差分布直方图的模型性能综合评估图

代码绘制成果展示

论文:Matching metaheuristics to machine learning for concrete drying shrinkage prediction toward cost-effective mix design
论文原图
此图为模型预测性能的综合评估图。图 (a) 的上半部分为预测值与实测值的散点对比图,横轴表示实测数据,纵轴表示预测值,图中使用不同的形状分别代表三个不同来源的数据,对角线的黑色实线代表 1:1 的完美预测,其周围的深灰色和浅灰色阴影带分别直观地标示出 ±10% 和 ±20% 的相对误差边界,右下角的文本框显示了该模型的R2等评估指标;图 (a) 的下半部分为相对误差分布图,横轴与上图一致,纵轴为相对误差百分比,通过散点展示了各个数据点误差的离散情况,并辅以灰色实线和虚线分别划定 ±10% 和 ±20% 的参考基准线。图 (b) 呈现了模型预测残差的统计分布规律,其主体是一个按数据来源分类着色的堆叠直方图,柱体带有由底端向上的渐变效果,横轴为残差值,纵轴为频数;叠加了一条黑色的正态分布拟合平滑曲线,图中央的一条黑色实线垂直参考线代表零残差位置,两侧的灰色虚线则分别指示了正负RMSE的区间范围。
仿图
多种配色

代码解释

第一部分

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

第二部分

设置颜色库
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: ['#E74C3C', '#3B4A6B', '#1C8C85'],}

第三部分

绘图函数:坐标轴轴格式化辅助函数与基础计算
# =========================================================================================# =====================================3.绘图函数=======================================# =========================================================================================def plot_advanced_forest_chart(df_real, scheme_id):    # 分组    unique_sources = df_real['Source'].unique()    selected_hex_colors = COLOR_SCHEMES[scheme_id]  # 配色方案    #动态分配颜色和标记形状    markers = ['s', '^', 'o', 'D', 'v', '<', '>']    #用于存储图例样式    source_styles = {}

第四部分

绘图函数:创建画布与基础布局设置
    # 创建画布    fig = plt.figure(figsize=(14, 7))    # 创建网格    gs_base = gridspec.GridSpec(1,  # 行                                2,  # 列                                width_ratios=[1, 1],  # 比例                                wspace=0.1,  # 宽度间距                                left=0.06,  # 左边距                                right=0.98,  # 右边距                                top=0.95,  # 上边距                                bottom=0.08)  # 下边距    ax_leg = fig.add_subplot(gs_right[0])    ax3 = fig.add_subplot(gs_right[1])

第五部分

绘图函数:绘制回归拟合图的部分
    min_v = min(y_true_all.min(), y_pred_all.min())  # 全局最小值    max_v = max(y_true_all.max(), y_pred_all.max())  # 全局最大值    scatter_handles = []  #散点句柄    scatter_labels = []  #散点标签    # 设置子图编号    ax1.set_title('(a)',  # 文本                  fontsize=14,  # 字号                  fontweight='bold',  # 加粗                  loc='left',  # 水平                  pad=10)  # 边距    ax1.set_xticklabels([])  # 隐藏x轴刻度标签    # 标注到图上    ax1.text(0.95,  # x             bbox=dict(boxstyle='square,pad=0.5',  # 文本框样式                       facecolor='white',  # 背景色                       edgecolor='gray',  # 边框色                       alpha=0.9))  # 透明度

第六部分

绘图函数:绘制左下角的相对误差散点图
    apply_local_format(ax2)  # 格式化残差子图    max_err = 0  # 初始最大误差    err_bound = max(40, max_err * 1.1)  # 设置y轴边界    ax2.set_xlim(dynamic_min, dynamic_max)  # x轴范围    ax2.set_ylim(-err_bound, err_bound)  # y轴范围    # 设置x轴标题    ax2.set_xlabel(r'Measured $\epsilon_{sh}$ ($\mu\epsilon$)',  # 文本                   fontsize=13,  # 字号                   fontweight='bold')  # 加粗    # 设置y轴标题    ax2.set_ylabel('Relative error (%)',  # 文本                   fontsize=13,  # 字号                   fontweight='bold')  # 加粗    # 图例    ax2.legend(loc='upper right',  # 位置               ncol=2,  # 列               frameon=False,  # 无边框               prop={'size': 11})  # 字号属性

第七部分

绘图函数:绘制右上角的图例轴部分
    ax_leg.axis('off')  # 关闭图例坐标轴    # 添加编号    ax_leg.set_title('(b)',  # 文本                     fontsize=14,  # 字号                     fontweight='bold',  # 加粗                     loc='left',  # 水平                     pad=10)  # 标题边距    # 添加右上角图例    ax_leg.legend(handles=[*patch_handles, line_normal],  #句柄                  loc='center',  # 位置居中                  mode="expand",  # 展开                  bbox_to_anchor=(0, 0, 1, 1), ncol=2,  # 图例锚点及列布局                  prop={'size': 11},  # 字号                  edgecolor='gray',  # 边框色                  framealpha=1)  # 透明

第八部分

绘图函数:绘制右下方残差堆叠直方图
    apply_local_format(ax3)  # 格式化子图    # 绘制x=0线    ax3.axvline(0,  # x                color='black',  # 黑色                lw=1.8,  # 线宽                zorder=5)  # 层    # 绘制负RMSE参考线    ax3.axvline(-rmse,  # x                color='gray',  # 灰色                lw=1.5,  # 线宽                ls='--',  # 虚线                zorder=5)  # 层    # 绘制正RMSE参考线    ax3.axvline(rmse,  # x                color='gray',  # 灰色                lw=1.5,  # 线宽                ls='--',  # 虚线                zorder=5)  # 层    ax3.text(rmse + (res_limit * 0.02),  # x             ylim_top,  # y             rf'$+RMSE ({rmse:.0f}\ \mu\epsilon)$',  # 文本             rotation=90,  # 旋转             color='gray',  # 颜色             va='top',  # 垂直

第九部分

执行部分
# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == "__main__":    excel_path = r'data.xlsx'  # 数据路径    df_raw = pd.read_excel(excel_path)  # 读取    X_train = X_train_full.drop(columns=['Source'])  #剔除分组    X_test = X_test_full.drop(columns=['Source'])  #剔除分组    #测试集    df_test = df_raw.loc[X_test.index].copy()    #定义参数网格    param_grid = {        'n_estimators': [50, 100, 150],        'learning_rate': [0.05, 0.1],        'max_depth': [3, 4, 5]    }

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:

excel_path = r'data.xlsx'

2.分离数据,执行部分:

X = df_raw.drop(columns=['Measured', 'Source'])  #xy = df_raw['Measured']  #y

3.划分训练数据和测试数据,执行部分:

#划分数据X_train_full, X_test_full, y_train, y_test = train_test_split(    df_raw.drop(columns=['Measured']),  #x      df_raw['Measured'],  #y      test_size=0.2,  #比例      random_state=42,  #种子      stratify=df_raw['Source']  #分层)  X_train = X_train_full.drop(columns=['Source'])  #剔除分组  X_test = X_test_full.drop(columns=['Source'])  #剔除分组

4.设置参数网格,执行部分:

param_grid = {    'n_estimators': [50, 100, 150],    'learning_rate': [0.05, 0.1],    'max_depth': [3, 4, 5]}

5.设置是否进行批量绘图,执行部分:

plot_all = True

6.提取分组信息,绘图函数部分:

# 分组unique_sources = df_real['Source'].unique()

7.设置绘图结果的保存地址,绘图函数部分:

plt.savefig(fr'Scheme_{scheme_id}.svg',            bbox_inches='tight')

推荐

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

获取方式

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

最新文章

随机文章