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))
甚至适用于nrow
或ncol == 1
。
我尝试了列表理解,如:
[element for tupl in tupleOfTuples for element in tupl]
但如果nrows
或ncols == 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
导致重塑推断输出的维度。
另一答案
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))
这也适用于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通过单个列表迭代子图轴数组的主要内容,如果未能解决你的问题,请参考以下文章