用于显示一个图的Python子图

时间:2019-03-22 17:42:53

标签: python matplotlib ipython spyder

当我使用子图并尝试使用以下子图仅绘制一个图形时,会出现错误:

  

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

4 个答案:

答案 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是单个子图,而不是多个子图的数组。

要避免此问题,并且要使用相同的代码而无需事先知道nrowsncols,请使用 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)

flatnumpy数组的属性,它返回迭代器。例如,如果您有一个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属性将返回相同的数组。
  • ncolsnrows的值都大于1,您将得到2d数组中的轴,在这种情况下,flat属性将返回展平的数组。
  • ncolsnrows都设为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和轴列表axax列表的形状为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()

输出图:

enter image description here

答案 3 :(得分:0)

您可以使用ax.ravel()ax.flatten()。下面是一个简单的示例

import matplotlib.pyplot as plt

fig, ax = plt.subplots(nrows=2, ncols=3, figsize=(8, 6))

# for i, ax in enumerate(ax.flatten()):
for i, ax in enumerate(ax.ravel()):
    ax.plot([1,2,3], color='k')
plt.show()

enter image description here