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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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失败

答案

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导致重塑推断输出的维度。

另一答案

figplt.subplots返回值包含所有轴的列表。要迭代图中的所有子图,您可以使用:

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

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

另一答案

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

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

适用于任意数量的子图,对于单斧没有任何技巧,因此比接受的答案更容易(当时可能还没有squeeze)。

另一答案

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

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

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

以上是关于matplotlib通过单个列表迭代子图轴数组的主要内容,如果未能解决你的问题,请参考以下文章

通过循环和函数填充 matplotlib 子图

在 matplotlib 中调整单个子图的大小

在子图 Matplotlib 中按列表添加图例

matplotlib如何画子图

在 Matplotlib 中清除子图

Matplotlib 子图——完全摆脱刻度标签