
代码绘制成果展示












代码解释


第一部分

# =========================================================================================# ====================================== 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 = 1print('正在绘制并保存方案:', scheme_id)plot_advanced_forest_chart(df_real, df_flow, scheme_id) # 传入 df_flowprint("单张图表绘制完成!")

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:
df_real = pd.read_excel(r"data.xlsx") 2.设置是否进行批量绘图,执行部分:
plot_all = True3.设置绘图结果保存地址,绘图函数部分:
plt.savefig(fr"scheme_{scheme_id}.png", dpi=400,bbox_inches='tight', facecolor=fig.get_facecolor(), edgecolor='none')
推荐


获取方式
