本章主要介绍figure的创建以及figure上的布局
一.figure的创建和使用
figure相当于画板,可能要绘制不同的画,所以画板当然也是可以有多个的,只要在创建时给画板命名标号即可.figure的编号可以是数字,也可以是字符.同时在不同的画板上绘制,只需要切换对应figure的编号即可.
下面用命令行方式来创建两个figure,并在两个figure上切换绘制不同的图.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
mpl.rcParams['axes.unicode_minus']=False
x=np.linspace(0.1,5,1000)
y=x**2
y1=np.sin(x)
y2=x-10
plt.figure(1)
plt.plot(x,y)
plt.figure('second')
plt.plot(x,y1)
plt.figure(1)#可以理解切换回figure1
plt.plot(x,y2)
plt.text(2,20,'figure_1',size=30,color='r')
plt.figure('second')#切换到figure_second
plt.plot(x,y2)
plt.text(2,20,'figure_second',size=30,color='b')
plt.show()
命令行的方式创建figure比较便捷,因为默认已经创建好一个空白的axes,可以直接绘图了,但若要使用Object-Oriented方式的话,则相对麻烦一点,因为Object-Oriented的方式创建的是一个真正空白的figure,没有任何默认值,一切都需要手工创建.
以下为Object-Oriented的方式创建画布:
rect=[0.1,0.1,0.7,0.7]
fig1=plt.figure()
ax1=fig1.add_axes(rect)
ax1.plot(x,y)
fig2=plt.figure()
ax2=fig2.add_axes(rect)
ax2.plot(x,y1)
ax1.plot(x,y1)
ax1.text(1.5,20,'axes1',size=30,color='b')
ax2.plot(x,y2)
ax2.text(2,-4,'axes2',size=30,color='r')
plt.show()
Object-Oriented方式创建figure,省去不同figure之间切换的麻烦,直接调用相应的对象即可.
介绍下创建figure时的主要参数(官网:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.figure.html#matplotlib.pyplot.figure):
matplotlib.pyplot.
figure
(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=<class 'matplotlib.figure.Figure'>, clear=False, **kwargs)
num : 整数或者字符,表示figure的编号,若为None,则每次调用默认创建一个新的figure.
figsize : 一个长高数组, 表示igure尺寸,单位为英寸.默认为[6.4,4.8].
dpi : 分辨率,默认为100
facecolor : figure的背景颜色,默认为'w'(白色)
edgecolor : figure的边框线条颜色,默认为'w'(白色)
补充:其实默认参数的设置是依赖是rcParams文件的设置,后面的教程会详细介绍rcParams
二. 什么是子区?subplot 和subplots有什么区别
我们知道一个figure上是可以绘制多幅图的,每一幅图都在当前 figure上有独立的区域,那么我们把这个独立的区域称一个子区.
或者从另外一个角度来说,我们可以理解为一个axes所占的区域就是一个子区.
让我们先从subplot说起吧
前面的例子中,Object-Oriented方式的情况下,以我们先创建figure对象,再在figure对象上添加一个axes从而得到一个axes对象,
从结果上来说,也就是在一个画板上创建了一个绘图区而已(rect设置了该绘图区的位置,尺寸),而subplot可以简化该流程.
调用subplot可以直接创建一个axes对象:
ax=plt.subplot()
ax.plot(x,y)
ax.text(0.5,20,'subplot创建独占子区',size=30,color='r')
plt.show()
若要在同一个figure上绘制多副图怎么办呢?
如果使用前面手动往figure上添加axes也是可以的,但得计算好每个axes的区域位置分布,会显得比较麻烦,例如:
fig=plt.figure(facecolor='b')
ax1=fig.add_axes([0.1,0.1,0.3,0.3])
ax2=fig.add_axes([0.45,0.45,0.2,0.2])
ax3=fig.add_axes([0.6,0.6,0.2,0.2])
plt.show()
但在figure上添加axes的方法太麻烦,有另外一个添加子区的方法(add_subplot):
fig=plt.figure()
ax1=fig.add_subplot(1,2,1)
ax2=fig.add_subplot(1,2,2)
def example(ax):
ax.plot([1,2,3])
L=[ax1,ax2]
for ax in L:
example(ax)
plt.show()
add_subplot(nrow,ncol,index)方法,可以形成类似网格式的排布,需要指定nrow和ncol,表示几行几列,同时指定当前axes的指定位置
显然,先创建figure,在figure上在添加子区的方式稍显麻烦.
这时调用带参数的subplot函数就简单多了,subplot支持两种指定axes排布的方式,一种是subplot(121)或者subpolt(1,2,1).
这两种方式都是表示在当前figure上创建一行两列的排布,并选取第一个作为当前可供绘制.
最后一位表示第几个子区,顺序是从左到右,从上至下,例如:
plt.subplot(221)
plt.text(0.45,0.45,'1',size=30,color='b')
plt.subplot(222)
plt.text(0.45,0.45,'2',size=30,color='b')
plt.subplot(223)
plt.text(0.45,0.45,'3',size=30,color='b')
plt.subplot(224)
plt.text(0.45,0.45,'4',size=30,color='b')
plt.show()
当然,也可以改为Object-Oriented的形式(图同上,就省略不上了):
ax1=plt.subplot(221)
ax1.text(0.45,0.45,'1',size=30,color='r')
ax2=plt.subplot(222)
ax2.text(0.45,0.45,'2',size=30,color='r')
ax3=plt.subplot(223)
ax3.text(0.45,0.45,'3',size=30,color='r')
ax4=plt.subplot(224)
ax4.text(0.45,0.45,'4',size=30,color='r')
plt.show()
在使用Object-Oriented形式时,plt.subplot函数仅仅是返回一个axes对象,每个对象的绘图操作都需要单独的去执行.而同样是可以快捷创建多个子区的plt.subplots函数则返回两个对象,第一个是figure对象,第二是多个axes对象的集合.同时subplots函数接收的参数形式也不同,直接接收nrows和ncols(参数名可以省略).例如:
fig,ax=plt.subplots(nrows=2,ncols=3)#或者简写为fig,ax=plt.subplot(2,3)
for x in range(2):
for y in range(3):
ax[x,y].text(0.3,0.4,'[%s,%s]'%(x,y),size=20,color='r')
plt.show()
需要注意的是,subplot函数的起始位是从1开始,而subpolts函数是从0开始.
三.让子区跨越固定的网格式布局
subplot和subplots两个函数实现的都是网格化的布局,或者说是等分式的,要实现定制化的跨网格区域绘图,就需要使用subplot2gird函数了.先看一个例子:
def example(ax):
ax.plot([1,2,3])
ax1=plt.subplot2grid((3,3),(0,0),colspan=2)
ax2=plt.subplot2grid((3,3),(0,2))
ax3=plt.subplot2grid((3,3),(1,0),rowspan=2)
ax4=plt.subplot2grid((3,3),(1,1),colspan=2,rowspan=2)
L=[ax1,ax2,ax3,ax4]
for ax in L:
example(ax)
plt.show()
matplotlib.pyplot.
subplot2grid
(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs),前面四个是主要的参数.
shape : 表示整个figure要划分的网格状,如(3,3)代表3行3列
loc :表示当前的 axes放置的起始区域,如(0,0)代表从第一行的第一个位置开始
rowspan :表示当前axes要占用的行的数量,如rowspan=2,表示占用2行
colspan :表示当前axes要占用的列的数量,如colspan=3,表示占用3列
与subplots函数一样,subplot2gird函数的起始位也是从1开始的
四.小结
本章主要从命令行式和面向对象的两种方式介绍了figure对象的创建,子区的划分.