Python使用matplotlib:subplot绘制多个子图

yuan00yu 2019-03-21

以面向对象方式绘图

在使用Matplotlib进行绘图的时候,对于不太复杂的绘图,我们可以直接使用plot()函数直接绘制,但是实际上,Matplotlib是一个面向对象的绘图库,我们绘制的图像中,每条曲线,每个边框等等都对应一个对象,因此,可以从面向对象的角度考虑绘图,plt.figre()就创建了一个FIgure()对象,对于这一点,我们可以查看一下:

In [3]: fig = plt.figure()
In [4]: fig
Out[4]: <Figure size 640x480 with 0 Axes>

这里有两个概念,一个是Figure图表对象,另一个是Axes子图对象,Figure就像是一张画布,但是在画布上我们可以分割开好几块区域,每一块区域就相当于一个子图,这两个对象我们可以通过gcf()(Get Current Figure)和gca()(Get Current Axes)来获得。那么,如何在一张Figure中绘制多个子图呢?这里要用到subplot()函数

subplot()函数
调用格式如下:

subplot( numRows, numCols,  plotNum)

整个Figure会被划分为numRows行,numCols列,并从左往右,从上往下编号为1,2…也就是说plotNum指定了子图所在的位置,此外,如果三个参数的都小于10,则可以简写在一起,例如:subplot(4, 3, 2)也可以写成 subplot(432)

例如:
import numpy as np
import matplotlib.pyplot as plt

plt.figure()
plt.subplot(221, facecolor='r')  #facecolor指定背景颜色 在之前的Python版本使用的是axisbg 现在已经改成了facecolor
plt.subplot(222, facecolor='b')
plt.subplot(223, facecolor='g')
plt.subplot(224, facecolor='y')
plt.show()

效果如下:

Python使用matplotlib:subplot绘制多个子图

也有简单一点的写法:

for idx,color in enumerate("rbgy"):
 plt.subplot(221+idx, facecolor = color)
plt.show()

这中写法我的理解是“相对”,将字符串的每个字符序号给出分别是0,1,2,3,作为相对于(221)第一个位置的偏移量,所以用一个循环就可以轻松写出来了。
除了这样的绘图之外,我们有时候会用到不想这么整齐的图表,比如第一行均分,分成两张子图,第二行就一张子图了,原理是一样的,例如:

plt.figure()
plt.subplot(221)  #指定分为2行2列 绘制在第一个位置
plt.subplot(222)  #指定分为2行2列 绘制在第二个位置
plt.subplot(212)  #指定分为2行1列 绘制在第二个位置  2:2行  1:1列  2:表示如果分为2行1列的话位置是第二个
plt.show()

效果如下:

Python使用matplotlib:subplot绘制多个子图

相关推荐