当前位置:首页>python>期刊图片复现|Python绘制扇形小提琴图

期刊图片复现|Python绘制扇形小提琴图

  • 2026-10-11 06:11:59
期刊图片复现|Python绘制扇形小提琴图

代码绘制成果展示

论文:Utilized Distributed Optical Fiber Sensor with Spiral-Serpentine Deployment Enabling High-Precision Full-Field Temperature Reconstruction and Thermal Management for Pouch Lithium-Ion Battery
论文原图
仿图
径向小提琴图/扇形小提琴图:此图在极坐标系上展示了多组数据的分布情况。图上最外圈的黑色实线弧从右到左0% 到 100%的数值标注表示的是数据的类别,每个类别对应一个小提琴图,其形状/宽度展示了该类别下数据的概率密度分布,颜色用来区分不同类别。在每个小提琴内部,有三条黑线,其中中间较粗的线代表中位数,上下两条较细的线分别代表25%和75%分位数(即四分位距)。外圈,靠近类别标签的棕色数值代表该类别数据的最大值;在内圈,靠近图表中心的黑色数值则代表该类别数据的中位数。
多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 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 = 20

2.设置绘图结果的保存路径:

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"

推荐

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

获取方式

需要的请后台私信我获取详细信息,注意只会分享练习数据和代码文件,不会提供答疑服务,代码文件中已经包含了每行代码的完整注释!!

最新文章

随机文章