
代码绘制成果展示









代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlib.pyplot as pltimport numpy as npimport pandas as pdimport matplotlib.colors as mcolorsfrom matplotlib.collections import LineCollection

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: {'pre_box': '#848484', 'pre_cloud': '#DCDCDC', 'pre_edge': '#404040', 'post_box': '#D45E60', 'post_cloud': '#FADCD9', 'post_edge': '#8B2323', 'line': '#D45E60'},}scheme_id=26 #要使用的配色方案theme = COLOR_SCHEMES.get(scheme_id, COLOR_SCHEMES[1]) #提取配色方案

第三部分

# =========================================================================================# ======================================3.绘图函数======================================# =========================================================================================def plot_paired_raincloud(pre_data, post_data):#创建画布fig, ax = plt.subplots(figsize=(6.5, 6), dpi=120)color_pre_box = theme['pre_box'] #左侧箱线图和散点的颜色color_pre_cloud = theme['pre_cloud'] #左侧小提琴图的颜色color_pre_edge = theme['pre_edge'] #左侧散点边缘的颜色color_post_box = theme['post_box'] #右侧箱线图和散点的颜色color_post_cloud = theme['post_cloud'] #右侧小提琴图的颜色color_post_edge = theme['post_edge'] #右侧散点边缘的颜色

第四部分

#绘制左侧小提琴图v1 = ax.violinplot(pre_data, positions=[pos_pre_v], showextrema=False)# 绘制右侧小提琴图v2 = ax.violinplot(post_data, positions=[pos_post_v], showextrema=False)#遍历右侧小提琴图的多边形填充实体for b in v2['bodies']:b.get_paths()[0].vertices[:, 0] = np.clip(b.get_paths()[0].vertices[:, 0], pos_post_v, np.inf) #裁剪小提琴图的左半边b.set_facecolor(color_post_cloud) #设置填充色b.set_alpha(0.5) #透明度

第五部分

#箱线图中位数线的样式medianprops = dict(color='black', linewidth=2.5)#箱线图须线的样式whiskerprops = dict(color='black', linewidth=2.5)#均值标记的样式meanprops = dict(marker='*', #形状markerfacecolor='white', #内部填充markeredgecolor='black', #边框颜色markersize=14, #大小markeredgewidth=1.5) #边框线宽#左侧箱体的样式boxprops_pre = dict(facecolor=color_pre_box, #填充色color='black', #边框颜色linewidth=2.5) #边框线宽

第六部分

n_samples = len(pre_data) # 计算传入数据列表的样本数量np.random.seed(123) #随机数种子,确保每次运行图表中的抖动散点位置完全一致ax.scatter(jitter_pre, #X坐标pre_data, #Y坐标color=color_pre_box, #填充颜色alpha=0.9, #透明度s=45, #大小zorder=4, #层级edgecolors=color_pre_edge, #边缘轮廓颜色linewidths=1.5) #边缘线条宽度#绘制右侧散点图ax.scatter(jitter_post, #X坐标post_data, #Y坐标color=color_post_box, #填充颜色alpha=0.9, #透明度s=45, #大小zorder=4, #层级edgecolors=color_post_edge, #边缘轮廓颜色linewidths=1.5) #边缘线条宽度

第七部分

# 创建从左侧颜色过渡到右侧颜色的线性渐变色映射表cmap_gradient = mcolors.LinearSegmentedColormap.from_list("grad", [color_pre_box, color_post_box])# 循环遍历所有的样本数据点,用于绘制一一对应的连线for i in range(n_samples):x_vals = np.linspace(jitter_pre[i], jitter_post[i], 50) #在左侧散点X坐标和右侧散点X坐标间等距生成50个插值点# 给这一系列短线段赋予0到1的归一化数值,从而激活并映射渐变色效果lc.set_array(np.linspace(0, 1, len(segments)))#添加到轴中ax.add_collection(lc)

第八部分

ax.set_xticks([pos_pre_b, pos_post_b]) #设置X轴的主刻度位置ax.set_xticklabels(['Before treatment', 'After treatment'], fontsize=20) #x轴标注ax.set_xlim(-0.4, 1.4) #X轴的显示区间ax.set_ylabel('Values', fontsize=20) #Y轴的标题ax.spines['top'].set_visible(False) #隐藏顶部的边框线ax.spines['right'].set_visible(False) #隐藏右侧的边框线ax.spines['bottom'].set_linewidth(2.5) #底部的边框线加粗ax.spines['left'].set_linewidth(2.5) #左侧的边框线加粗

第九部分

# =========================================================================================# ======================================4.执行部分======================================# =========================================================================================if __name__ == '__main__':excel_filename = r'data.xlsx' #原始数据路径df = pd.read_excel(excel_filename) #读取数据data_pre = df['Before treatment'].values #左侧数据data_post = df['After treatment'].values #右侧数据#绘图plot_paired_raincloud(data_pre, data_post)

如何应用到你自己的数据

1.设置配色方案:
scheme_id=26 #要使用的配色方案2.设置x轴标注:
ax.set_xticklabels(['Before treatment', 'After treatment'], fontsize=20) #x轴标注3.设置绘图结果的保存地址:
plt.savefig(fr'paired_raincloud_plot{scheme_id}.png', dpi=300, bbox_inches='tight')4.设置原始数据的文件路径:
excel_filename = r'data.xlsx' #原始数据路径5.读取左侧数据:
data_pre = df['Before treatment'].values #左侧数据6.读取右侧数据:
data_post = df['After treatment'].values #右侧数据
推荐


获取方式
