Matplotlib 瀑布图(Waterfall Chart)讲解 一、什么是瀑布图瀑布图用来展示初始值经过多轮增减之后得到最终值可以直观看到每一项对总量的贡献。特点柱子从前一项的终点开始向上 / 向下延伸正数向上负数向下一般用不同颜色区分增加、减少、总计matplotlib 本身没有内置瀑布图函数需要我们手动计算每个柱子的底部位置来绘制。二、瀑布图Waterfall Chart应用场景1.财务分析利润拆解营业收入 → 减营业成本 → 减各项费用 → 加其他收益 → 减所得税 →净利润一眼看清哪一项侵蚀利润、哪一项带来收益。现金流分析刚才示例期初现金加减经营、投资、融资现金流得到期末现金。预算差异分析目标预算为基数各项超支 / 节约最后得到实际总额。净资产变动期初所有者权益加上净利润、分红、股本变动得到期末净资产。2.业务指标归因分析数据分析 / 运营用来做指标拆解定位增长或下滑原因营收拆解上期营收 → 新增用户收入 老用户复购收入 - 用户流失损失 → 本期营收用户量变化期初用户数 新增用户 - 流失用户 期末用户GMV 拆解基准 GMV 活动增量 - 退款金额 最终 GMV3.项目成本与投资测算项目总投资测算基础造价 设备采购 人工成本 - 补贴 / 优惠 项目总投入投资收益测算初始投入 每年收入 - 运营成本 净收益4.供应链、库存管理库存数量变动期初库存 入库数量 - 出库数量 - 损耗 期末库存。5. 工程 / 制造业工程量、能耗分析能耗基准能耗 新增设备耗能 - 节能改造节省能耗 最终能耗。三、不适合使用瀑布图的场景只想看各部分占整体百分比→ 用饼图不要瀑布图。多组数据对比5 个部门同时做瀑布对比会很乱少量组别可以多了不推荐。分类没有先后加减逻辑只是独立分类不要强行用瀑布图。对比瀑布图 vs 其他图表柱状图直接对比独立类别大小没有 “连续累加” 含义饼图静态构成占比不能表达增减变化过程瀑布图专门表达从初始值逐项加减得到最终结果四、完整代码 逐行讲解pythonimport matplotlib.pyplot as plt import numpy as np # ---------------------- 1. 准备数据 ---------------------- # 标签各项名称 labels [期初, 营收增加, 成本减少, 费用支出, 税收, 期末] # 数值期初是初始基数后面是每一步变化量最后一项为0用来画总计 values [100, 40, 10, -25, -15, 0] # 计算每个柱子的底部基线 base base np.zeros(len(values)) for i in range(1, len(values)-1): base[i] base[i-1] values[i-1] # 最后一个柱子期末总计基线前面所有累加和 base[-1] base[-2] values[-2] values[-1] base[-1] # 总计柱子高度等于最终值 # ---------------------- 2. 设置颜色 ---------------------- colors [] for i, v in enumerate(values): if i 0: colors.append(#1f77b4) # 期初蓝色 elif i len(values)-1: colors.append(#ff7f0e) # 期末总计橙色 elif v 0: colors.append(#2ca02c) # 增加绿色 else: colors.append(#d62728) # 减少红色 # ---------------------- 3. 绘图 ---------------------- plt.figure(figsize(10,6)) bars plt.bar(labels, values, bottombase, colorcolors, edgecolorblack) # 在柱子上方添加数值标签 for bar in bars: height bar.get_height() y_pos bar.get_y() height plt.text(bar.get_x() bar.get_width()/2, y_pos, f{height:.0f}, hacenter, vabottom, fontsize11) # ---------------------- 4. 美化图表 ---------------------- plt.title(瀑布图示例现金流变化, fontsize14) plt.ylabel(金额, fontsize12) plt.grid(axisy, alpha0.3) plt.tight_layout() plt.show()五、核心原理讲解plt.bar(x, height, bottombase)height柱子高度变化量bottom柱子底部的 y 坐标瀑布图的精髓就是不断更新 bottom 基线举个简单逻辑第 0 项期初bottom0柱子从 0 到 100第 1 项营收 40bottom100柱子从 100 向上加到 140第 2 项成本 10bottom140柱子从 140 向上加到 150第 3 项费用 - 25bottom150柱子向下到 125第 4 项税收 - 15bottom125柱子向下到 110最后一项期末bottom0高度 110直接画一根从 0 到 110 的总计柱六、运行结果说明蓝色期初基数绿色正向增加红色负向扣减橙色期末汇总直观对比期初和最终结果七、常见坑忘记计算bottom基线所有柱子都从 y0 开始变成普通柱状图不是瀑布图总计项处理错误总计柱子不能沿用前面的 bottom要从 0 开始画负数标签位置vabottom在负数时会跑到柱子下面可做 if 判断微调文字位置