瀑布图的一种改进方法
- 2020 年 4 月 8 日
- 筆記
书中有一个瀑布图的示例,我认为这张图有 3 个特点:
(1)标题突出了图表中的重要信息;
(2)关键位置用箭头突出标注出来;
(3)使用不同的柱子,来表示汇总数据和相对数据。

可以看出,税前及付息前收益 -20,刚好等于前面的两个数之和,即:150 – 170,最后的净收益 6,刚好等于 -20 + 18 + 10 – 2 。
我参考上面的瀑布图,用 Python 中的 plotly 库,画出下面这张瀑布图,主要有 2 点变化:
(1)颜色区分:使用绿色代表增加,红色代表减少,蓝色代表汇总;
(2)位置调整:把标题中的一句话,调整到了箭头标注的上方,因为我觉得这样更加直观易懂。

下面开始介绍画图的具体方法。
1. 读取数据
首先,点击文章最上方的蓝字「林骥」进入公众号后台,发送「利润」两个字,可以获得该数据文件的下载链接,把该 Excel 文件保存到本地电脑,与代码文件放在同一个目录中,然后复制下面的 Python 代码,从文件中读取相关数据,并定义画图所需的变量。
# 导入所需的库 import pandas as pd import numpy as np import plotly.graph_objects as go ########## 读取数据 ############### # 从 Excel 文件中读取数据 profit = pd.read_excel('用于画瀑布图的利润表.xlsx') # X 轴标签 x = profit.columns # Y 轴数字 y = profit.iloc[0, :] # 设置为相对值或汇总值 measure = ['relative']*2 + ['total'] + ['relative']*3 + ['total']
2. 开始画图
其次,我们开始利用 Python 中的 plotly 库进行画图。
########## 开始画图 ############### fig = go.Figure(go.Waterfall( x = x, y = y, text = y, measure = measure, # 文本标签放在柱子外面 textposition = "outside", # 设置上升值的颜色 increasing = {"marker": {"color":"#009800"}}, # 设置下降值的颜色 decreasing = {"marker": {"color":"#CC5036"}}, # 设置中间汇总值的颜色 totals = {"marker": {"color":"#00589F"}}, # 设置柱子之间的颜色、宽度、线型 connector = {"line": {"color":"#009800", "width":1, "dash":"dot"}}, # 悬停显示的信息 hoverinfo = 'x+delta', )) # 设置标题 title = 'Acme 装饰品公司 1998 年的利润表(单位:百万美元)'
2. 更新布局
接下来,我们更新标题、箭头、字体、颜色、大小等参数。
# 更新布局 fig.update_layout( # 标题位置和字体大小 title = {'text': title, 'x':0, 'y':0.9, 'xanchor': 'left', 'font':{'size':26}}, # 添加箭头标注 annotations=[dict( # 箭头标注 x=4, y=25, text='没有装饰品部的销售,1998 年我们将面临亏损', font={'size':20}, # 箭头大小 arrowsize=2, arrowhead=2, arrowwidth=3, # 箭头颜色、方向和长度 arrowcolor="#00589F", ax=0, ay=-80 )], # 字体大小 font = {'size':13}, # 隐藏 Y 轴 yaxis = {'visible': False}, # 隐藏颜色坐标线 coloraxis = {'cauto': False}, # 图片背景设置为白色 plot_bgcolor = '#FFFFFF', # 隐藏图例 showlegend = False, # 设置边距 margin = dict(l=20, r=20, t=90, b=20), # 设置图形大小 width = 800, height = 500 ) # 显示图片 fig.show()
最后,在 Jupyter Lab 中运行,就可以得到上面那张瀑布图,请看下面的视频演示。
小结
本文介绍了瀑布的改进方法,给出了完整的 Python 代码,并用视频做了演示,希望能够对你有所启发。
即使是一个简单的图表,我们也可以它当成一个互联网的产品,不断努力升级迭代,精益求精,满足用户的需求。
不要忘了,画图的目的,是为了提高信息传递的效果,我们应该谨记于心。否则的话,可能做出一些很复杂的图表,但是反而容易让人迷失方向。