
代码绘制成果展示










代码解释


第一部分

# =========================================================================================# ====================================== 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, #yi, #x起始i + density, #x结束facecolor=color, #颜色alpha=0.6, #透明度zorder=1) #层box_width = 0.12 #箱线图箱体宽度#下须线ax.vlines(i, #xv_min, #y底q1, #y顶colors='black', #颜色linewidth=3, #粗细zorder=4) #层# 上须线ax.vlines(i, #xq3, #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, #xy_data, #ycolor=color, #颜色edgecolor='white', #点边缘线颜色linewidth=1.5, #边缘线粗细s=80, #大小alpha=1, #透明度zorder=3) #层#检验信息文本ax.text(0.05, #x0.2, #yval_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, #xy_bar + 0.01, #ysig_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)) #组合

第八部分

# =========================================================================================# ======================================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 = Trueif 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 = 22plot_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 = True2.设置原始数据路径,执行部分:
data_path = r"data.xlsx" # 原始数据路径3.设置列名称,用于提取数据,执行部分:
('Model')['AUC']4.设置绘图结果的保存地址,执行部分:
output_dir = r"云雨图"
推荐


获取方式
