瀑布图的一种改进方法

     作者:林骥

     来源:林骥

你好,我是林骥。

在「瀑布图有什么用?怎么画?」这篇文章中,我介绍了一种用 Python 画瀑布图的方法。在《麦肯锡方法》这本书中,有关于瀑布图的详细介绍,作者认为瀑布图是一种阐述如何从数字 A 得到数字 B 的极佳方法,它可以描述静态数据(资产负债表、利润表),或者动态数据(时间序列数据、现金流)。

书中有一个瀑布图的示例,我认为这张图有 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 代码,并用视频做了演示,希望能够对你有所启发。

即使是一个简单的图表,我们也可以它当成一个互联网的产品,不断努力升级迭代,精益求精,满足用户的需求。

不要忘了,画图的目的,是为了提高信息传递的效果,我们应该谨记于心。否则的话,可能做出一些很复杂的图表,但是反而容易让人迷失方向。

◆ ◆ ◆  ◆ ◆

长按二维码关注我们
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:


猜你喜欢
● 笑死人不偿命的知乎沙雕问题排行榜● 用Python扒出B站那些“惊为天人”的阿婆主!● 全球股市跳水大战,谁最坑爹!● 上万条数据撕开微博热搜的真相!● 你相信逛B站也能学编程吗?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值