这篇文章主要介绍“怎么使用Python绘制瀑布图”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用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!")
需要注意一点,
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()