当前位置:首页>python>期刊图片复现|Python绘制配对箱线散点图

期刊图片复现|Python绘制配对箱线散点图

  • 2026-09-08 05:26:48
期刊图片复现|Python绘制配对箱线散点图

代码绘制成果展示

论文:Evolutionary characterization of lung  cancer metastasis
论文原图
这张配对样本箱线散点组合图,旨在展示同一组样本在四种不同比较维度下的动态变化与组间统计学差异。图表的纵坐标表示Mean SCNA diversity per patient,横坐标从左至右依次排列着四个分类变量。图中的每一个圆点代表一个独立样本,四组散点分别采用了不同颜色进行区分,底下的箱线图直观反映各组数据的中位数、四分位距等核心分布特征;同时灰色虚线横跨四个组别,将属于同一ID的数据点逐一相连,勾勒出了每一个体在不同状态下的多样性演变轨迹。图表顶部的连线及 P 值标注进一步明确了各组间对比的统计显著性。
仿图
多种配色

代码解释

第一部分

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

第二部分

设置颜色库
# =========================================================================================# ======================================2.颜色库============================================# =========================================================================================COLOR_SCHEMES = {    1: ['#2c5d87', '#00593b', '#21a257', '#0da7b3'],}

第三部分

绘图函数:数据准备与预处理
# =========================================================================================# ======================================3.绘图函数============================================# =========================================================================================def plot_advanced_forest_chart(df, scheme_id, mode='classic'):    colors = COLOR_SCHEMES[scheme_id] #提取配色方案    df_numeric = df.select_dtypes(include=['number']) #筛选出数值列    labels = df_numeric.columns.tolist() #列名,用作X轴标签    data = [df_numeric[col].values for col in labels] #遍历提取每列的数值    data_for_boxplot = [d[~np.isnan(d)] for d in data] #剔除空值    n_cols = len(labels) #计算列数,要比较和展示的组数    n_patients = len(df_numeric) #计算行数,样本总数量

第四部分

绘图函数:画布与坐标轴格式化
    #创建画布    fig, ax = plt.subplots(figsize=(6, 8), dpi=300)    #设置边框    ax.spines['left'].set_linewidth(2)    ax.spines['bottom'].set_linewidth(2)    ax.tick_params(axis='y',  #轴                   which='major',  #主刻度                   length=5,#长度                   width=2,#粗细                   direction='out',#朝外                   labelsize=14)  #大小

第五部分

绘图函数:箱线图部分绘制及配置
    #箱线图    bp = ax.boxplot(data_for_boxplot, #数据                    positions=list(range(n_cols)), #x                    widths=0.6, #宽度                    patch_artist=True, #允许颜色填充或样式修改                    showfliers=False) #异常值    #遍历每一个箱体对象配置样式    for i in range(n_cols):        c = '#b0b0b0' if mode == 'classic' else colors[i] #颜色        bp['caps'][i * 2 + 1].set(color=c, linewidth=2.5) #顶部横线

第六部分

绘图函数:绘制配对样本散点连线
    np.random.seed(42) #随机种子    x_jitter = np.random.uniform(-0.12, 0.12, (n_patients, n_cols)) #点偏移量    #遍历样本    for i in range(n_patients):        #判断绘图样式        if mode == 'classic':            ax.plot(x_coords, #x                    y_coords, #y                    color='gray', #颜色                    linestyle='--', #样式                    alpha=0.5, #配对连线透明度                    zorder=1, #层                    linewidth=1.2) #粗细                lc = LineCollection(segments, #线段集合                                    colors=c_seg[:-1], #颜色                                    linewidths=1.2, #线宽                                    zorder=1) #层                ax.add_collection(lc) #添加道图上

第七部分

绘图函数:绘制样本散点
        #遍历样本点        for j in range(n_cols):            ax.scatter(x_coords[j], #x                       y_coords[j], #y                       color=colors[j], #颜色                       s=80, #大小                       edgecolor='black', #边缘线颜色                       linewidth=1.5, #边缘线粗细                       zorder=3) #层

第八部分

绘图函数:组间差异显著性标注辅助函数
    #显著性辅助函数    def add_stat_annotation(ax, x1, x2, y, p_val):        gap = 0.05 #差异标识横线两端留白        ax.plot([x1 + gap, x2 - gap], #x                [y, y], #y                color='black', #颜色                lw=1.2) #粗细        #两端垂线长度        tick_len = (y_max - y_min) * 0.02        #p值格式化        if p_val < 0.001:            text = "$p < 0.001$"        else:            text = f"{p_val:.3f}"        #标注        ax.text((x1 + x2) / 2, #x                y + (y_max - y_min) * 0.01, #y                text, #文本                ha='center', #水平                va='bottom', #垂直                fontsize=14, #字体大小                )

第九部分

绘图函数:Wilcoxon检验并添加标注
    #极值    y_max = np.max([np.max(d[~np.isnan(d)]) for d in data])    y_min = np.min([np.min(d[~np.isnan(d)]) for d in data])    h_step = (y_max - y_min) * 0.12 #统计线递增阶梯        #提取数据        clean_data_i = data[i]        clean_data_j = data[j]        stat, p_val = wilcoxon(clean_data_i, clean_data_j) #Wilcoxon秩检验        y_annot = y_max + h_step * mult #横线y坐标        add_stat_annotation(ax, i, j, y_annot, p_val) #调用函数绘制

第十部分

执行部分
# =========================================================================================# ======================================4.执行部分============================================# =========================================================================================if __name__ == '__main__':    excel_filename = r"data.xlsx"#原始数据    df_real = pd.read_excel(excel_filename)#读取    #是否批量绘图        selected_hex_colors = COLOR_SCHEMES[scheme_id]        print('正在绘制并保存方案:', scheme_id)        plot_advanced_forest_chart(df_real, scheme_id, mode='colored')        plot_advanced_forest_chart(df_real, scheme_id, mode='classic')

如何应用到你自己的数据

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

df_real = pd.read_excel(r"data.xlsx")

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

plot_all = True

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

plt.savefig(fr"plot_scheme_{scheme_id}_{suffix}.png", format='png', bbox_inches='tight')

推荐

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

获取方式

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

最新文章

随机文章