add_axes和add_subplot之间有什么区别?

92
在之前的答案中,建议我使用add_subplot而不是add_axes来正确显示轴,但在搜索文档时,我无法理解何时以及为什么应该使用其中的任何一个函数。有人能解释一下区别吗?
2个回答

171

共同点

add_axesadd_subplot 都可以向图形中添加坐标轴。它们都返回一个 (子类的) matplotlib.axes.Axes 对象。

然而,用于添加坐标轴的机制存在明显差异。

add_axes

add_axes 的调用签名是 add_axes(rect),其中 rect 是一个列表 [x0, y0, width, height],表示新坐标轴在画布上的左下角 (x0,y0) 和其宽度与高度。因此,该坐标轴以绝对坐标定位在画布上。例如:

fig = plt.figure()
ax = fig.add_axes([0,0,1,1])

在画布中放置一个与画布本身大小完全相同的图形。

add_subplot

add_subplot 的调用签名并没有直接提供将轴放置在预定义位置的选项。它允许根据子图网格指定轴应该位于哪里。通常和最简单的指定位置的方法是使用三个整数的标记法。

fig = plt.figure()
ax = fig.add_subplot(231)

在这个例子中,一个新的坐标轴被创建在一个2行3列的网格的第一位置(1)。为了只产生一个单独的坐标轴,将使用add_subplot(111)(在1x1子图网格上的第一个图)。(在较新的matplotlib版本中,也可以使用没有任何参数的add_subplot()。)
这种方法的优点是matplotlib会处理精确的定位。默认情况下,add_subplot(111)将产生一个坐标轴位于[0.125,0.11,0.775,0.77]或类似位置,这已经为标题和(刻度)标签周围的坐标轴留出足够的空间。然而,这个位置可能会因绘图中的其他元素、设置的标题等而改变。它也可以使用pyplot.subplots_adjust(...)pyplot.tight_layout()进行调整。
在大多数情况下,add_subplot将是为画布上的图形创建坐标轴的首选方法。只有在需要精确定位的情况下,add_axes可能有用。

示例

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (5,3)

fig = plt.figure()
fig.add_subplot(241)
fig.add_subplot(242)
ax = fig.add_subplot(223)
ax.set_title("subplots")

fig.add_axes([0.77,.3,.2,.6])
ax2 =fig.add_axes([0.67,.5,.2,.3])
fig.add_axes([0.6,.1,.35,.3])
ax2.set_title("random axes")

plt.tight_layout()
plt.show()

enter image description here

替代方案

获取一个或多个子图及其句柄的最简单方法是使用 plt.subplots()。对于一个轴,可以使用以下方式:

fig, ax = plt.subplots()

或者,如果需要更多的子图,
fig, axes = plt.subplots(nrows=3, ncols=4)

初始问题

初始问题中,使用fig.add_axes([0,0,1,1])放置了一个轴,使其紧贴图形边界。当然,这样做的缺点是刻度、刻度标签、轴标签和标题都被裁剪掉了。因此,在回答评论中,我建议使用fig.add_subplot,因为它会自动为这些元素留出足够的空间,并且如果这还不够,可以使用pyplot.subplots_adjust(...)pyplot.tight_layout()进行调整。


3

@ImportanceOfBeingErnest的答案很棒。
但在这种情况下,通常需要为绘图生成坐标轴,add_axes()的开销太大了。

因此,一个小技巧是像@ImportanceOfBeingErnest的答案一样使用add_subplot(111)
然而,更优雅和简单的替代方案是:

hAx = plt.figure(figsize = (10, 10)).gca()

如果您想要3D投影,您可以传递任何轴属性。例如,投影可以这样实现:projection
hAx = plt.figure(figsize = (16, 10)).gca(projection = '3d')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接