matplotlib通过单个列表迭代子图轴数组

时间:2013-11-29 15:18:13

标签: python matplotlib

是否有一种简单/干净的方法来迭代子图(如

)返回的轴数组
nrow = ncol = 2
a = []
fig, axs = plt.subplots(nrows=nrow, ncols=ncol)
for i, row in enumerate(axs):
    for j, ax in enumerate(row):
        a.append(ax)

for i, ax in enumerate(a):
    ax.set_ylabel(str(i))

甚至适用于nrowncol == 1

我尝试了列表理解,如:

[element for tupl in tupleOfTuples for element in tupl]

但如果nrowsncols == 1

,则会失败

6 个答案:

答案 0 :(得分:36)

ax返回值是一个numpy数组,我相信它可以重新整形,而不会复制数据。如果您使用以下内容,您将获得一个可以干净地迭代的线性数组。

nrow = 1; ncol = 2;
fig, axs = plt.subplots(nrows=nrow, ncols=ncol)

for ax in axs.reshape(-1): 
  ax.set_ylabel(str(i))

当ncols和nrows都为1时,这不成立,因为返回值不是数组;你可以把返回值变成一个数组,其中一个元素是一致的,虽然感觉有点像cludge:

nrow = 1; ncol = 1;
fig, axs = plt.subplots(nrows=nrow, ncols=nrow)
axs = np.array(axs)

for ax in axs.reshape(-1):
  ax.set_ylabel(str(i))

reshape docs。 参数-1导致重塑推断输出的维度。

答案 1 :(得分:33)

fig的{​​{1}}返回值包含所有轴的列表。要迭代图中的所有子图,您可以使用:

plt.subplots

这也适用于nrow = 2 ncol = 2 fig, axs = plt.subplots(nrow, ncol) for i, ax in enumerate(fig.axes): ax.set_ylabel(str(i))

答案 2 :(得分:9)

我不确定它何时添加,但现在有一个squeeze关键字参数。这样可以确保结果始终是2D numpy数组。将其转换为一维数组非常简单:

fig, ax2d = subplots(2, 2, squeeze=False)
axli = ax2d.flatten()

适用于任意数量的子图,不需要单斧的技巧,所以比接受的答案稍微容易一些(当时可能还不存在squeeze)。

答案 3 :(得分:3)

Matplotlib在轴上有自己的展平功能。

为什么不尝试使用代码?

fig, axes = plt.subplots(2, 3)
for ax in axes.flat:
    ## do something with instance of 'ax'

答案 4 :(得分:1)

TLDR; axes.flat是遍历轴的最Python方式

正如其他人指出的那样,plt.subplots()的返回值是Axes对象的numpy数组,因此有大量内置的numpy方法用于展平该数组。在这些选项中, axes.flat 是最不详细的访问方法。此外,axes.flatten()返回数组的副本,而axes.flat返回数组的迭代器。从长远来看,这意味着axes.flat将会更有效率。

偷@ Sukjun-Kim的例子:

fig, axes = plt.subplots(2, 3)
for ax in axes.flat:
    ## do something with instance of 'ax'

来源: axes.flat docs Matplotlib tutorial

答案 5 :(得分:1)

这是一个好习惯:
例如,我们需要一组4 x 4的子图,这样我们就可以像下面这样:

rows = 4; cols = 4;
fig, axes = plt.subplots(nrows=rows, ncols=cols, figsize=(20, 16), squeeze=0, sharex=True, sharey=True)
axes = np.array(axes)

for i, ax in enumerate(axes.reshape(-1)):
  ax.set_ylabel(f'Subplot: {i}')

输出清晰美观。