Matplotlib 面积图函数
面积图是一种随时间变化而改变范围的图标,它主要是强调数量与时间的关系。比如将企业每个月销售额绘制成面积图,然后我们可以很直观地看出每个月销售情况,并且整个面积图所占的范围累计就是年销售额。

在 Matplotlib 中,我们可以使用 stackplot() 函数来绘制一个面积图。
语法:
plt.stackplot(x, y)说明:
参数 x 存放的是所有点的 x 轴坐标,参数 y 存放的是所有点的 y 轴坐标,它们可以是列表、数组、Series 等。
示例 1:Matplotlib 绘制面积图
import matplotlib.pyplot as plt
# 绘图
x = [2016, 2017, 2018, 2019, 2020]
y = [74, 182.7, 490, 99, 198]
plt.stackplot(x, y)
# 显示
plt.show()运行之后,效果如下图所示。

示例 2:Matplotlib 绘制堆叠面积图(多组数据)
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 绘图数据
x = [2021, 2022, 2023, 2024, 2025]
y1 = [20, 40, 30, 50, 60] # 产品 A 的销量
y2 = [30, 50, 40, 60, 70] # 产品 B 的销量
y3 = [10, 20, 15, 25, 30] # 产品 C 的销量
# 绘制堆叠面积图(可以传入 labels 用于显示图例)
plt.stackplot(x, y1, y2, y3, labels=['产品A', '产品B', '产品C'], alpha=0.8)
# 添加图例
plt.legend(loc='upper left')
# 定义标题
plt.title('各产品销量堆叠面积图')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在这个例子中,我们将 y1、y2、y3 依次传入 stackplot() 中。Matplotlib 会先绘制 y1 的面积,然后在 y1 的基础上叠加绘制 y2 的面积,最后叠加 y3。
最顶部的轮廓线代表的就是这三款产品销量的总和。然后结合 labels 和 plt.legend(),我们可以很清晰地对不同色块进行区分。
Matplotlib 面积图案例
在当前项目下的 data 文件夹中有一个 sale.csv 文件,项目结构如下图所示。其中,sale.csv 文件保存的某公司 2020 年每个月的销售总额(单位:万元),内容如下图所示。


示例 3:Matplotlib 面积图的应用
import pandas as pd
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
df = pd.read_csv('data/sale.csv')
# 绘制图表
plt.stackplot(df['月份'], df['总额'])
# 定义标题
plt.title('公司销售总额(面积图)')
plt.xlabel('月份', loc='right')
plt.ylabel('销售额(万元)', loc='top')
# 刻度标签
dates = [str(i)+'月' for i in df['月份']]
plt.xticks(df['月份'], dates)
# 刻度范围
plt.ylim(100, 700)
# 注释文本
for a, b in zip(df['月份'], df['总额']):
plt.text(a, b, b, color='red', fontsize=12, ha='center', va='bottom')
# 显示
plt.show()运行之后,效果如下图所示。

Matplotlib 堆积面积图
在实际开发中,某些情况下,基本的面积图并不能满足实际需求。所以我们还得掌握一些高级面积图的绘制,常见的只有堆叠面积图这一种。
示例 4:Matplotlib 绘制堆叠面积图
import matplotlib.pyplot as plt
# 绘制
x = [1, 2, 3, 4, 5]
y1 = [5, 8, 7, 6, 8]
y2 = [3, 7, 6, 5, 7]
y3 = [2, 6, 4, 3, 5]
plt.stackplot(x, y1, y2, y3)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
对于堆叠面积图来说,不同的面积图的 x 轴坐标要求是相同的。
