一文教你如何使用Python绘制瀑布图

作者:快学Python 时间:2023-07-10 18:29:28 

什么是瀑布图?瀑布图用表达两个数值之间的变化过程,过程值为正的时候,向上加,过程值为负的时候向下减[1]。

一文教你如何使用Python绘制瀑布图

今天分享在Python中绘制瀑布图的3种简单方法(使用不同的库)!

一文教你如何使用Python绘制瀑布图

前期准备

首先先安装所需的库:

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!")

一文教你如何使用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!")

一文教你如何使用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

一文教你如何使用Python绘制瀑布图

在交互式环境中输入如下命令,

waterfall_chart.plot(df_1["time"], df_1["delta"])

运行输出:

一文教你如何使用Python绘制瀑布图

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

一文教你如何使用Python绘制瀑布图

在交互式环境中输入如下命令:

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()

一文教你如何使用Python绘制瀑布图

使用plotly库有一个非常大的优势,这些图是完全交互的,我们可以放大,也可以通过选项来获取更多信息,如下图所示。

一文教你如何使用Python绘制瀑布图

另外,与之前两种方法绘制的图相比,刚刚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()

运行输出:

一文教你如何使用Python绘制瀑布图

如果你对使用plotly 绘制瀑布图感兴趣,可以访问链接https://plotly.com/python/waterfall-charts/了解更多。

来源:https://mp.weixin.qq.com/s/hbJywYW8a-qDVELIPZgbxQ

标签:Python,瀑布图
0
投稿

猜你喜欢

  • 详解SQL Server中的事务与锁问题

    2024-01-12 16:26:12
  • zabbix通过percona插件监控mysql的方法

    2024-01-23 04:51:22
  • Python程序慢的重要原因

    2023-10-08 16:17:40
  • Windows下PyMongo下载及安装教程

    2023-09-18 14:52:18
  • 为什么GO不支持循环引用

    2024-02-08 15:10:01
  • python实现简单socket程序在两台电脑之间传输消息的方法

    2021-04-25 21:14:26
  • Pytorch之finetune使用详解

    2021-08-31 20:41:44
  • python实现微信每日一句自动发送给喜欢的人

    2022-10-13 02:09:25
  • vue中el-table格式化el-table-column内容的三种方法

    2024-04-27 16:10:39
  • workerman写mysql连接池的实例代码

    2024-01-20 02:52:26
  • python常用知识梳理(必看篇)

    2021-04-30 07:37:39
  • Python 设计模式中命令模式

    2022-10-14 20:28:36
  • Python flask使用ajax上传文件的示例代码

    2021-06-25 17:40:29
  • python Dataframe 合并与去重详情

    2022-08-17 02:18:54
  • python优化数据预处理方法Pandas pipe详解

    2021-12-27 06:34:51
  • python实现批量转换图片为黑白

    2023-03-14 15:13:11
  • Django如何实现网站注册用户邮箱验证功能

    2023-05-14 08:03:08
  • python实现简单日志记录库glog的使用

    2023-01-07 23:14:40
  • jQuery 让人恋恋不舍的秘密

    2010-01-20 10:09:00
  • haskell实现多线程服务器实例代码

    2021-08-06 00:08:22
  • asp之家 网络编程 m.aspxhome.com