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

期刊图片复现|Python绘制半圆形径向小提琴图

  • 2026-10-11 06:56:39
期刊图片复现|Python绘制半圆形径向小提琴图

代码绘制成果展示

论文:How Precipitation Timing Asymmetry Restructures Vegetation Phenology in Water‐Limited Ecosystems
论文原图
半圆形径向小提琴图:此图用于展示2001至2022年间西北干旱区四个子区域的年总降水量年际分布情况,以及降水在白天和夜间的具体分配比例。从圆心向外的径向距离代表降水量的绝对数值,而每个小提琴图形的角跨度代表了在特定降水量数值处年降水的相对频率密度。最外侧的紫色小提琴图代表该区域的总平均年降水量,内侧对应的蓝色和橙色小提琴图则分别代表白天和夜间的降水组成。每个小提琴图标注的具体数字代表了该变量的多年平均值,箱线图则用于展示数据的四分位距,反映了降水的年际波动范围。沿着半圆外沿分布的标签指示了四个研究区域:准噶尔盆地荒漠区(JBDA)、天山山区(TM)、塔里木盆地荒漠区(TBDA)和河西走廊荒漠区(HCDA)。
仿图
多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport pandas as pdimport matplotlib.pyplot as plt

第二部分

设置颜色库
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: ['#9b82ba', '#35a7d9', '#f09662'],}

第三部分

绘图函数:计算各类统计指标,并根据极坐标系的特性来映射每个小提琴图的位置、计算极坐标系中的尺寸比例、颜色映射等。
# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_advanced_forest_chart(df, scheme_id):    theta_min_deg = 0 # 最小角度    theta_max_deg = 180 # 最大角度    theta_min_rad = np.deg2rad(theta_min_deg) # 转弧度    theta_max_rad = np.deg2rad(theta_max_deg) # 转弧度    margin = (theta_max_rad - theta_min_rad) / (num_violins + 1) # 计算边距    angles = np.linspace(theta_max_rad - margin, theta_min_rad + margin, num_violins) # 生成角度    angle_map = {tuple(x): ang for x, ang in zip(unique_pairs.values, angles)} # 映射角度    c_total, c_day, c_night = COLOR_SCHEMES[scheme_id] # 获取颜色    color_map = {'Total': c_total, 'Day': c_day, 'Night': c_night} # 映射颜色

第四部分

绘图函数:创建画布,绘制极坐标轴与小提琴、箱线图
    #创建画布    fig = plt.figure(figsize=(12, 7))    ax = fig.add_subplot(111, polar=True) # 添加极坐标子图    ax.set_thetamin(theta_min_deg) # 最小角    ax.set_thetamax(theta_max_deg) # 最大角    ax.set_rorigin(r_origin) # 原点    ax.set_ylim(0, y_limit) # 范围    ax.set_xticks(unique_angles) # X轴刻度    ax.set_xticklabels([]) # 清空X轴标签    ax.tick_params(axis='x', length=0) # 去掉刻度线    ax.set_yticks(y_ticks) # 设置y轴刻度    ax.set_yticklabels([]) # 清空y轴标签    #网格线设置    ax.grid(True, # 开启            color='#ebebeb', # 颜色            linestyle='-', # 线型            linewidth=1.2, # 线宽            zorder=0) # 层    ax.spines['polar'].set_visible(False) # 去掉径向线

第五部分

绘图函数:绘制完全的边框、刻度线等
    theta_arc = np.linspace(theta_min_rad, theta_max_rad, 200) # 生成圆弧点    # 右侧x边框    ax.plot([theta_min_rad, theta_min_rad], # 角度            [0, y_limit], # 半径            color='black', # 颜色            lw=frame_lw, # 线宽            clip_on=False) # 裁剪        ax.text(theta_text, # 角度                r_text_data, # 半径                str(r), # 文本                ha='center', # 水平                va='top', # 垂直                fontsize=12, # 字号                fontweight='bold', # 加粗                color='black', # 颜色                clip_on=False) # 裁剪    ax.text(theta_text_label, # 角度            r_text_label_data, # 半径            "Precipitation(mm)", # 文本            ha='center', # 水平            va='top', # 垂直            fontsize=13, # 字号            fontweight='bold', # 加粗            color='black', # 颜色            clip_on=False) # 裁剪

第六部分

绘图函数:图例设置以及绘图结果的保存
    # 创建图例    legend_elements = [    ]    #添加图例    ax.legend(handles=legend_elements, # 句柄              loc='lower center', # 位置              bbox_to_anchor=(0.5, 0.1), # 坐标              ncol=3, # 列数              frameon=False, # 边框              handlelength=1.5, # 长              handleheight=1.2, # 高              columnspacing=2, # 列距              prop={'weight': 'bold', # 加粗                    'size': 13, # 字号                    })

第七部分

执行部分
# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == '__main__':    excel_filename = r"data.xlsx"    df_real = pd.read_excel(excel_filename) #读取数据    scheme_id = 1    selected_hex_colors = COLOR_SCHEMES[scheme_id]    print('正在绘制并保存方案:', scheme_id)    plot_advanced_forest_chart(df_real, scheme_id)

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:

excel = r"data.xlsx"

2.设置是否要进行批量绘图,执行部分:

plot_all = True

3.设置要使用的数据,绘图函数部分:

df['Mean'] = df.groupby(['Region', 'Category'])['Value'].transform('mean').round(1) # 计算均值unique_pairs = df[['Region', 'Category']].drop_duplicates() #提取唯一组合

4.设置绘图结果的保存地址,绘图函数部分:

plt.savefig(fr"\scheme_{scheme_id}.png", dpi=300, bbox_inches='tight')

往期内容

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

获取方式

公众号中目前包含近300篇代码+数据+参考论文,后续将会持续更新,需要请后台私信我,注意只会分享练习数据、参考论文和代码文件,仅提供有关代码的答疑,不会提供其他答疑服务,代码文件中已经包含了每行代码的完整注释!!!

最新文章

随机文章