在学习Matplotlib之前,我们可以先大致了解一下Matplotlib图像的组成部分,后面再详细学习其中的各个对象。
Matplotlib图像组成部分
在Matplotlib中,整个图像为一个Figure
对象,可以把Figure
当成一张画布。在Figure
对象中可以包含多个Axes
对象,Axes
对象是制图区域,每个Axes
对象都是一个拥有自己坐标系统的绘图区域。

- Figure:画布
- Axes:坐标轴对象
- spine:坐标轴对象的4个边框
- axis label:坐标轴标签
- Tick:刻度线,包括主刻度线、次刻度线
- Tick label:刻度线的标签
下面是各个对象的从属关系,我们可以从上层对象出发,访问下层对象:

两种接口
在Matplotlib库提供了两种风格的API供开发者使用:一种是Pyplot编程接口(state-based
),一种是面向对象对象的编程接口(object-based
)。
Pyplot编程接口
pyplot编程接口是一个MATLAB风格的接口。众多绘图对象所构成的复杂结构隐藏在这套API内部,我们只需要调用pyplot模块所提供的函数就可以实现快速绘图以及设置图表的各种细节。
这种接口最重要的特征就是“有状态”:他表征当前所位于的子图状态,并持续跟踪当前的图形和坐标轴。同时,我们可以通过plt.gcf()
(”Get Current Figure”)获取当前的活动Figure对象,通过plt.gca()
(”Get Current Axes”)获取当前活动的axes坐标轴对象。
在pyplot模块中,许多函数都是对当前的Figure或Axes对象进行处理,例如:plt.plot()
实际上会通过plt.gca()
获得当前的Axes对象ax,然后再调用ax.plot()
方法实现真正的绘图。
下面是一个例子:
1 | import matplotlib.pyplot as plt |
面向对象接口
在使用面向对象的编程接口时,我们需要自己创建画布(FigureCanvas),自己创建图对象(Figure),自己创建Axes(一个Figure可以包含一个或者多个Axes,一个Axes可以理解为一个子图,使用一次plot()
绘图函数便会创建一个Axes),所有对象一起才能完成一次完整的绘图。使用面向对象编程接口有利于我们对于图形绘制的完整控制,但是代码比较繁琐。
下面是一个例子,绘图的过程之中不再受到当前所谓“活动”图形及坐标轴的限制,因为一次性就从subplots
函数中获取了表征所有坐标轴的ax
数组和Figure
对象:
1 | import matplotlib.pyplot as plt |
两种接口用法对比
下面是几个比较常用的方法的对比:
plt.plot() = ax.plot()
plt.legend() = ax.legend()
plt.xlabel()/ylabel()/xlim()/ylim()/title() = ax.set_xlabel()/set_ylabel()/set_xlim()/set_ylim()/set_title()