Matplotlib学习手册A005_Figure的add_axes()方法
本篇将详细讨论Figure的add_axes()方法axes是figure容器中的一个格子figure对象是一个顶级容器,用来放置、布局子绘图组件,可以进一步将figure划分多个子区域,这就像一个文件柜被划分为多个格子或抽屉一样。Axes是Figure子容器中最重要的一个子容器。Axes是一个矩形区域,这个矩形是基于figure坐标系统定义的。Axes也是matplotlib框架中一个...
本篇将详细讨论Figure的add_axes()方法
axes是figure容器中的一个格子
figure对象是一个顶级容器,用来放置、布局子绘图组件,可以进一步将figure划分多个子区域,这就像一个文件柜被划分为多个格子或抽屉一样。
Axes是Figure子容器中最重要的一个子容器。
Axes是一个矩形区域,这个矩形是基于figure坐标系统定义的。
Axes也是matplotlib框架中一个重要的类对象,但首先要把它理解为figure中的一个子矩形区域。所以,本文我都会这样称呼它。
向figure中添加axes的三个途径
要向figure中添加axes子区域,有三个途径:
- 使用figure的add_axes()方法;
- 使用figure的add_subplot()方法;
- 创建一个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()
上面的代码生成如下图形:
一图搞清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列表中。
对初学者,尤其是从函数式绘图入门的人来说,可能会觉得这段话很费解。
这有两种情况:
- axes是Axes类的一个实例,还没有添加到figure中;
- 使用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()
add_axes()方法重要参数
add_axes()方法可设置的参数很多,但只有rect位置参数是必需的。其它都是可选的关键字参数。
这里先介绍几个常用的主要参数,其它的到介绍Axes对象时再详细讨论。
rect:
这是一个必需的位置参数,
projection
可选关键字参数,坐标系的投影类型,可能的值有:
{None, ‘aitoff’, ‘hammer’, ‘lambert’, ‘mollweide’, ‘polar’, ‘rectilinear’, str}
默认None的结果是一个“rectilinear 直线(即笛卡尔直角坐标第)”投影。
str 是自定义投影的名称。注: 不仅可以使用系统已设计好的投影,还可以自定义一个投影变换并使用,注册并调用自定义的投影名称即可。str即自定义投影的名称。
polar
可选关键字参数,布尔值。如果为 True, 等同于 projection=‘polar’.
设置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()
没有设置sharex时的结果
添加axesb时,sharex = axesa
请认真比较上图。
需要文中的代码,请移步“Python草堂”Q群 457079928 下载。
更多推荐
所有评论(0)