本篇将详细讨论Figure的add_axes()方法

axes是figure容器中的一个格子

figure对象是一个顶级容器,用来放置、布局子绘图组件,可以进一步将figure划分多个子区域,这就像一个文件柜被划分为多个格子或抽屉一样。

Axes是Figure子容器中最重要的一个子容器。

Axes是一个矩形区域,这个矩形是基于figure坐标系统定义的

Axes也是matplotlib框架中一个重要的类对象,但首先要把它理解为figure中的一个子矩形区域。所以,本文我都会这样称呼它。

向figure中添加axes的三个途径

要向figure中添加axes子区域,有三个途径:

  1. 使用figure的add_axes()方法;
  2. 使用figure的add_subplot()方法;
  3. 创建一个Axes对象实例,再将这个实例添加到figure中。

本篇将重点介绍figure的add_axes()方法。

add_axes()方法的调用

add_axes()方法的构造如下:

add_axes(self, *args, **kwargs)

要调用add_axes()方法,有两种签名形式:

调用签名一:add_axes(rect, projection=None, polar=False, **kwargs)调用签名二:add_axes(ax)

使用签名一 调用add_axes()方法

add_axes(rect, projection=None, polar=False, **kwargs)

这是最常用的调用figure的add_axes()方法的签名形式。

其中的 rect 是位置参数,接受一个4元素的浮点数列表, [left, bottom, width, height] ,它定义了要添加到figure中的矩形子区域的:左下角坐标(x, y)、宽度、高度。

注意:每个元素的值是figure宽度和高度的分数。即将figure的宽、高作为1个单位。

输入如下代码将创建一个figure的实例figa,然后使用add_axes()方法添加一个axes到figa中。

from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure
from matplotlib.axes import Axes
from matplotlib.patches import Rectangle
import numpy as np
from numpy import math

figa =Figure(figsize=(9.6,4.8), 
 dpi=100,
 facecolor=(239/256,239/256,239/256),
 #facecolor=(0.18,0.31,0.31),
 edgecolor=(82/256,101/256,155/256),
 linewidth=10.0,
 )

canvas = FigureCanvasAgg(figa)

# 供rect参数调用add_axes()方法
#创建的axes会自动绑定到figure上
rect = [0.125,0.125,0.6,0.6]
axa = figa.add_axes(rect,facecolor='C2')

x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
axa.plot(x, y, color='m')
axa.grid(b=True) 

s, (width, height) = canvas.print_to_buffer() 
from PIL import Image 
im = Image.frombytes("RGBA", (width, height), s)
im.show() 

上面的代码生成如下图形:

Matplotlib学习手册A005_Figure的add_axes()方法

一图搞清axes和figure的关系

代码的逻辑思路很清晰,重要的是记住 axes 的尺寸、定位是相对于figure的。

rect参数的宽度和高度都是0.6:

rect = [0.125,0.125,0.6,0.6]

但从图中可以看出axes的物理尺寸上,宽度明显大于高度,这是因为 figsize=(9.6, 4.8)。

使用签名二调用add_axes()方法

add_axes(ax)

在官方文档中对该调用签名有一段说明:

In rare circumstances, add_axes may be called with a single argument, a axes instance already created in the present figure but not in the figure’s list of axes.

意思是:

在极少数情况下, 可以只带一个参数调用.add_axes , 该参数是在当前图中已经创建的一个axes实例,但这个实例又不在图的axes列表中。

对初学者,尤其是从函数式绘图入门的人来说,可能会觉得这段话很费解。

这有两种情况:

  1. axes是Axes类的一个实例,还没有添加到figure中;
  2. 使用fig.add_axes()方法创建的,已自动附加到figure中,但随后又删除了。

第1种情况,在讲到Axes对象时再讨论。

这里重点讨论第2种情况:

通过上一篇的学习,我们知道figure众多方法中有一个 axes 方法,返回figure中 axes对象的列表。还有一个delaxes()方法可以删除figure中的某个axes。

