书中有一个瀑布图的示例,我认为这张图有 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 代码,并用视频做了演示,希望能够对你有所启发。
即使是一个简单的图表,我们也可以它当成一个互联网的产品,不断努力升级迭代,精益求精,满足用户的需求。
不要忘了,画图的目的,是为了提高信息传递的效果,我们应该谨记于心。否则的话,可能做出一些很复杂的图表,但是反而容易让人迷失方向。