当前位置:首页>python>期刊图片复现|Python绘制带悬浮效果的条形堆叠图

期刊图片复现|Python绘制带悬浮效果的条形堆叠图

  • 2026-10-11 06:12:09
期刊图片复现|Python绘制带悬浮效果的条形堆叠图

代码绘制成果展示

论文:Regional-scale intelligent optimization and topography impact in restoring global precipitation data gaps
论文原图

本期复现一个带有悬浮效果的堆叠条形图。Y轴代表是与目标存在显著相关的因子的数量,X轴是一个两层的分类轴,用于展示不同的地理和时间分区,第二层代表四种不同的气候区域,第一层在每个气候区域内,又按四个季节进行了划分。图例展示了构成堆叠条形图的每个色块所代表的具体地形因子。但是我模仿的时候没有进行相关性分析,而是生成了模拟数据用0和1表示绘制还是不绘制,因为觉得就是进行分析的话可能就写死了,就是没办法用于展示其他分析的数据了,所以用的时候要单独分析,然后设置数据进行绘图。

仿图
多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 1. 库的导入 =========================================# =========================================================================================import matplotlib.pyplot as pltimport numpy as npimport pandas as pdfrom matplotlib.colors import LinearSegmentedColormapimport osplt.rcParams['font.family'] = 'Times New Roman'import matplotlibmatplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42

第二部分

颜色库设置,配色方案的选择
# =========================================================================================# ======================================2.设置颜色库 =========================================# =========================================================================================color_schemes = {    1: {'Elevation': '#C8C8A9'},}selected_scheme = 20  # 设置要使用的配色方案selected_colors = color_schemes[selected_scheme]  # 获取配色方案

第三部分

定义绘图函数
接受接受 5 个参数包含所有数据用于绘制堆叠图, 堆叠的顺序和图例的数据, 颜色, X 轴第一层标注、X 轴第二层标注
# =========================================================================================# ======================================3.绘图函数 =========================================# =========================================================================================def create_and_save_plot(data_dict, order, colors, climate_labels,season_labels):

第四部分

绘图前准备

包括画布设置,x轴的设置,定义用于绘制阴影区域的函数,这是很关键的一步,有了它才能让图面出现悬浮的效果

    # 创建画布    fig, ax = plt.subplots(figsize=(14, 8))    # X轴位置    x_positions = np.arange(len(climate_labels) * len(season_labels))    # 绘制柱子旁边的阴影让柱子看上去像是悬浮在图面上    shadow_offset = 0.03  # 阴影的水平偏移量    shadow_width = 0.6  # 阴影的宽度    shadow_alpha = 0.5  # 阴影的透明度    shadow_cmap = LinearSegmentedColormap.from_list(        "shadow_gradient",  # 渐变色的名字        [(0, 0, 0, shadow_alpha), (0, 0, 0, 0)]  # 定义渐变色    )

第五部分

绘制出阴影的部分

bottom_shadow = np.zeros(len(x_positions))  # 用于记录每个柱子阴影的起始高度    for factor in (order):  # 遍历绘图        values = data_dict[factor]  # 获取当前因子的数据值        for i, (x_pos, height) in enumerate(zip(x_positions, values)):  # 遍历每个柱子的位置和高度            if height > 0:  # 如果高度大于0,才绘制                # 调用前面定义的函数来绘制渐变阴影                gradient_bar(                    ax,  # 指定要在哪个子图上进行绘制                    x=x_pos + shadow_offset,  # X轴起始位置                    y=bottom_shadow[i],  # Y轴起始位置                    width=shadow_width,  # 渐变矩形的宽度                    height=height,  # 渐变矩形的高度                    cmap=shadow_cmap  # 颜色映射                )        bottom_shadow += values  # 更新阴影的底部位置,为下一个因子的阴影做准备

第六部分

