Matplotlib系列之简述

在学习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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np

# 数据准备
x = np.linspace(-2,2,20)
y1 = 2*x+1
y2 = x**2

# 采用plt绘制第一个子图
plt.subplot(2, 1, 1)
plt.plot(x, y1)
# 采用plt绘制第二个子图
plt.subplot(2, 1, 2)
plt.plot(x, y2)

plt.show()

面向对象接口

在使用面向对象的编程接口时,我们需要自己创建画布(FigureCanvas),自己创建图对象(Figure),自己创建Axes(一个Figure可以包含一个或者多个Axes,一个Axes可以理解为一个子图,使用一次plot()绘图函数便会创建一个Axes),所有对象一起才能完成一次完整的绘图。使用面向对象编程接口有利于我们对于图形绘制的完整控制,但是代码比较繁琐。

下面是一个例子,绘图的过程之中不再受到当前所谓“活动”图形及坐标轴的限制,因为一次性就从subplots函数中获取了表征所有坐标轴的ax数组和Figure对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import numpy as np

# 数据准备
x = np.linspace(-2,2,20)
y1 = 2*x+1
y2 = x**2

fig, ax = plt.subplots(2,1)
# 采用对应的坐标轴对象绘制第一个子图
ax[0].plot(x, y1)
# 采用对应的坐标轴对象绘制第二个子图
ax[1].plot(x, y2)

plt.show()

两种接口用法对比

下面是几个比较常用的方法的对比:

  • 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()

----------- 本文结束啦感谢您阅读 -----------

赞赏一杯咖啡

欢迎关注我的其它发布渠道