当前位置:首页 > 公众号精选 > AI科技大本营
[导读]作者|黄伟呢来源|数据分析与统计学之美简介瀑布图,由麦肯锡顾问公司所独创的图表类型,因为形似瀑布流水,所以被大家称之为瀑布图(WaterfallPlot),在企业经营分析、财务分析中使用较多,用以表示企业成本的构成、变化等情况。瀑布图本质:堆积柱形图的绘制。瀑布图的绘图原理那么,...



作者|黄伟呢


来源|数据分析与统计学之美


简介

瀑布图,由麦肯锡顾问公司所独创的图表类型,因为形似瀑布流水,所以被大家称之为瀑布图(Waterfall Plot),在企业经营分析、财务分析中使用较多,用以表示企业成本的构成、变化等情况。


瀑布图本质:堆积柱形图的绘制。



瀑布图的绘图原理

那么,如何用Python绘制这样一个瀑布图呢?


很多人不知道如何绘制瀑布图,是由于对瀑布图的绘图原理,不够清楚。


因此,这里先来讲述一下瀑布图的绘图原理。



有这样一份原始数据:



从最开始的销售,经过退货、信用费、回扣、滞纳金、运费,这一系列的操作后,最后肯定还有一个净总量。因此,我们需要添加这样一行。



注意:在瀑布图中,最初的“销售”与最后的“净总量”,都是以坐标轴原点为起点。


瀑布图本身就是要体现这个增减变动过程。因此,这里涉及到一个占位,如图所示:



除了首尾两个字段,都是以原点起步的,中间过程要体现这个波动过程。我特意用不同颜色,为大家圈出了这个占位的高度,但是在瀑布图中,我们并不显示出来。


文章最开始就说了,瀑布图的本质其实就是堆积的柱形图。


为了构造这个占位数据,我们需要对数据进行一定的处理。让首尾字段的数据都为0,中间部分,表示占位高度。



最后,我们利用原始数据与占位高度数据,做一个堆叠的柱形图,就可以展示出这个瀑布效果了。



瀑布图的绘图步骤

现在我就为大家讲解详细的步骤。


1. 导入相关库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


2.  创建数据

index = ['销售','退货','信用费','回扣','滞纳金','运费']
data = {'金额': [350000,-30000,-7500,-25000,95000,-7000]}
df = pd.DataFrame(data=data,index=index)
df


结果如下:



瀑布图的最大问题就是弄清楚,底部堆积的条形图应该是什么。


首先,先求累积和。


df["金额"].cumsum()


结果如下:



原理部分,已经为大家讲述过,瀑布图 = 原始数据 占位数据,堆积而成。


因此,对于占位数据,它的首位数据,我们必须将其变为0.


total = df.sum()["金额"]
df.loc["净总量"] = total
blank = df["金额"].cumsum().shift(1).fillna(0)
blank.loc["净总量"] = total
blank.loc["净总量"] = 0


结果如下



其实,一行Python代码,就可以完成瀑布图的绘制。


df.plot(kind='bar', stacked=True, bottom=blank,legend=None, title="瀑布")

plt.xticks(rotation=60)
plt.ylim(-100000,400000)
plt.grid()


结果如下:



其实,到这里瀑布图的绘制已经结束了。但是,为了是这个增减变动更加清楚,我们可以添加一个阶梯。


# 多添加一个绘图代码
step = blank.reset_index(drop=True).repeat(3).shift(-1)
step[1::3] = np.nan

my_plot = df.plot(kind='bar', stacked=True, bottom=blank,legend=None, title="瀑布图")
my_plot.plot(step.index, step.values,'k')
plt.xticks(rotation=60)
plt.ylim(-100000,400000)
plt.grid()


结果如下:



值得注意的问题

在下面这行代码中,有一个bottom参数。


df.plot(kind='bar', stacked=True, bottom=blank,legend=None, title="瀑布图")


其实该参数,表示的是堆积柱形图的起始点,如果数据为正,则柱子在该起始点之上,如果数据为负,则柱子在该起始点之下。


我们为大家举例说明:


import numpy as np
import matplotlib.pyplot as plt

x = np.arange(5)
a = np.array([10, 15, 20, 15, 5])
b = np.array([5, -20, 7, -25, 9])

plt.bar(x, b, bottom=a, label='b')
plt.grid()
plt.show()


结果如下:



观察上图,我为大家标注好了起始点,如果数据为正,柱子都是朝上,否则就朝下。




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