无法播放?请 点击这里 跳转到Youtube
切换视频源:

上一章我们学习了柱状图和直方图,这一章来学习面积图和堆叠面积图。首先导入需要用到的库:

import matplotlib.pyplot as plt
import numpy as np

面积图 Area Chart

面积图,也称作区域图,和折线图很相似。它的特点在于,折线与坐标轴之间的区域,会由颜色或者纹理填充。

在matplotlib中画面积图很简单,只需要x轴和y轴的数值点,然后使用fill_between函数填充y轴数值点与x轴之间的区域:

fig, axe = plt.subplots(figsize = (8, 5))

x = np.arange(0, 5, 0.01)
y = x ** 2
axe.fill_between(x, y, facecolor = 'b', alpha = 0.7)

plt.show()

如果想要填充两个折线之间的区域,可以在fill_between函数中将两条折线的y轴数值都传入:

fig, axe = plt.subplots(figsize = (8, 5))

x = np.arange(0, 5, 0.01)
y1 = x ** 2
y2 = x ** 2 - 10
axe.fill_between(x, y1, y2, facecolor = 'b', alpha = 0.7)

plt.show()

以下是比较特殊的sin数值的面积图:

fig, axe = plt.subplots(figsize = (8, 5))

x = np.arange(0, 5, 0.01) # 500 points
y = np.sin(x * np.pi)
axe.fill_between(x, y, facecolor = 'b', alpha = 0.7)

plt.show()

如果想要对特殊区域的数值进行不同的填充方式,可以定义where参数进行设定。以下代码会将数值大于0的y轴区域填为蓝色,数值小于0的y轴区域填为绿色:

fig, axe = plt.subplots(figsize = (8, 5))

x = np.arange(0, 5, 0.01)
y = np.sin(x * np.pi)
axe.fill_between(x, y, where=(y > 0), facecolor = 'b', alpha = 0.7)
axe.fill_between(x, y, where=(y < 0), facecolor = 'g', alpha = 0.7)

plt.show()

堆叠面积图 Stacked Area Plot

堆叠面积图与面积图类似,区别在于,堆叠面积图有多个数据集,它们一层层的堆叠起来,每个数据集的起始点是上一个数据集的结束点。

如下,我们创建一些随机数值,代表不同鞋店,直接使用stackplot函数,画出堆叠面积图,代表从1月到6月的整体销售情况:

fig, axe = plt.subplots(figsize = (8, 5))

x = [1, 2, 3, 4, 5, 6]
y = [1, 3, 5, 7, 9, 11]
np.random.seed(66)
y1 = y + np.random.randint(1, 5, 6) # low = 0, high = 5, size = 5
y2 = y + np.random.randint(1, 5, 6)
y3 = y + np.random.randint(1, 5, 6)
y4 = y + np.random.randint(1, 5, 6)
y5 = y + np.random.randint(1, 5, 6)
y6 = y + np.random.randint(1, 5, 6)
y7 = y + np.random.randint(1, 5, 6)
labels = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
axe.stackplot(x, y1, y2, y3, y4, y5, y6, y7, labels=["1", "2", "3", "4", "5", "6", "7"])

axe.set_xticks(x)
axe.set_xticklabels(labels)
axe.set_title("Sales from Jan to Jun")
axe.legend(loc='upper left')
plt.show()

以上堆叠面积图的基本线(baseline)是0,如果要改变基本线,可以在stackplot函数中设定baseline参数进行改变:

fig, axe = plt.subplots(nrows=2, figsize = (8, 5))

x = [1, 2, 3, 4, 5, 6]
y = [1, 3, 5, 7, 9, 11]
np.random.seed(66)
y1 = y + np.random.randint(1, 5, 6) # low = 1, high = 5, size = 6
y2 = y + np.random.randint(1, 8, 6)
y3 = y + np.random.randint(1, 5, 6)
y4 = y + np.random.randint(1, 30, 6)
y5 = y + np.random.randint(1, 5, 6)
y6 = y + np.random.randint(1, 20, 6)
y7 = y + np.random.randint(1, 10, 6)

labels = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]

axe[0].stackplot(x, y1, y2, y3, y4, y5, y6, y7, baseline="sym") # 基本线将会水平对称与0 (the baseline stack is going to be symmetric around the horizontal 0 line)
axe[0].set_xticks(x)
axe[0].set_xticklabels(labels)
axe[0].set_title("Symmetric")

axe[1].stackplot(x, y1, y2, y3, y4, y5, y6, y7, baseline="wiggle") # 重设基本线,以至于最小化平方斜率的总和 (minimizes the sum of the squared slopes.)
axe[1].set_xticks(x) 
axe[1].set_xticklabels(labels)
axe[1].set_title("Wiggle")

plt.tight_layout()
plt.show()

以上就是和面积图相关的内容,下一章我们来学习箱型图(Box Plot)和饼图(Pie Plot)。