
代码绘制成果展示





代码解释


第一部分

# =========================================================================================# ====================================== 1. 库的导入 =========================================# =========================================================================================import matplotlib.pyplot as pltimport numpy as npimport pandas as pdplt.rcParams['font.family'] = 'serif'plt.rcParams['font.serif'] = ['Times New Roman']plt.rcParams['axes.unicode_minus'] = Falseimport matplotlibmatplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42

第二部分

# =========================================================================================# ====================================== 2.颜色库 =========================================# =========================================================================================color_palettes= {1: {'cmap': plt.cm.viridis_r,#小提琴图颜色'max_val_color': '#c00000', #最大值颜色'median_color': 'black', # 中位数颜色'outer_dash_color': '#c00000', # 外部虚线颜色'inner_dash_color': '#0000FF', # 内部虚线颜色},}selected_palette = 20#选择配色方案selected_scheme = color_palettes.get(selected_palette, color_palettes[1])#从颜色库中提取配色

第三部分

# =========================================================================================# ====================================== 3.数据读取辅助函数 =========================================# =========================================================================================def load_data_from_excel(filename):df = pd.read_excel(filename) #读取文件categories = df.columns.tolist() #获取所有列名data_raw = [] #用于存储原始数据for col in categories: #循环遍历每一个类别col_data = df[col].dropna().values #选择该列,移除空值data_raw.append(col_data) #将处理后的列数据添加到列表中return data_raw, categories #返回包含所有列数据的列表和类别名称列表

第四部分

# =========================================================================================# ====================================== 4.绘图函数 =========================================# =========================================================================================def draw_radial_violin_plot(data_raw, categories, color_scheme):# ---数据预处理---medians = [np.median(d) for d in data_raw] #计算每个数据数组的中位数max_vals = [np.max(d) for d in data_raw] #计算每个数据数组的最大值n_categories = len(categories) # 获取类别的数量# ---提取配色 ---cmap = color_scheme['cmap'] #小提琴图配色max_val_color = color_scheme['max_val_color'] #最大值的颜色median_color = color_scheme['median_color'] #中位数的颜色outer_dash_color = color_scheme['outer_dash_color'] #外部虚线的颜色inner_dash_color = color_scheme['inner_dash_color'] #内部虚线的颜色# --- 绘图前设置 ---#生成n个等间距的角度angles = np.linspace(np.deg2rad(10), np.deg2rad(170), n_categories)#对每个数据数组加上径向偏移量,用于绘图data_plot = [d + 0.012 for d in data_raw]# ---初始化极坐标图 ---fig, ax = plt.subplots(figsize=(12, 7), subplot_kw={'projection': 'polar'})# --- 绘制小提琴图 ---violin_parts = ax.violinplot(data_plot, #使用带偏移量的数据绘图positions=angles, #角度widths=0.2, #小提琴的宽度quantiles=[[0.25, 0.5, 0.75] for _ in range(n_categories)], # 显示四分位数showextrema=False #不显示最大/最小值)# ---格式化坐标轴和标签 ---ax.set_ylim(-0.01, 0.08) # 设置极坐标的径向范围ax.set_rticks([]) #去掉径向的刻度ax.set_yticklabels([]) #去掉径向的刻度标签ax.grid(False) # 关闭极坐标网格ax.set_theta_zero_location('E') #设置 0 度角的位置在东侧ax.set_theta_direction(1) #设置角度方向为逆时针ax.set_thetamin(0) # 设置角度的最小显示范围ax.set_thetamax(360) # 设置角度的最大显示范围ax.set_xticklabels([]) # 移除角度的刻度标签ax.spines['polar'].set_visible(False) # 去掉最外圈的圆形轴线# --- 添加自定义标签 ---ax.text(np.deg2rad(175),0.082,'(a)',ha='center',va='center',fontsize=16,fontweight='bold')# 循环添加类别标注和数值标注for i in range(n_categories): #循环遍历每个类别# 添加类别标签标注ax.text(angle_rad,0.075,categories[i],ha='center',va='center',fontsize=12,fontweight='bold',rotation=rotation_tangential)#添加最大值数值标注ax.text(angle_rad,0.065,f'{max_vals[i]:.3f}',ha='center',va='center',fontsize=9,color=max_val_color,rotation=rotation_tangential)# 添加中位数数值标注ax.text(angle_rad,0.005,f'{medians[i]:.3f}',ha='center',va='center',fontsize=9,color=median_color,rotation=rotation_radial)# --- 添加弧线 ---#生成 100 个点,用于绘制平滑弧线arc_angles = np.linspace(np.deg2rad(10), np.deg2rad(170), 100)#添加最外圈的实线黑色半圆ax.plot(arc_angles, [0.07] * 100, color='black', linestyle='-', linewidth=1.0)#外部虚线,在小提琴尖端外侧ax.plot(arc_angles, [0.06] * 100, color=outer_dash_color, linestyle='--', linewidth=1.5)#内部虚线,在小提琴底部内侧ax.plot(arc_angles, [0.01] * 100, color=inner_dash_color, linestyle='--', linewidth=1.5)#添加内部黑色实线半圆,在中位数标签和虚线之间ax.plot(arc_angles, [0.009] * 100, color='black', linestyle='-', linewidth=1.0)

第五部分

# =========================================================================================# ====================================== 5.执行部分=========================================# =========================================================================================if __name__ == "__main__":#原始数据路径EXCEL_FILE_PATH = r"data.xlsx"#调用函数加载数据,获取原始数据和类别raw_data, CATEGORIES = load_data_from_excel(EXCEL_FILE_PATH)#调用绘图函数draw_radial_violin_plot(raw_data,CATEGORIES,selected_scheme)

如何应用?

1.选择你想要使用到的配色方案:
selected_palette = 202.设置绘图结果的保存路径:
plt.savefig(fr"iolin_{selected_palette}.png", dpi=300, bbox_inches='tight')plt.savefig(fr"violin_{selected_palette}.pdf", bbox_inches='tight')
3.设置原始数据的路径:
PATH = r"data.xlsx"
推荐


获取方式
