
代码绘制成果展示










代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlib.pyplot as pltimport numpy as npfrom matplotlib.patches import Rectangleimport pandas as pdfrom scipy import statsimport matplotlib

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: {'b1': '#8C8C8C', 'v1': '#D3D3D3', 'b2': '#E06666', 'v2': '#FADBD8', 'm1': '#9B59B6', 'm2': '#154360'},}SCHEME_ID = 60 #要使用的配色方案colors = COLOR_SCHEMES.get(SCHEME_ID, COLOR_SCHEMES[1]) #获取颜色

第三部分

# =========================================================================================# ======================================3.绘图函数======================================# =========================================================================================def draw_raincloud_plot(df):color_grey_box = colors['b1'] #第一组箱线图颜色color_grey_violin = colors['v1'] #第一组小提琴图颜色color_red_box = colors['b2'] #第二组箱线图颜色color_red_violin = colors['v2'] #第二组小提琴图颜色color_method2 = colors['m1'] #标记颜色color_method3 = colors['m2'] #标记颜色#创建网格fig, axes = plt.subplots(1, #行len(keys), #列figsize=(12, 5), #画布大小sharey=True, #共享y轴刻度和范围gridspec_kw={'wspace': 0}) #子图之间的水平宽度间距#如果只有1个子图,将 axes 转换为列表if len(keys) == 1: axes = [axes]

第四部分

#遍历子图对象列表及其对应的索引for i, ax in enumerate(axes):key = keys[i] #获取对应的特征键值data_g = df[f"{key}_Not_heatwave"].dropna().values # 提取数据data_r = df[f"{key}_Under_heatwave"].dropna().values #提取数据#对两组独立样本数据执行 t 检验t_stat, p_val = stats.ttest_ind(data_g,data_r,equal_var=False)#显著性设计if p_val < 0.001:sig_mark = '***'elif p_val < 0.01:sig_mark = '**'elif p_val < 0.05:sig_mark = '*'else:sig_mark = 'ns'#设置边框for spine in ax.spines.values():spine.set_linewidth(BOLD_LINE_WIDTH)#去掉刻度线ax.tick_params(axis='x', length=0)#如果当前的子图不是最左边的第一个子图if i > 0:ax.tick_params(axis='y', length=0, left=False) #去掉y刻度线

第五部分

#绘制箱线图bp = ax.boxplot([data_g, data_r], #数据positions=[-0.15, 0.15], #两个箱体中心位置widths=0.12, #每个箱体的宽度patch_artist=True, #填充颜色showfliers=False, #隐藏离群值数据点medianprops=dict(color='black', linewidth=BOLD_LINE_WIDTH), #中位数横线颜色,粗细boxprops=dict(linewidth=BOLD_LINE_WIDTH), #箱体边框线粗细whiskerprops=dict(linewidth=BOLD_LINE_WIDTH), #上下须线粗细capprops=dict(linewidth=0), #隐藏箱线图两端的水平线zorder=5) #图层顺序bp['boxes'][0].set_facecolor(color_grey_box) #第一个箱体填充颜色bp['boxes'][1].set_facecolor(color_red_box) #第二个箱体填充颜色

第六部分

#水平参考线ax.axhline(0, #ycolor='grey', # 颜色linestyle='dotted', #线型linewidth=3, # 线宽zorder=1)#y网格线ax.grid(axis='y', #y轴color='lightgrey', #网格线颜色linestyle='-', #线型alpha=0.4, # 透明度zorder=0)# 在第一组箱线图的中轴线 x=-0.15 处画一条垂直参考线ax.axvline(-0.15, # 在第一组箱线图的中轴线 x=-0.15 处画一条垂直参考线color='lightgrey', # 颜色设为浅灰linestyle='-', # 实线alpha=0.4, # 透明度 0.4zorder=0)

第七部分

# y轴标题axes[0].set_ylabel('Shapley value', fontsize=28, fontweight='bold')axes[0].set_ylim(-0.38, 0.45) #y轴范围#y轴刻度线样式设置axes[0].tick_params(axis='y', #y 轴length=8, #刻度线长度width=BOLD_LINE_WIDTH, #宽度labelsize=20, #文字大小direction='out') #朝外#调节子图边距fig.subplots_adjust(bottom=0.2, right=0.82, left=0.1)#图编号fig.text(0.02, #x0.95, #y'g', #编号fontsize=28, #字体大小fontweight='bold', #加粗va='top', #垂直ha='left') #水平ax_leg = fig.add_axes([0.83, #x0.35, #y0.15, #宽度0.25]) #高度ax_leg.axis('off') #隐藏所有刻度和边框#图例所需颜色和文字对应关系的列表数据结构legend_data = [(color_grey_box, 'Not heatwave'), #箱体颜色和描述文本(color_red_box, 'Under heatwave') #箱体颜色和描述文本]y_positions = [0.85, 0.35] #图例坐标轴内部上、下两行图例的 y 轴相对高度坐标#遍历y轴坐标列表与图例数据列表进行绘制for y, (color, label) in zip(y_positions, legend_data):#图例色块rect = Rectangle((0.5 - box_width / 2, #xy - box_height / 2), #ybox_width, #宽度box_height, #高度facecolor=color, #颜色edgecolor='black', #边框色linewidth=BOLD_LINE_WIDTH, #边框加粗

第八部分

# =========================================================================================# ======================================4.执行部分======================================# =========================================================================================if __name__ == '__main__':file_path = r'data.xlsx' #文件路径df_data = pd.read_excel(file_path) #读取数据#调用绘图函数draw_raincloud_plot(df_data)

如何应用到你自己的数据

1.设置配色方案:
SCHEME_ID = 60 #要使用的配色方案2.设置绘图结果的保存路径:
plt.savefig(fr'plot_{SCHEME_ID}.png', dpi=300,bbox_inches='tight')3.设置原始数据的路径:
file_path = r'data.xlsx' #文件路径
推荐


获取方式
