matplotlib之疑难点figure、axes

matplot是python经常使用的一个数据可视化库,里面包含了很多方便的函数方法。

1. plt.figure()

首先展示一个最简单的画线函数plot(),绘制一条直线。

import matplotlib.pyplot as plt
import numpy as np

data = np.linspace(1, 100, 101)
plt.figure()
plt.subplot(111)   #如果figure中只有一个坐标系,该句可以省略,plt.plot()等绘图函数会隐式自动创建一个axes
plt.plot(data)
plt.show()

matplotlib之疑难点figure、axes_第1张图片

对比一下代码:

data = np.linspace(1, 100, 101)

plt.plot(data)
plt.show()

只是去掉了一句话plt.figure(),仍然可以实现上述的绘图,所以这里的plt.figure作用是什么,是否必须?

答:plt.figure在日常使用的时候非必须,在matplotlib中,调用plt.figure()会显式的创建一个图形,表示一个图形用户界面窗口。但是通过调用plt.plot()或类似的方法也会隐式的创建图形figure。这对于简单的图表没有问题,但是对于更高级的应用,能显式的创建图形并得到实例的引用时非常有用的。当你的程序中需要绘制两幅图的时候,你可以选择将两个图都绘制在一个图形figure中,也可以选择分别绘制在两个图形figure中,一般来说直接调用plt.plot()等绘图函数时,都是默认在当前的工作区内操作的,如何切换不同的图形figure,这里就体现出plt.figure()的作用了,该方法的全部参数如下,详细参数说明见该链接。

matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=, clear=False, **kwargs)

  接下来展示一段代码来说明,plt.figure()中关键字num的作用,当存在多个figure的时候,就可以通过调用plt.figure(),传入对应的参数即可激活对应的figure,其中figure是有对应的编号的,可以传入数字来激活。

x = np.linspace(-np.pi, np.pi, 256)
y1 = np.sin(x)
y2 = np.cos(x)

fig1 = plt.figure(num='first')
fig1.suptitle('first figure')
plt.plot(x, y1)

fig2 = plt.figure(num='second')
fig2.suptitle('second figure')
plt.plot(x, y2)

plt.figure(num=1)  #plt.figure(num='first')
plt.plot(x, y2)
plt.show()

matplotlib之疑难点figure、axes_第2张图片

2. plt.subplot()

上面已经明了了figure的作用,所以还是建议大家写程序的时候把plt.figure()先写上,再继续。接下来是另外一个很常见的函数plt.subplot(),该方法可以创建多个坐标系axes,先来一个小例子,如下在一个图形figure中绘制两个坐标系axes。

x = np.linspace(-np.pi, np.pi, 256)
y1 = np.sin(x)
y2 = np.cos(x)

fig = plt.figure(num='first')
fig.suptitle('figure')

plt.subplot(221)
plt.plot(x, y1)
plt.subplot(224)
plt.plot(x, y2)

plt.show()

matplotlib之疑难点figure、axes_第3张图片

一般来说,plt.subplot()方法会传入一个三位的整数,其中前两位表示创建的figure中是如何划分坐标系的,比如221,其中22就是2*2的网格,第三个数字表示选中第几个网格,其中1表示第一个网格,4表示第四个网格。在调用该函数的时候就会激活该坐标系,之后所有的plt.****()方法都会在该坐标系axis中进行,subplot方法还会返回一个句柄,该句柄与该坐标系绑定,也可以直接调用该句柄加对应的方法直接操作对应的坐标系。所以最好每次调用subplot的时候将句柄保存下来,方便之后调用,同时也尽量使用句柄调用方法,这样代码更加清晰明了,让你知道你当前在操作的是哪一个坐标系,而plt.****()则不能显式的看出来。

fig = plt.figure()
fig.suptitle('Figure')

axis1 = plt.subplot(221)
axis1.plot([1,2,3,4])

axis4 = plt.subplot(224)
axis4.plot([1,2,3,4])

axis1.set_title('axes[0]')
axis4.set_title('axes[1]')
plt.show()

matplotlib之疑难点figure、axes_第4张图片

PS: 到这里就产生两个概念了,分别是图形figure和坐标系axes,这两个概念刚开始不好弄清楚,这里用通俗一点的话来说:"图形figure像是一种画布,而坐标系axes就是画布上面分布的方框区域,称之为坐标系axes“。

plt.subplot()方法的全部参数如下,具体见链接。

matplotlib.pyplot.subplot(nrows, ncols, index, **kwargs)
matplotlib.pyplot.subplot(pos, **kwargs)

3. plt.subplots()

与plt.subplot()类似的还有一个方法plt.subplots(),仅有一个字符之差,该通过一个小例子来看一下两者的区别:

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(7,7))
fig.suptitle('Figure')

axes[0][0].plot([1,2,3,4])
axes[0][1].plot([1,2,3,4])

axes[1][1].plot([1,2,3,4])
axes[1][1].set_title('axes[1][1]')
plt.show()

matplotlib之疑难点figure、axes_第5张图片

可以看得出,该方法的返回值有两个,分别是figure和axes,并且可以通过axes直接调用对应的坐标系,这里axes是一个列表,尺寸为2*2,即使我们只画了三个坐标系,但是实际还是存在4个,并且也都画出来了,对比一个上一幅图中subplot()方法画了两个坐标系,实际就存在两个坐标系,最后显示的也是两个。

具体的方法调用参见官网链接。

matplotlib.pyplot.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

4. fig.add_subplot()  VS  fig.add_axes()

pyplot的方式中plt.subplot()和面向对象中的对象figure.add_subplot()的参数和含义都相同,不同的是subplot是pyplot的一个方法,而add_subplot的调用对象是一个figure对象

fig = plt.figure()                  #先创建一个figure对象
axis1 = fig.add_subplot(121)        #figure对象调用方法add_subplot
axis1.plot([1,2,3,4])
axis2 = fig.add_subplot(122)
axis2.plot([4,3,2,1])
plt.show()

matplotlib之疑难点figure、axes_第6张图片

add_axes()方法跟add_subplot()都是基于对象的方法实现,功能也是往一个图figure中添加一个坐标轴区域,但不同的是subplot的绘制都是标准化的网格方式,比如subplot(222)代表创建的只能是2*2的网格,网格的位置比例都是相对固定死的,不能随意调整,而add_axes()方法就是为了更加方便定制坐标轴的位置,可以将坐标轴axes放在figure中的任何一块区域

fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8])  #left, bottom, width, height
ax1.plot([1,2,3,4])
ax1.set_title('ax1')

ax2 = fig.add_axes([0.5, 0.5, 0.25, 0.25])  #新增区域ax2,嵌套在ax1内
ax2.plot([1,2,3,4])
ax2.set_title('ax2')
plt.show()

matplotlib之疑难点figure、axes_第7张图片

5. 总结

这篇文章主要是为了解决matplotlib.pyplot中常出现的figure和axes两个概念进行一下辨析,

  1. figure是一个图形界面,一个画布,而axes是一个坐标轴界面,一个figure上可以放置多个axes坐标轴;
  2. plt.subplot()和figure.add_subplot()两种方法的功能和参数完全一样,但是两者的设计里面不一样,后者add_subplot()是基于对象设计的一种方法,其调用对象是一个figure对象,而subplot是一个类调用;
  3. plt.plot()等绘线函数会自动创建一个axes坐标轴,默认情况下,plt.***()的调用都是基于当前坐标轴对象的,所以相应的方法也可以都换成axes.***()基于对象的方法实现;

参考文章

https://zhuanlan.zhihu.com/p/256505470

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Python,python,可视化,机器学习,数据可视化,matplotlib)