当前位置:首页>python>Python绘制基于动态假设检验的高颜值云雨图

Python绘制基于动态假设检验的高颜值云雨图

  • 2026-10-11 08:21:56
Python绘制基于动态假设检验的高颜值云雨图

代码绘制成果展示

该代码首先读取Excel中的原始数据,并输出基础的描述性统计信息;接着逐一对各个分组执行Shapiro-Wilk正态性检验,并对整体数据进行Levene方差齐性检验,以评估数据分布特征;随后依据这两个前提检验的P值进行判断:若数据同时满足正态分布和方差齐性,则执行单因素方差分析(ANOVA)及Tukey HSD事后两两比较,若任一条件不满足,则切换为Kruskal-Wallis非参数检验及Dunn事后检验;最后将统计结果集成,绘制出云雨图。

X轴代表被比较的三个组。Y轴代表具体指标。图中每个组都由三种不同的图形组合而成,从左到右分别是雨滴、箱体、云朵。散点代表具体样本,点在水平方向上的抖动是为了防止数值相同的点重叠在一起,方便观察样本的密集程度。箱线图箱体代表数据的核心集中区。箱体内部的粗黑平横线代表数据的中位数。上下延伸的竖线为该组数据的最大值、最小值。小提琴图是核密度估计(KDE)曲线展示了数据的概率密度分布,越胖的地方数值区间越集中。文本框展示了选择哪种统计检验方法,Shapiro (min p)正态性检验,Levene p方差齐性检验,Kruskal p克鲁斯卡尔-沃利斯检验。右侧图例明确了颜色映射关系。

多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom scipy.stats import f_oneway, gaussian_kde, shapiro, levenefrom statsmodels.stats.multicomp import pairwise_tukeyhsdfrom matplotlib.patches import Rectangle, Patchimport matplotlib.lines as mlinesfrom itertools import combinationsimport osimport matplotlibmatplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42plt.rcParams['font.family'] = 'Times New Roman'plt.rcParams['font.weight'] = 'bold'plt.rcParams['axes.labelweight'] = 'bold'plt.rcParams['axes.titleweight'] = 'bold'

第二部分

颜色库
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: ['#5ca2fb', '#8ec3a5', '#ff9f9b', '#abe5ea', '#fdf6c2', '#c9cbfd', '#bae8ca', '#02ba6f', '#ff9999', '#99ccff'],}

第三部分

绘图函数:定义绘图函数,提取分组名称,提取配色方案,创建画布。
# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_standalone_raincloud(df_auc, scheme_id, shapiro_p_min, levene_p, anova_p, tukey_results=None):    model_names = df_auc['Model'].unique().tolist()  #读取分组名称    selected_colors = COLOR_SCHEMES.get(scheme_id, COLOR_SCHEMES[1])  # 获取配色方案    palette = dict(zip(model_names, selected_colors))  # 配置颜色    # 创建画布    fig, ax = plt.subplots(figsize=(11, 8))

第四部分

绘图函数:绘制小提琴图和箱线图部分
    # 遍历分组数据    for i, model_name inenumerate(model_names):        y_data = df_auc[df_auc['Model'] == model_name]['AUC'].values  #提取分组对应数据        color = palette.get(model_name, "#CCCCCC")  #提取该组配色        q1, median, q3 = np.percentile(y_data, [25, 50, 75])  #提取分位数值        ax.fill_betweenx(y_eval,  #y                         i,  #x起始                         i + density,  #x结束                         facecolor=color,  #颜色                         alpha=0.6,  #透明度                         zorder=1)  #层        box_width = 0.12  #箱线图箱体宽度        #下须线        ax.vlines(i,  #x                  v_min,  #y底                  q1,  #y顶                  colors='black',  #颜色                  linewidth=3,  #粗细                  zorder=4)  #层        # 上须线        ax.vlines(i,  #x                  q3,  #y底                  v_max,  #y顶                  colors='black',  #颜色                  linewidth=3,  #粗细                  zorder=4)  #层

第五部分

绘图函数:绘制散点图和统计分析结果
        np.random.seed(42)        #生成抖动值        jitter = np.random.uniform(-0.05, 0.05, size=len(y_data))        #绘制散点部分        ax.scatter(np.repeat(i - 0.2, len(y_data)) + jitter,  #x                   y_data,  #y                   color=color,  #颜色                   edgecolor='white',  #点边缘线颜色                   linewidth=1.5,  #边缘线粗细                   s=80,  #大小                   alpha=1,  #透明度                   zorder=3)  #层    #检验信息文本    ax.text(0.05,  #x            0.2,  #y            val_info,  #文本            transform=ax.transAxes,  #坐标系            verticalalignment='top',  #垂直            fontsize=18,  #字体大小            fontweight='bold',  #加粗            bbox=dict(boxstyle='round,pad=0.5',  #文本框样式                      facecolor='white',  #填充色                      alpha=0.6,  #透明度                      edgecolor='gray'))  #边框颜色

