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

gre*_*ole 24 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))
Run Code Online (Sandbox Code Playgroud)

甚至适用于nrowncol == 1.

我尝试了列表理解,如:

[element for tupl in tupleOfTuples for element in tupl]
Run Code Online (Sandbox Code Playgroud)

但是如果nrows或者那就失败了ncols == 1

Bon*_*fum 42

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))
Run Code Online (Sandbox Code Playgroud)

当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))
Run Code Online (Sandbox Code Playgroud)

重塑文档.该参数-1导致重塑推断输出的维度.

  • 对于`nrow = ncol = 1`,你可以使用`squeeze = 0`.`plt.subplots(nrows = nrow,ncols = nrow,squeeze = 0)`总是返回轴的2维数组,即使两者都是1. (4认同)

Ø. *_*sen 37

fig返回值plt.subplots具有所有轴的列表.要迭代图中的所有子图,您可以使用:

nrow = 2
ncol = 2
fig, axs = plt.subplots(nrow, ncol)
for i, ax in enumerate(fig.axes):
    ax.set_ylabel(str(i))
Run Code Online (Sandbox Code Playgroud)

这也适用于nrow == ncol == 1.

  • 这太简单了,也太有用了! (3认同)

小智 11

太长了;axes.flat 是迭代轴的最 Pythonic 方式

正如其他人指出的那样, 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'
Run Code Online (Sandbox Code Playgroud)

来源: axes.flat 文档 Matplotlib 教程


Mar*_*ark 10

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

fig, ax2d = subplots(2, 2, squeeze=False)
axli = ax2d.flatten()
Run Code Online (Sandbox Code Playgroud)

适用于任意数量的子图,不需要单斧的技巧,因此比接受的答案更容易(squeeze当时可能还不存在).


小智 8

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

你为什么不试试下面的代码?

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

  • `.flat` 是 numpy 数组的一个属性,与 matplotlib 无关。 (2认同)