# 使用 matplotlib 绘制图表

# matplotlib 库仅需开发人员编写几行代码即可绘制一个图表。下面结合面向对象的方式使用 matplotlib 库绘制一个简单的图表,示例代码如下 :

In [1]:
import numpy as np
import matplotlib.pyplot as plt
data = np.array ( [1, 2, 3, 4, 5] )     # 准备数据
fig = pit.figure()                      # 创建代表画布的 Figure类的对象fig
ax = fig.add_subplot (111)              # 在画布 fig 上添加坐标系风格的绘图区域 ax
ax.plot (data)                          # 绘制图表
plt.show ()                             # 展示图表

# 以上代码首先导入了 numpy 模块、pyplot 模块,并将这两个模块分别取别名为 np、pit,其次创建了一个包含 5 个元素的数组 data, 然后调用 figure() 函数创建了一个代表画布的Figure 类的对象 fig, 调用 add_subplot() 方法在画布上添加拥有坐标系的绘图区域 ax, 调用plotQ 方法在绘图区域中根据 data 绘制图表,最后调用 showQ 函数展示图表。
需要说明的是,当调用 plot()方法绘制图表时,若只是传入了单个列表或数组,则会将传入的列表或数组作为y 轴的数据,并自动生成一个与该列表或数组长度相同的、首位元素为0的递增序列作为 x 轴的数据,即[0,1,2,3,4]。
运行上面的程序,效果如图 1-32 所示。
从图 1-32 可以看出,图表的图形是一条直线,位于由两个坐标轴及边框围成的区域中。

./image/1-32.png)

# 下面使用 pyplot 的函数快速地绘制同一个图表,示例代码如下 :

In [2]:
import numpy as np
import matplotlib.pyplot as plt         # 导入 pyplot 模块
data = np.array([1, 2, 3, 4, 5])        # 准备数据
plt.plot(data)                          # 在当前画布的绘图区域中绘制图表
plt.show()                              # 展示图表

# 以上代码首先导入了 numpy 模块、pyplot 模块,并将这两个模块分别取别名为 np、plt,其次创建了一个包含 5 个元素的数组 data, 然后调用 plot() 函数在当前的绘图区域中根据 data绘制图表,最后调用show()。函数展示图表。
运行上面的程序,效果与图 1-32 的图表完全相同。
通过比较前面的两个示例代码可以发现,第二个示例使用更少的代码便绘制了同一个图表。

# 注意:

# plot() 函数与 plot() 方法的参数用法是相同的,它们唯一的区别在于 plot() 函数缺少 self参数,可以直接被 pyplot 模块调用 ;而 plot() 方法只能被 Axes 类的对象调用。

# 多学一招:matplotlib所绘图形的层次结构

# 假设想画一幅素描,首先需要在画架上放置并固定一个画板,然后在画板上放置并固定一张画布,最后在画布上画图。同理,使用 matplotlib 库绘制的图形并非只有一层结构,它也是由多层结构组成的,以便对每层结构进行单独设置。
使用 matplotlib 绘制的图形主要由三层组成 :容器层、图像层和辅助显示层。
1. 容器层
容器层主要由 Canvas 对象、Figure 对象、Axes 对象组成,其中 Canvas 对象充当 画板的角色,位于底层 ;Figure 对象充当画布的角色,它可以包含多个图表,位于 Canvas 对象的上方,也就是用户操作的应用层的第一层 ;Axes 对象充当画布中绘图区域的角色,它拥有独立的坐标系,可以将其看作一个图表,位于 Figure 对象的上方,也就是用户操作的应用层的第二层。Canvas 对象、Figure 对象、Axes 对象的层次关 系如图 1-33 所示。
需要说明的是,Canvas 对象无须用户创建。Axes 对象拥有属于自己的坐标系,它可以是直角坐标系,即包含 x 轴和y 轴的坐标系,也可以是三维坐标系 ( Axes 的子类 Axes3D 对象),即包含 x 轴、y 轴、z 轴的坐标系。2. 图像层
图像层是指绘图区域内绘制的图形。例如,本节中使用 plot。方法根据数据绘制的直线。

# 3. 辅助显示层
辅助显示层是指绘图区域内除所绘图形之外的辅助元素,包括坐标轴(Axis 类对象,包括轴脊和刻度,其中轴脊是 Spine 类对象,刻度是 Ticker 类对象)、 标题(Text 类对象)、 图例( Legend 类对象)、注释文本(Text 类对象)等。辅助元素可以使图表更直观、更容易被用户理解,但是又不会对图形产生实质的影响。
需要说明的是,图像层和辅助显示层所包含的内容都位于 Axes 类对象之上,都属于图表的元素。