当我使用子图并尝试使用以下子图仅绘制一个图形时,会出现错误:
AttributeError:'AxesSubplot'对象没有属性'flat'
fig, ax = plt.subplots(nrows=nrows, ncols=ncols,figsize=figsize)
for i, ax in enumerate(ax.flat):
ax.plot(X, Y, color='k')
如果我要任意设置子图形的数量,如何解决此问题?如何轻松理解ax.flat
?
答案 0 :(得分:1)
在确切的情况下,代码
fig, ax = plt.subplots(nrows=nrows, ncols=ncols,figsize=figsize)
for i, ax in enumerate(ax.flat):
ax.plot(X, Y, color='k')
将无法按预期工作。这是针对nrows = ncols = 1
的。这是因为对于单个行和列,ax
是单个子图,而不是多个子图的数组。
要避免此问题,并且要使用相同的代码而无需事先知道nrows
和ncols
,请使用 squeeze=False
选项。这将确保ax
始终是数组,因此具有.flat
属性。为了更好地理解,请不要使用与轴本身相同的名称来调用axis数组。
fig, axs = plt.subplots(nrows=nrows, ncols=ncols, squeeze=False, figsize=figsize)
for i, ax in enumerate(axs.flat):
ax.plot(X, Y, color='k')
答案 1 :(得分:0)
flat
是numpy
数组的属性,它返回迭代器。例如,如果您有一个2d数组,如下所示:
import numpy as np
arr2d = np.arange(4).reshape(2, 2)
arr2d
# array([[0, 1],
# [2, 3]])
提供flat
属性是一种方便的方式来遍历此数组,就好像它是一维数组一样:
for value in arr2d.flat:
print(value)
# 0
# 1
# 2
# 3
您还可以使用flatten
方法展平数组:
arr2d.flatten()
# array([0, 1, 2, 3])
当您指定以下内容时,请回到您的问题:
ncols
设置为1,将nrows
设置为大于1或相反的值,您将得到1d numpy数组中的轴,在这种情况下,flat
属性将返回相同的数组。 ncols
和nrows
的值都大于1,您将得到2d数组中的轴,在这种情况下,flat
属性将返回展平的数组。ncols
和nrows
都设为1,您将得到轴对象,该对象没有flat
属性。因此可能的解决方案是每次将ax
对象转换为numpy
数组:
fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=figsize)
ax = np.array(ax)
for i, axi in enumerate(ax.flat):
axi.plot(...)
答案 2 :(得分:0)
使用命令fig,ax=plt.subplots()
创建具有多个行/列的子图集时,它将返回fig
和轴列表ax
。 ax
列表的形状为2维(行,列)。这就是为什么在迭代ax
列表时需要将其展平为1维的原因。要访问特定轴,您需要行/列索引,例如ax [r] [c]是第(r + 1)行/第(c + 1)列上的轴。索引从零开始。下面的工作代码演示了如何做到这一点。
import matplotlib.pyplot as plt
import numpy as np
nrows,ncols = 3,2
figsize = [5,9]
X = np.random.rand(6)
Y = np.random.rand(6)
fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=figsize)
for i, axi in enumerate(ax.flat):
axi.plot(X, Y, color='k')
rowid = i // ncols
colid = i % ncols
axi.set_title("row:"+str(rowid)+",col:"+str(colid))
# You can access the axes by row_id, col_id.
# Now let's plot on ax[row_id][col_id] of your choice
ax[0][1].plot(Y,X,color='red') # plot 2nd line in red
ax[2][0].plot(Y,X,color='green') # plot 2nd line in green
plt.tight_layout(True)
plt.show()
输出图:
答案 3 :(得分:0)