绘制堆叠条形图

 for factor in (order):  # 遍历因子绘图        # 绘制条形图        ax.bar(            x_positions,  # X轴位置            values,  # 高度            bottom=bottom_main,  # Y轴起始位置            label=factor,  # 该组条形的名称,用于图例显示            color=colors[factor],  # 填充颜色            width=0.7,  # 宽度            edgecolor='white',  # 边框颜色            linewidth=3,  # 边框的线宽            zorder=2        )        bottom_main += values  # 更新主数据柱子的底部位置,为下一个因子做准备

第七部分

图面细节调整

包括背景的横线设置、x、y轴的刻度标注、标题、图框,分割线的参数的设置,还有绘图结果的保存,注意要记得修改文件的保存地址

    ax.grid(axis='y', linestyle='-', color='gray', alpha=0.6, zorder=0)  # 添加Y轴方向的水平网格线    ax.legend(ncol=4, loc='lower center', bbox_to_anchor=(0.35, 1.05), frameon=False, fontsize=14)  # 设置图例    ax.set_ylabel('Terrain Factor Dimensionality', fontsize=14)  # y轴标题    ax.set_ylim(0, 7)  # y轴范围    ax.set_yticks(np.arange(0, 8, 1))  # y轴刻度标注    ax.set_xticks(x_positions)  # 设置X轴主刻度的位置    ax.set_xticklabels(season_labels * len(climate_labels), fontsize=12,rotation=90)  # 设置X轴主刻度的标注    ax.tick_params(axis='x', which='major', length=0)  # 去掉x轴主刻度线    ax.tick_params(axis='y', length=0)  # 去掉y轴主刻度线    ax.set_xlabel('')  # 不设置x轴标题    # 遍历分组类别    for i, climate in enumerate(climate_labels):        pos = i * len(season_labels) + (len(season_labels) - 1) / 2.0  # 每个分组标注的中心位置        ax.text(pos, -0.8, climate, ha='center', va='top', fontsize=14)  # 添加标注    plt.subplots_adjust(bottom=0.15)  # 调整子图的底部边距,放置显示不全    separator_positions = [i * len(season_labels) - 0.5 for i in range(0, len(climate_labels) + 1)]  # 计算分隔线的位置    ax.set_xticks(separator_positions, minor=True)  # 将这些位置设置为X轴的次刻度    ax.tick_params(axis='x', which='minor', direction='out', length=60, width=1, color='gray')  # 设置分隔线的样式    # 去掉顶部、右侧和左侧的图框    ax.spines['top'].set_visible(False)    ax.spines['right'].set_visible(False)    ax.spines['left'].set_visible(False)    ax.text(-0.05, 1.0, 'f', transform=ax.transAxes, fontsize=20, fontweight='bold', va='top')  # 添加小标题

第八部分

执行部分

主要的修改部分都在这,包括原始数据的保存路径,x轴两层数据的读取,堆叠使用的数据读取

# =========================================================================================# ====================================4.执行部分========================================# =========================================================================================if __name__ == "__main__":    excel_filename = r'data.xlsx'  # 原始数据的路径    df = pd.read_excel(excel_filename, index_col=[0, 1])  # 读取数据    legend_order = list(df.columns)      climates = list(df.index.get_level_values(0).unique())      seasons = list(df.index.get_level_values(1).unique())     data_from_excel = {col: df[col].to_numpy() for col in df.columns}     #调用绘图函数    create_and_save_plot(        data_dict=data_from_excel,          order=legend_order,          colors=selected_colors,          climate_labels=climates,         season_labels=seasons,     )

如何应用?

1.选择你想要使用到的配色方案:

selected_scheme = 20 

2.定义绘图结果的保存路径:

plt.savefig(fr"{selected_scheme}.png", dpi=300, bbox_inches='tight')plt.savefig(fr"{selected_scheme}.pdf", bbox_inches='tight')

3.定义原始数据的输入路径:

excel_filename = r'data.xlsx' 

4.定义x轴第一层的数据:

climates = list(df.index.get_level_values(0).unique())  #x轴第一层

5.定义x轴第二层的数据:

seasons = list(df.index.get_level_values(1).unique())  #x轴第二层

推荐

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

获取方式

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

最新文章

随机文章