当前位置:首页>python>期刊图片复现|Python绘制堆叠柱状图+桑基图组图

期刊图片复现|Python绘制堆叠柱状图+桑基图组图

  • 2026-10-11 06:26:44
期刊图片复现|Python绘制堆叠柱状图+桑基图组图

代码绘制成果展示

论文:Multi-perspective assessment of ecological civilization progress across cities  in the Yangtze River Economic Belt
论文原图
此图为百分比堆叠柱状图+桑基图的组合图表。左侧百分比堆叠柱状图(横坐标为2014–2022年,纵坐标为0–100%),直观展示了9个分类在各年度的结构占比及其宏观演变趋势。右侧桑基图的时间轴与左图严格对齐,通过带有垂直间隙的细长节点柱体表征各分类的年度占比。节点间的彩色连接带动态呈现了相邻年份间各分类数据的流向与转移过程,其宽度精准映射了数据流转量的大小。
仿图
多种配色

代码解释

第一部分

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

第二部分

设置颜色库
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: ["#F4A582", "#FDDBC7", "#E6F5D0", "#F1B6DA", "#92C5DE", "#B2ABD2", "#C7EAE5", "#8073AC", "#FDB863"],}

第三部分

绘图函数:数据准备与画布初始化
# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_advanced_forest_chart(df_data, df_flow, scheme_id):    categories = [col for col in df_data.columns if col != 'Year']  # 提取所有分类列名    # 创建画布    fig = plt.figure(figsize=(16, 6), facecolor="#F2F2F2")    # 添加子图    ax1 = fig.add_subplot(gs[0], facecolor="#F2F2F2")    ax2 = fig.add_subplot(gs[1], facecolor="#F2F2F2")    # 调整布局    plt.subplots_adjust(top=0.88,  # 上                        bottom=0.08,  # 下                        left=0.05,  # 左                        right=0.98)  # 右

第四部分

绘图函数:绘制左侧堆叠柱状图
    bottom_y1 = np.zeros(len(years))  # 初始化堆叠图底部高度    ax1.set_ylim(0, 100)  # y轴范围    ax1.set_xlim(years[0] - 0.6, years[-1] + 0.6)  # x轴范围    # y轴标题    ax1.set_ylabel("Percentage(%)",  # 文本                   fontsize=16,  # 字体大小                   fontweight='bold')  # 加粗    ax1.set_xticks(years)  # x轴刻度位置    ax1.set_xticklabels(years, fontweight='bold')  # x轴刻度样式    # 设置左侧子图的刻度样式    ax1.tick_params(axis='both',  # 轴                    which='major',  # 主刻度                    length=TICK_LENGTH,  # 长                    width=TICK_WIDTH)  # 宽

第五部分

绘图函数:桑基图绘制辅助函数
    # 桑基图条带绘制函数    def draw_ribbon():        ctrl_offset = (x2 - x1) * 0.4  # 贝塞尔曲线控制点        # 条带各顶点的坐标        vertices = [            (x1, y1_bottom),  # 左下点        ]        starts = np.zeros(len(col_data))  # 初始化起点数组        curr = 0  # 记录累计高度        # 遍历列数据        for idx in range(len(col_data)):            starts[idx] = curr  # 记录当前分类起点高度            # 有数据            if active_mask[idx]:                curr += col_data[idx] + gap  # 更新起点位置        return starts

第六部分

绘图函数:绘制桑基图彩色条带
    #遍历每一段相邻年份建立桑基图流动关系    for t in range(len(years) - 1):        S = data_sankey[:, t]  #当前年份数据        for _, row in year_flows.iterrows():            if row['Source'] in categories and row['Target'] in categories:                src_idx = categories.index(row['Source'])  #起点                tgt_idx = categories.index(row['Target'])  #终点                M[src_idx, tgt_idx] = row['Flow_Value'] * scale_factor  #流动量                    current_left_y[i] += val  #更新左侧该分类下一步的起始坐标                    current_right_y[j] += val  #更新右侧该分类下一步的起始坐标

第七部分

绘图函数:绘制桑基图柱子、添加图例、绘图结果保存
    # 遍历所有年份以绘制桑基图节点柱    for t in range(len(years)):    ax2.set_ylim(-2, 106)  #右侧子图Y轴范    ax2.set_xlim(years[0] - 0.1, years[-1] + 0.1)  #右侧子图X轴范围    ax2.set_xticks(years)  #X轴刻度    ax2.set_xticklabels(years, fontweight='bold')  #x轴刻度标注加粗    ax2.set_yticks([])  #去掉y轴刻度标签    #设置边框粗细    for spine in ax2.spines.values():        spine.set_linewidth(FRAME_LINEWIDTH)    #设置轴刻度样式    ax2.tick_params(axis='x',  #轴                    which='major',  #主刻度                    length=TICK_LENGTH,  #长                    width=TICK_WIDTH)  #宽

第八部分

执行部分
# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == "__main__":    df_real = pd.read_excel(r"data.xlsx")  # 读取数据        scheme_id = 1        print('正在绘制并保存方案:', scheme_id)        plot_advanced_forest_chart(df_real, df_flow, scheme_id)  # 传入 df_flow        print("单张图表绘制完成!")

如何应用到你自己的数据

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

df_real = pd.read_excel(r"data.xlsx") 

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

plot_all = True

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

plt.savefig(fr"scheme_{scheme_id}.png", dpi=400,bbox_inches='tight', facecolor=fig.get_facecolor(), edgecolor='none')

推荐

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

获取方式

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

最新文章

随机文章