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)
甚至适用于nrow或ncol == 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导致重塑推断输出的维度.
Ø. *_*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.
小智 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)