当前位置:首页>python>期刊图片复现|Python绘制季节性敏感性分析环形柱状图

期刊图片复现|Python绘制季节性敏感性分析环形柱状图

  • 2026-09-08 10:14:00
期刊图片复现|Python绘制季节性敏感性分析环形柱状图

代码绘制成果展示

论文:Seasonal divergence in the sensitivity of carbon and water fluxes to climate  variability in terrestrial ecosystems
四个环形柱状图分别代表四个生态系统指标:GPP、RE、NEP和ET。每个环形图被划分为四个部分,分别对应春、夏、秋、冬四个季节 。向外延伸的柱子代表正向敏感度,向内延伸的柱子代表负向敏感度 。柱子对应的四个因子分别为:RAD、TA、SWC和VPD。
论文原图
仿图
多种配色

代码解释

第一部分

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

第二部分

颜色库的设置以及配色方案的选择与提取
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: ['#5792AD', '#CC6660', '#EBC06D', '#B0ABA5'],}SCHEME_ID = 58  #使用的配色方案# 获取基础配色列表,如果 ID 不存在则默认使用方案 1base_colors = COLOR_SCHEMES.get(SCHEME_ID, COLOR_SCHEMES[1])

第三部分

刻度尺绘制函数,在主图旁边添加一个刻度尺来标示数值大小。通过 get_position() 获取极坐标子图的实际相对尺寸,利用之前定义的半径参数计算出对应极坐标中特定半径在坐标系中的绝对位置,保证了刻度尺与极坐标图精准对齐。在计算出的坐标位置创建一个极窄的辅助坐标系,去掉了其上、下、右边框以及X轴刻度,只保留左边框作为“刻度尺”,并打上特定的标签值。
# =========================================================================================# ======================================4.刻度尺绘制函数======================================# =========================================================================================def add_scale_bar_accurate(fig, ax_ref):    #获取参考子图在主图中的位置边框    bbox = ax_ref.get_position()    center_y = bbox.y0 + bbox.height / 2  # 计算参考子图的垂直中心点 Y 坐标    #刻度尺轴    ax_scale = fig.add_axes([bar_left, #左                             bar_bottom_y, #下                             0.002, #宽                             bar_height])#高    #Y轴的范围    ax_scale.set_ylim(PLOT_PARAMS['min_val'], PLOT_PARAMS['max_val'])    # 隐藏边框    ax_scale.spines['top'].set_visible(False)    ax_scale.spines['right'].set_visible(False)    ax_scale.spines['bottom'].set_visible(False)    #设置左边框的宽度    ax_scale.spines['left'].set_linewidth(1.2)    #设置左边框的颜色    ax_scale.spines['left'].set_color('black')    #显示的刻度值    ticks = [-1.0, -0.3, 0.4, 1.1]    #Y轴刻度位置    ax_scale.set_yticks(ticks)    #Y轴刻度标签字体大小    ax_scale.set_yticklabels(ticks, fontsize=10)    # 配置刻度线的样式 (长度、宽度、颜色、方向向外)    ax_scale.tick_params(axis='y',#轴                         length=4,#长                         width=1.2,#宽                         colors='black',#颜色                         direction='out')#朝向    #隐藏X轴刻度    ax_scale.set_xticks([])

第四部分

主绘图函数:基础设置与扇区背景绘制,将0度角设置为正北方,并将角度增长方向设为顺时针。在循环里,每90度画一个大扇形作为季节背景,以及在最外圈画一个单独的环用于存放季节文字。
# =========================================================================================# ======================================5.主绘图函数=======================================# =========================================================================================def draw_polar_panel(ax, title, dataset, colors_dict):    baseline = PLOT_PARAMS['baseline']  #获取基准线半径    ax.set_theta_zero_location('N')  #设置极坐标的0度位置    ax.set_theta_direction(-1)  #极坐标的角度增长方向为顺时针    #定义季节顺序列表,4个扇形的顺序    seasons = ['Spring', 'Summer', 'Autumn', 'Winter']    var_labels = ['RAD', 'TA', 'SWC', 'VPD']  #定义每个扇形区内的变量顺序    n_vars = 4  #变量数量    # 每个柱状图的宽度    width = (np.pi / 2) / n_vars * 0.8    #绘制季节背景扇区    ax.bar(x=start_angle + np.pi / 4,  #扇区中心角度               height=PLOT_PARAMS['radius_max'] - baseline,  #从基准线到最大半径               width=np.pi / 2,  #宽度               bottom=baseline,  #底部               color=bg_color,  #填充颜色               edgecolor='none',  #无边框               alpha=1.0,  #透明度               zorder=0)  #图层顺序     #绘制最外层季节文字背景环     ax.bar(x=start_angle + np.pi / 4,  #扇区中心角度               height=PLOT_PARAMS['season_outer'] - PLOT_PARAMS['season_inner'],  #环的高度               width=np.pi / 2,  #宽度               bottom=PLOT_PARAMS['season_inner'],  #底部               color=bg_color,  #填充颜色               edgecolor='none',  #无边框               alpha=1.0,  #透明度               zorder=0)  #图层顺序

第五部分

