介绍
对于绘制某些类型的数据来说,瀑布图是一种十分有用的工具。不足为奇的是,我们可以使用Pandas和matplotlib创建一个可重复的瀑布图。
在往下进行之前,我想先告诉大家我指代的是哪种类型的图表。我将建立一个维基百科文章中描述的2D瀑布图。
这种图表的一个典型的用处是显示开始值和结束值之间起“桥梁”作用的+和-的值。因为这个原因,财务人员有时会将其称为一个桥梁。跟我之前所采用的其他例子相似,这种类型的绘图在Excel中不容易生成,当然肯定有生成它的方法,但是不容易记住。
关于瀑布图需要记住的关键点是:它本质上是一个堆叠在一起的条形图,不过特殊的一点是,它有一个空白底栏,所以顶部栏会“悬浮”在空中。那么,让我们开始吧。
创建图表
首先,执行标准的输入,并确保IPython能显示matplot图。
1 2 3 |
import numpy as np import pandas as pd import matplotlib.pyplot as plt |
1 |
%matplotlib inline |
设置我们想画出瀑布图的数据,并将其加载到数据帧(DataFrame)中。
数据需要以你的起始值开始,但是你需要给出最终的总数。我们将在下面计算它。
1 2 3 |
index = ['sales','returns','credit fees','rebates','late charges','shipping'] data = {'amount': [350000,-30000,-7500,-25000,95000,-7000]} trans = pd.DataFrame(data=data,index=index) |
我使用了IPython中便捷的display函数来更简单地控制我要显示的内容。
1 2 |
from IPython.display import display display(trans) |
瀑布图的最大技巧是计算出底部堆叠条形图的内容。有关这一点,我从stackoverflow上的讨论中学到很多。
首先,我们得到累积和。
1 2 3 4 5 6 7 8 |
display(trans.amount.cumsum()) sales 350000 returns 320000 credit fees 312500 rebates 287500 late charges 382500 shipping 375500 Name: amount, dtype: int64 |
这看起来不错,但我们需要将一个地方的数据转移到右边。
1 2 |
blank=trans.amount.cumsum().shift(1).fillna(0) display(blank) |
1 2 3 4 5 6 7 |
sales 0 returns 350000 credit fees 320000 rebates 312500 late charges 287500 shipping 382500 Name: amount, dtype: float64 |
我们需要向trans和blank数据帧中添加一个净总量。
1 2 3 4 5 |
total = trans.sum().amount trans.loc["net"] = total blank.loc["net"] = total total blank.loc["net"] = total Helvetica, Arial, sans-serif;font-size: 24px;font-style: normal;font-weight: bold;line-height: 36px">介绍
对于绘制某些类型的数据来说,瀑布图是一种十分有用的工具。不足为奇的是,我们可以使用Pandas和matplotlib创建一个可重复的瀑布图。 在往下进行之前,我想先告诉大家我指代的是哪种类型的图表。我将建立一个维基百科文章中描述的2D瀑布图。 这种图表的一个典型的用处是显示开始值和结束值之间起“桥梁”作用的+和-的值。因为这个原因,财务人员有时会将其称为一个桥梁。跟我之前所采用的其他例子相似,这种类型的绘图在Excel中不容易生成,当然肯定有生成它的方法,但是不容易记住。 关于瀑布图需要记住的关键点是:它本质上是一个堆叠在一起的条形图,不过特殊的一点是,它有一个空白底栏,所以顶部栏会“悬浮”在空中。那么,让我们开始吧。 创建图表首先,执行标准的输入,并确保IPython能显示matplot图。
设置我们想画出瀑布图的数据,并将其加载到数据帧(DataFrame)中。 数据需要以你的起始值开始,但是你需要给出最终的总数。我们将在下面计算它。
我使用了IPython中便捷的display函数来更简单地控制我要显示的内容。
瀑布图的最大技巧是计算出底部堆叠条形图的内容。有关这一点,我从stackoverflow上的讨论中学到很多。 首先,我们得到累积和。
这看起来不错,但我们需要将一个地方的数据转移到右边。
我们需要向trans和blank数据帧中添加一个净总量。
|