一文教你如何使用Python绘制瀑布图
作者:快学Python 发布时间:2023-07-10 18:29:28
什么是瀑布图?瀑布图用表达两个数值之间的变化过程,过程值为正的时候,向上加,过程值为负的时候向下减[1]。
今天分享在Python中绘制瀑布图的3种简单方法(使用不同的库)!
前期准备
首先先安装所需的库:
pip install waterfallcharts (注意该库名)
pip install waterfall_ax (注意该库名)
pip install plotly
接着导入要搭配使用的Pandas库和Matplotlib库:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (16, 8)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
准备一些模拟数据,用于后续不同的Python库绘制瀑布图。
df = pd.DataFrame(
data={
"time": ["2021 end", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
"users": [100, 120, 110, 150, 160, 190, 240, 200, 230, 240, 250, 280, 300]
}
)
方法一:waterfall_ax
首先我们使用waterfall_ax
库,它是基于 Matplotlib 来创建灵活的瀑布图。
https://github.com/microsoft/waterfall_ax
from waterfall_ax import WaterfallChart
fig, ax = plt.subplots(1, 1, figsize=(16, 8))
waterfall = WaterfallChart(df["users"].to_list())
wf_ax = waterfall.plot_waterfall(ax=ax, title="人生苦短,快学Python!")
需要注意一点,waterfall_ax
这个库使用的是 Python 列表,所以在上面代码中我们将Pandas的"users"列通过to_list
转为了列表。
此外,我们还可以增加更多的参数,如下所示:
fig, ax = plt.subplots(1, 1, figsize=(16, 8))
waterfall = WaterfallChart(
df["users"].to_list(),
step_names=df["time"].to_list(),
metric_name="# users",
last_step_label="now"
)
wf_ax = waterfall.plot_waterfall(ax=ax, title="人生苦短,快学Python!")
方法二:waterfall_chart
方法二是使用waterfall_chart
库,不过会较上一个方法多一个步骤,即需要加一个包含增量的列[2]。如下所示,我们可以向dataframe中添加一个新列并计算得到增量diff
。
import waterfall_chart
df_1 = df.copy()
df_1["delta"] = df_1["users"].diff().fillna(100)
df_1
在交互式环境中输入如下命令,
waterfall_chart.plot(df_1["time"], df_1["delta"])
运行输出:
waterfall_chart
库同样也可以增加其他参数,本文不再做单独展示。
方法三:plotly
前面的两种方法相对来说比较小众一点,那么方法三用到的plotly
库大家一定都比较熟悉。与waterfall_chart
库一样,在绘制之前也需要多一步进行数据处理。
df_2 = df_1.copy()
df_2["delta_text"] = df_2["delta"].astype(str)
df_2["measure"] = ["absolute"] + (["relative"] * 12)
df_2
在交互式环境中输入如下命令:
fig = go.Figure(
go.Waterfall(
measure=df_2["measure"],
x=df_2["time"],
textposition="outside",
text=df_2["delta_text"],
y=df_2["delta"],
)
)
fig.update_layout(
title="人生苦短,快学Python!",
showlegend=False
)
fig.show()
使用plotly
库有一个非常大的优势,这些图是完全交互的,我们可以放大,也可以通过选项来获取更多信息,如下图所示。
另外,与之前两种方法绘制的图相比,刚刚plotly
库绘制的图少了一个“柱子”显示净/总计。可以这样处理:
total_row = pd.DataFrame(
data={
"time": "now",
"users": 0,
"delta":0,
"delta_text": "",
"measure": "total"
},
index=[0]
)
df_3 = pd.concat([df_2, total_row], ignore_index=True)
用于生成瀑布图的Python代码实际上并未改变,唯一的区别是我们使用的DataFrame增加一个额外行。
fig = go.Figure(
go.Waterfall(
measure=df_3["measure"],
x=df_3["time"],
textposition="outside",
text=df_3["delta_text"],
y=df_3["delta"],
)
)
fig.update_layout(
title="人生苦短,快学Python!",
showlegend=False
)
fig.show()
运行输出:
如果你对使用plotly
绘制瀑布图感兴趣,可以访问链接https://plotly.com/python/waterfall-charts/了解更多。
来源:https://mp.weixin.qq.com/s/hbJywYW8a-qDVELIPZgbxQ


猜你喜欢
- 内部存储格式:世纪、年、月、日、小时、分钟、秒默认格式是:DD-MON-RR。SYSDATE 返回当前的系统时间。SELECT S
- 使用环境:人才网项目中有一个简历保密设置,其中有一个过滤关键词,只有某个企业的公司名中包含有其中的一个关键字,就不显示该份简历,当然,我还没
- 模块:xmllibxmllib 是一个非验证的低级语法分析器。应用程序员使用的 xmllib 可以覆盖 XMLParser 类,并提供处理文
- 表格如下:在Unity读取并调用时的代码:而如果想要查看该数据库中的另一个表,不是直接使用Table[1],而是需要更改SELECT * f
- 以下几种方法来模拟enum:(感觉方法一简单实用)# way1class Directions: up
- 主要使用IE各个阶段实现的一些方法,从中也可以看出IE的发展史。暂时提供到IE4的判定。var isIE = window.ActiveXO
- 元编程,一个听起来特别酷的词,强大的Lisp在这方面是好手,对于Python,尽管没有完善的元编程范式,一些天才的开发者还是创作了很多元编程
- TIPS:没有特殊说明,测试环境均为MySQL8.0,早期版本可能会有更多情况导致索引失效。8.0失效的情况,早期版本也失效;8.0不失效的
- 手动备份1)cmd控制台:mysqldump -uroot -proot 数据库名 [表名1,表名2...] > 文件路径比如:把 d
- 很多朋友想用SQL2000数据库的编程方法,但是却又苦于自己是学ACCESS的,对SQL只是一点点的了解而已,这里我给大家提供以下参考---
- 引言今天给大家推荐的是web应用安全防护方面的一个包:csrf。该包为Go web应用中常见的跨站请求伪造(CSRF)攻击提供预防功能。cs
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 22 - Fx.Elements通过
- 一、汉诺塔问题1. 问题来源问题源于印度的一个古老传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄
- 在python列表中,如果我们想要删除一个或者连续几个元素,可以使用del()方法,在numpy数组,如果想要删除元素,可以使用numpy.
- 函数作用:该函数的作用即按字面意思理解,topk:取数组的前k个元素进行排序。通常该函数返回2个值,第一个值为排序的数组,第二个值为该数组中
- IN为什么慢?在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕。例如:SELECT driver_id FROM driver w
- 在一些不多的数据下载和生成的时候,我们倾向于直接保存为文件,当我们修改某些参数后再一次运行时,之前运行时生成的文件就被覆盖了。为了解决这个问
- 本文实例讲述了Python企业编码生成系统总体系统设计。分享给大家供大家参考,具体如下:一 系统功能结构二 系统主界面三
- 本文介绍在Anaconda环境中,安装Python语言pydot与graphviz两个模块的方法。最近进行随机森林(RF)的树的可视化操作,
- MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1秒钟只能插入10几条