主绘图函数:绘制柱状图与标签,进行正负值处理,正值的柱子向上延伸,负值柱子向圆心倒挂生长。
        #获取当前季节的数据        vals = dataset.get(season, [0, 0, 0, 0])        #计算该季节内4个变量柱状图的角度位置        angles = np.linspace(start_angle + (np.pi / 2) / (n_vars * 2),  #起始                             start_angle + np.pi / 2 - (np.pi / 2) / (n_vars * 2),  #结束                             n_vars)  #数量            #变量标签的半径位置            label_r = PLOT_PARAMS['radius_max'] - 0.25            #标签的旋转角度            rot = np.degrees(-ang)            #如果文字在左半圆            if 90 < abs(rot) % 360 < 270:                rot += 90            else:                rot = np.degrees(-ang) + 90            #添加标签文字            ax.text(ang,  #角度                    label_r,  #半径                    label,  #文本内容                    rotation=rot,  #旋转角度                    ha='center',  #水平                    va='center',  #垂直                    fontsize=8,  #字体大小                    fontweight='bold',  #加粗                    color='black',#黑色                    zorder=20)  #图层顺序

第六部分

主绘图函数:辅助线、外圈文字与轴格式清理。绘制0值基准线与分割线,界定不同季节的边界。在最外层的环上添加 Spring、Summer 等大标题文字。 移除自带的所有极坐标刻度、网格和最外层黑色圆框。
    theta = np.linspace(0, 2 * np.pi, 200)  #生成角度数组    #绘制基准线/0值线    ax.plot(theta,            [baseline] * 200,            color='grey',            linestyle='--',            linewidth=0.8,            alpha=0.5,            zorder=5)    #添加外圈季节文字    season_labels_pos = {        'Spring': np.pi / 4,  #角度中心        'Summer': 3 * np.pi / 4,  #角度中心        'Autumn': 5 * np.pi / 4,  #角度中心        'Winter': 7 * np.pi / 4  #角度中心    }    #季节文字所在的半径    label_radius = PLOT_PARAMS['season_inner'] + (PLOT_PARAMS['season_outer'] - PLOT_PARAMS['season_inner']) / 2    ax.set_yticklabels([])  #移除径向刻度标签    ax.set_xticklabels([])  #移除角度刻度标签    ax.grid(False)  #关闭默认网格    ax.spines['polar'].set_visible(False)  #隐藏最外层圆圈    ax.set_ylim(0, PLOT_PARAMS['plot_limit'])  #极坐标轴的显示范围    # 子图标题    ax.set_title(title, y=1.02, fontsize=16, fontweight='bold', pad=2)

第七部分

主程序执行:数据的读取以及颜色配置等。
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================if __name__ == '__main__':    DATA_FILE = r"data.xlsx"#文件路径    #输出路径    OUTPUT_FOLDER = r"Chart_Results"    for sheet in sheet_names:        df = pd.read_excel(DATA_FILE, sheet_name=sheet)  #读取指定表        #转为字典格式        sheet_data = {}        target_vars = ['RAD', 'TA', 'SWC', 'VPD']  #变量名        # 遍历每一行        for index, row in df.iterrows():            sheet_data[row['Season']] = row[target_vars].tolist()  #提取该行变量数据并转为列表        all_data_dicts[sheet] = sheet_data  #存入总字典

第八部分

主程序执行:组合图的绘制以及保存
    #创建画布,指定为极坐标投影    fig_comb, axes_comb = plt.subplots(2, 2, figsize=(12, 12), subplot_kw={'projection': 'polar'})    #调整子图之间的间距和边距    plt.subplots_adjust(wspace=0.2,  #水平间距                        hspace=0.2,  #垂直间距                        left=0.1,  #左边距                        right=0.9,  #右边距                        top=0.9,  #上边距                        bottom=0.1)  #下边距    comb_png = os.path.join(OUTPUT_FOLDER, f'Combined_Chart{SCHEME_ID}.png')    comb_pdf = os.path.join(OUTPUT_FOLDER, f'Combined_Chart{SCHEME_ID}.pdf')    fig_comb.savefig(comb_png, dpi=300, bbox_inches='tight')    fig_comb.savefig(comb_pdf, format='pdf', bbox_inches='tight')    print(f"   已保存组合图: {comb_png}")    plt.close(fig_comb)  #关闭图

如何应用到你自己的数据

1.设置配色方案:

SCHEME_ID = 58  #使用的配色方案

2.设置绘图参数:

PLOT_PARAMS = {    'baseline': 1.1,  # 0值所在的圆周半径,基准线    'min_val': -1.0,  #最小值    'max_val': 1.1,  #最大值    'radius_min': 0.1,  #数据最小值对应的极坐标半径    'radius_max': 2.4,  #数据最大值对应的极坐标半径    'season_inner': 2.8,  #季节文字环背景的内圆半径    'season_outer': 3.4,  #季节文字环背景的外圆半径    'plot_limit': 3.5  #整个绘图区域的限制半径}

3.设置扇形区域数据:

seasons = ['Spring', 'Summer', 'Autumn', 'Winter']

4.设置柱子数据:

var_labels = ['RAD', 'TA', 'SWC', 'VPD']

5.设置变量数量:

n_vars = 4  #变量数量

6.设置原始数据的路径:

DATA_FILE = r"data.xlsx"#文件路径

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

OUTPUT_FOLDER = r"Chart_Results"

推荐

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

获取方式

公众号中的所有所有的免费代码都已经下架了,都并入到付费部分里了,付费合集代码和数据的购买通道已经开通,全部合集100元,后续将会持续更新,决定购买请后台私信我,注意只会分享练习数据和代码文件,不会提供答疑服务,代码文件中已经包含了每行代码的完整注释,购买前请确保真的需要!!!

最新文章

随机文章