当前位置:首页>python>Python绘制高颜值森林图

Python绘制高颜值森林图

  • 2026-10-11 08:06:05
Python绘制高颜值森林图

代码绘制成果展示

绘图结果
多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlibimport matplotlib.pyplot as pltimport numpy as npimport pandas as pdimport matplotlib.patches as patchesplt.rcParams['font.family'] = 'serif'plt.rcParams['font.serif'] = ['Times New Roman']plt.rcParams['axes.unicode_minus'] = Falsematplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42

第二部分

设置颜色库
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: ['#f05c6a', '#e27d60', '#f49692', '#cc5c76', '#7b3e55', '#287884', '#f5b067', '#f77c5c', '#4682B4'],}

第三部分

绘图函数:创建画布,子图布局设计
# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_advanced_forest_chart(df, scheme_id):    selected_colors = COLOR_SCHEMES[scheme_id]#提取配色方案    num_rows = len(df)  #获取行    y_pos = np.arange(num_rows, 0, -1)  #创建y轴坐标    #创建画布    fig = plt.figure(figsize=(11.5, 8.5))    #配置画布的网格布局    gs = fig.add_gridspec(1,  #行                          3,  #列                          # 设置3个子图的宽度比例:左侧特征名列宽比为1.8                          width_ratios=[1.8,2.5,2.5],                          wspace=0)  #横向间距    ax_label = fig.add_subplot(gs[0])  #创建左侧子图    ax_forest = fig.add_subplot(gs[1]) #创建中间子图    ax_text = fig.add_subplot(gs[2])   #创建右侧子图    ylim_min, ylim_max = 0.5, num_rows + 1.2  #y轴范围    #遍历子图    for ax in [ax_label, ax_forest, ax_text]:        ax.set_ylim(ylim_min, ylim_max)  #设置y轴范围

第四部分

绘图函数:绘制中间森林图主体
    #绘制森林图垂直线    ax_forest.axvline(x=1.00,          #x                      color='gray',    #颜色                      linestyle='--',  #线型                      linewidth=1.5,   #线宽                      zorder=1)        #层        val_text = str(df['P_Value'].iloc[i])  #P值        is_summary = df.get('Is_Summary', pd.Series([0] * num_rows)).iloc[i]  #汇总行标识        color = selected_colors[i % len(selected_colors)]  #循环取出对应的颜色        #汇总数据        #其他数据        else:            xerr = [[or_v - lower], [upper - or_v]]  #OR值与置信区间上下限的负向和正向误差距离            ax_forest.errorbar(x=or_v,  #x                               y=y,  #y                               xerr=xerr,  #横向误差区间                               fmt='D',  #中心点形状                               color=color,  #误差线颜色                               capsize=5,  #误差线两端帽线长度                               elinewidth=2.5,  #误差线粗细                               capthick=2.5,  #误差线两端帽线粗细                               markersize=9,  #中心标记大小                               zorder=3)  #层

第五部分

绘图函数:主图坐标轴、网格线、表头、边框等细节设置
    ax_forest.set_xlim(0.85, 1.10)  #x轴范围    xticks = [0.85, 0.90, 0.95, 1.00, 1.05, 1.10]  #x轴刻度标注    ax_forest.set_xticks(xticks)  #设置标注    ax_forest.set_xticklabels([f"{val:.2f}" for val in xticks],  #格式化文本                              rotation=45,  #旋转                              ha='right',  #水平                              fontsize=14)  #大小    #网格线    ax_forest.grid(True,  #开启                   axis='both',  #x、y                   color='#e0e0e0',  #颜色                   linestyle='-',  #线型                   linewidth=1,  #粗细                   zorder=0)  #层    #表头    ax_forest.text(0.5,  #x                   1.04,  #y                   'OP',  #文本                   transform=ax_forest.transAxes,  #坐标系                   ha='center',  #水平                   va='center',  #垂直                   color='white',  #文本颜色                   fontsize=16,  #大小                   fontweight='bold')  #加粗    #设置边框粗细    for spine in ax_forest.spines.values():        spine.set_linewidth(1.5)

第六部分

绘图函数:主图左侧的名称标注设置,色块绘制
    ax_label.set_xlim(0, 1)  #x轴范围    ax_label.axis('off')  #去掉左侧坐标轴线、刻度以及背景框    ax_label.text(0.70,  #x                  num_rows + 0.8,  #y                  'Feature',  #文本                  ha='right',  #水平                  va='center',  #垂直                  fontweight='bold',  #加粗                  fontsize=14)  #字体大小        ax_label.text(0.70,  #x                      y, label,  #y                      ha='right',  #水平                      va='center',  #垂直居                      fontsize=15,  #大小                      fontweight=fw)  #样式 #填充色                                 edgecolor='white',  #边框线色                                 linewidth=1.5)  #边框线粗细        ax_label.add_patch(rect)  #添加到图上

第七部分

绘图函数:绘制主图右侧的数据子图
    ax_text.set_xlim(0, 1)  #设置右侧子图的x轴范围    ax_text.axis('off')  #去掉坐标轴线、刻度以及背景框    #文本标题    ax_text.text(0.25,  #x                 num_rows + 0.6,  #y                 'Weight (%)',  #文本                 ha='center',  #水平                 va='center',  #垂直                 fontweight='bold',  #加粗                 fontsize=14)  #大小    ax_text.text(0.75,  #x                 num_rows + 0.6,  #y                 'OR (95% CI)',  #文本                 ha='center',  #水平                 va='center',  #垂直                 fontweight='bold',  #加粗                 fontsize=14)  #大小        #权重文本        ax_text.text(0.25,  #x                     y,  #y                     weight,  #文本                     ha='center',  #水平                     va='center',  #垂直                     fontsize=13,  #字体大小                     fontweight=fw,  #样式                     color=color)  #颜色        #OR值及置信区间文本        ax_text.text(0.75,  #x                     y,  #y                     ci_text,  #文本                     ha='center',  #水平                     va='center',  #垂直                     fontsize=13,  #字体大小                     fontweight=fw,  # 样式                     color=color)  #颜色

第八部分

执行部分
# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == "__main__":    excel_path = r'data.xlsx'  #原始数据    df_real = pd.read_excel(excel_path, dtype={'P_Value': str, 'Weight': str})  #读取数据    else:        scheme_id = 1        print('正在绘制并保存方案:', scheme_id)        plot_advanced_forest_chart(df_real, scheme_id)

如何应用到你自己的数据

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

excel_path = r'data.xlsx'  #原始数据

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

plot_all = True

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

plt.savefig(fr'scheme_{scheme_id}.png', dpi=300, bbox_inches='tight')

推荐

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

获取方式

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

最新文章

随机文章