Matplotlib教程二

这篇教程详细讲解了Matplotlib中figure的创建和使用,包括如何通过命令行和Object-Oriented方式创建figure,以及subplot和subplots的区别。此外,还介绍了如何使用subplot2grid实现子区跨越固定网格的布局,帮助读者更好地理解和操作Matplotlib的图形布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 本章主要介绍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=Nonefigsize=Nonedpi=Nonefacecolor=Noneedgecolor=Noneframeon=TrueFigureClass=<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(shapelocrowspan=1colspan=1fig=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对象的创建,子区的划分.

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值