Add_ax 和 add_subplot 有什么区别?

在之前的 回答中,有人建议我使用 add_subplot而不是 add_axes来正确地显示轴,但是在搜索文档时,我无法理解何时以及为什么我应该使用这两个函数中的任何一个。

有人能解释一下这些区别吗?

104730 次浏览

共同点

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的调用签名不直接提供将轴放置在预定义位置的选项。相反,它允许根据子图网格指定轴的位置。指定这个位置的最常用和最简单的方法是3整数表示法,

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

在这个例子中,在第一个位置(1)创建了一个新的坐标轴,坐标轴由2行和3列组成。为了只生成单个轴,将使用 add_subplot(111)(在1乘1子图网格上的第一个图)。(在更新的 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()进行调整。

“重要的存在”给出的答案很棒。
然而,在这种情况下,人们通常希望为一个绘图生成一个轴,而 add_axes()有太多的开销。

因此,一个技巧就是,正如在@Import anceOfBeingErnest 的答案中那样,使用 add_subplot(111)
然而,更优雅、更简单的替代方案是:

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

如果你想要 3D投影,你可以传递任何轴属性。例如 projection:

hAx = plt.figure(figsize = (16, 10)).gca(projection = '3d')