我们用一段代码,使用这两个方法来解释,大家就会豁然开朗了。

from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure
from matplotlib.axes import Axes
import numpy as np
from numpy import math

figa =Figure(figsize=(9.6,4.8), 
 dpi=100,
 facecolor=(239/256,239/256,239/256),
 #facecolor=(0.18,0.31,0.31),
 edgecolor=(82/256,101/256,155/256),
 linewidth=10.0,
 )

canvas = FigureCanvasAgg(figa)
# 供rect参数调用add_axes()方法
#创建的axes会自动绑定到figure上
rect = [0.125,0.125,0.6,0.6]
axa = figa.add_axes(rect,facecolor='C2')

#读取figa.axes属性列表
print(figa.axes)

x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
axa.plot(x, y, color='m')
axa.grid(b=True)

#从figa中删除axa
figa.delaxes(axa)

#再次读取figa的axes列表,应该为空
print(figa.axes)

#使用一个参数调用add_axes()方法
#将axa再次添加到figa中
#可注释下一行,生成的图形中已没有axes
figa.add_axes(axa)

s, (width, height) = canvas.print_to_buffer() 
from PIL import Image #调用PIL
im = Image.frombytes("RGBA", (width, height), s)
im.show() 

Matplotlib学习手册A005_Figure的add_axes()方法

add_axes()方法重要参数

add_axes()方法可设置的参数很多,但只有rect位置参数是必需的。其它都是可选的关键字参数。

这里先介绍几个常用的主要参数,其它的到介绍Axes对象时再详细讨论。

rect:

这是一个必需的位置参数,

projection

可选关键字参数,坐标系的投影类型,可能的值有:

{None, ‘aitoff’, ‘hammer’, ‘lambert’, ‘mollweide’, ‘polar’, ‘rectilinear’, str}

默认None的结果是一个“rectilinear 直线(即笛卡尔直角坐标第)”投影。

str 是自定义投影的名称。注: 不仅可以使用系统已设计好的投影,还可以自定义一个投影变换并使用,注册并调用自定义的投影名称即可。str即自定义投影的名称。

polar

可选关键字参数,布尔值。如果为 True, 等同于 projection=‘polar’.

Matplotlib学习手册A005_Figure的add_axes()方法

设置projection = ‘polar’

sharex, sharey

可选关键字参数,共享另一个axes对象的 x/y 的属性。提供一个Axes 对象。

例如,一个figure中有两个axes:axesa, axesb。

使用add_axes()方法创建axesb时,如果共享axesa的x轴和/或y轴,即x/y轴与axesa的一些属性相同,如limits, ticks,和 scale。

看代码:

from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure
from matplotlib.axes import Axes
import numpy as np
from numpy import math

fig =Figure(figsize=(9.6,4.8), 
 dpi=100,
 facecolor=(239/256,239/256,239/256),
 #facecolor=(0.18,0.31,0.31),
 edgecolor=(82/256,101/256,155/256),
 linewidth=10.0,
 )

canvas = FigureCanvasAgg(fig)

recta = [0.08,0.08,0.42,0.42]
axesa = fig.add_axes(recta,facecolor='C2')

rectb = [0.5,0.5,0.43,0.43]

#请注意有无sharex=axesa,axesb的x轴刻度的差异
#axesb = fig.add_axes(rectb)
axesb = fig.add_axes(rectb,sharex=axesa) #axesb与axesa的刻度相同

x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
axesa.plot(x, y, color='m')
s, (width, height) = canvas.print_to_buffer() 
from PIL import Image 
im = Image.frombytes("RGBA", (width, height), s)
im.show() 

Matplotlib学习手册A005_Figure的add_axes()方法
没有设置sharex时的结果
Matplotlib学习手册A005_Figure的add_axes()方法
添加axesb时,sharex = axesa

请认真比较上图。

需要文中的代码,请移步“Python草堂”Q群 457079928 下载。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