第六部分

绘图函数:显著性标注
    #如果存在Tukey事后检验结果    if tukey_results is not None:        #转换为DataFrame格式        tukey_df = pd.DataFrame(data=tukey_results._results_table.data[1:],                                columns=tukey_results._results_table.data[0])        #获取最大值        max_y = df_auc['AUC'].max()        #生成两两组合列表        all_pairs = list(combinations(range(len(model_names)), 2))        #标注线之间的垂直间距        line_step = 0.05                #添加显著性                ax.text((x1 + x2) * .5,  #x                        y_bar + 0.01,  #y                        sig_text,  #文本                        ha='center',  #水平                        va='bottom',  #垂直                        fontsize=20,  #字体大小                        fontweight='bold')  #加粗

第七部分

绘图函数:图面细节调整,图例创建,绘图结果保存
    #设置y轴标题    ax.set_ylabel("AUC", fontsize=20, fontweight='bold')    #配置X轴位置    ax.set_xticks(range(len(model_names)))    #设置x轴刻度标注    ax.set_xticklabels(model_names,  #文本                       rotation=45,  #旋转                       ha='right',  #水平对齐                       fontsize=18,  #字体大小                       fontweight='bold')  #加粗    #保存图例    handles = []    #循环创建图例    for m in model_names:        color_val = palette.get(m, "#CCCCCC")  #获取对应颜色        h = mlines.Line2D([],  #占位                          [],  #占位                          color='black',  #线颜色                          marker='o',  #圆形                          linestyle='',  #线样式                          markersize=14,  #点大小                          markerfacecolor=color_val,  #点填充颜色                          markeredgecolor='white',  #点边缘线颜色                          markeredgewidth=1)  #点边缘线粗细        bg = Patch(facecolor=color_val, alpha=0.3)  #创建一个矩形色块图        handles.append((bg, h))  #组合

第八部分

执行部分:读取数据,进行统计学描述(均值、标准差、分位数)。按组进行Shapiro-Wilk正态性检验,记录最小的P值。进行Levene方差齐性检验。进行One-way ANOVA(单因素方差分析)。进行Tukey HSD事后检验。执行绘图。
# =========================================================================================# ======================================4.主程序执行=======================================# =========================================================================================if __name__ == "__main__":    data_path = r"data.xlsx"  # 原始数据路径    df_auc_data = pd.read_excel(data_path)  # 读取数据    print("---------- 1. 描述性统计 ----------")    print(df_auc_data.groupby('Model')['AUC'].describe())    print("\n---------- 2. 正态性检验----------")    shapiro_ps = []    for model in df_auc_data['Model'].unique():        group_data = df_auc_data[df_auc_data['Model'] == model]['AUC']        stat, p = shapiro(group_data)        shapiro_ps.append(p)        print(f"{model}: p = {p:.4f}")    shapiro_p_min = min(shapiro_ps)    print("\n---------- 3. 方差齐性检验----------")    groups_list = [df_auc_data[df_auc_data['Model'] == g]['AUC'].values for g in df_auc_data['Model'].unique()]    stat_l, p_levene = levene(*groups_list)    print(f"Levene's test: p = {p_levene:.4f}")    stat_a, p_anova = f_oneway(*groups_list)    print(f"\n---------- 4. ANOVA 检验 ----------\np = {p_anova:.4f}")    print("\n---------- 5. Tukey HSD 事后检验 ----------")    tukey = pairwise_tukeyhsd(df_auc_data['AUC'], df_auc_data['Model'])    print(tukey)    #执行绘图    plot_all = True    if plot_all:        for i in COLOR_SCHEMES.keys():            plot_standalone_raincloud(df_auc_data, scheme_id=i, shapiro_p_min=shapiro_p_min, levene_p=p_levene,anova_p=p_anova, tukey_results=tukey)    else:        TARGET_SCHEME = 22        plot_standalone_raincloud(df_auc_data, scheme_id=TARGET_SCHEME, shapiro_p_min=shapiro_p_min, levene_p=p_levene,anova_p=p_anova, tukey_results=tukey)

如何应用到你自己的数据

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

plot_all = True

2.设置原始数据路径,执行部分:

data_path = r"data.xlsx"  # 原始数据路径

3.设置列名称,用于提取数据,执行部分:

('Model')['AUC']

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

output_dir = r"云雨图"

推荐

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

获取方式

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

最新文章

随机文章