来自plt.subplots()的轴是一个"numpy.ndarray"对象,没有属性"plot"

Luc*_*tor 19 numpy matplotlib multidimensional-array python-2.7 subplot

如果您尝试了解错误消息,则以下信息可能是多余的.请阅读开始的答案@ user707650.

使用MatPlotLib,我想要一个可推广的脚本,它可以从我的数据中创建以下内容.

含有窗口一个布置副区,以便有b每列副区.我希望能够改变ab的值.

如果我有用于数据2a中副区,我想2窗口,每个窗口与先前描述的" 一个根据布置副区b每列次要情节".

我正在绘制的x和y数据是存储在np.arrays中的浮点数,结构如下:

  • 对于所有图,x数据始终相同,长度为5.

     'x_vector': [0.000, 0.005, 0.010, 0.020, 0.030, 0.040]
    
    Run Code Online (Sandbox Code Playgroud)
  • 所有图的y数据都存储在y_vector中,其中第一个图的数据存储在索引0到5中.第二个图的数据存储在索引6到11中.第三个图得到12-18,第四个图得到-24,依此类推.

总的来说,对于这个数据集,我有91个图(即91*6 = 546个值存储在y_vector中).

尝试:

import matplotlib.pyplot as plt

# Options:
plots_tot = 14 # Total number of plots. In reality there is going to be 7*13 = 91 plots.
location_of_ydata = 6 # The values for the n:th plot can be found in the y_vector at index 'n*6' through 'n*6 + 6'.
plots_window = 7 # Total number of plots per window.
rows = 2 # Number of rows, i.e. number of subplots per column.

# Calculating number of columns:
prim_cols = plots_window / rows
extra_cols = 0
if plots_window % rows > 0:
    extra_cols = 1
cols = prim_cols + extra_cols

print 'cols:', cols
print 'rows:', rows

# Plotting:
n=0
x=0
fig, ax = plt.subplots(rows, cols)
while x <= plots_tot:
    ax[x].plot(x_vector, y_vector[n:(n+location_of_ydata)], 'ro')
    if x % plots_window == plots_window - 1:
        plt.show() # New window for every 7 plots.
    n = n+location_of_ydata
    x = x+1
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

cols: 4
rows: 2
Traceback (most recent call last):
  File "Script.py", line 222, in <module>
    ax[x].plot(x_vector, y_vector[n:(n+location_of_ydata)], 'ro')
AttributeError: 'numpy.ndarray' object has no attribute 'plot'
Run Code Online (Sandbox Code Playgroud)

小智 38

如果通过简单打印调试程序ax,您将很快发现它ax是一个二维数组:行的一个维度,列的一个维度.

因此,您需要索引两个索引ax来检索实际AxesSubplot实例,例如:

ax[1,1].plot(...)
Run Code Online (Sandbox Code Playgroud)

如果您想以现在的方式迭代子图,ax首先展平:

ax = ax.flatten()
Run Code Online (Sandbox Code Playgroud)

现在ax是一维数组.我不知道行或列是否先穿过,但如果它是错误的,请使用转置:

ax = ax.T.flatten()
Run Code Online (Sandbox Code Playgroud)

当然,到目前为止,简单地创建每个子图更有意义,因为它已经有一个索引,另外两个数字是固定的:

for x < plots_tot:
     ax = plt.subplot(nrows, ncols, x+1)
Run Code Online (Sandbox Code Playgroud)

注意:你有x <= plots_tot,但是x从0开始,你将获得IndexError当前代码的下一个(在展平你的数组之后).(不幸的是)Matplotlib为次要情节1索引.我更喜欢使用0索引变量(Python样式),只需+1为子图索引添加(如上所述).


blu*_*oid 6

这里的问题在于 matplotlib 如何处理子图。只需执行以下操作:

fig, axes = plt.subplots(nrows=1, ncols=2)
for axis in axes:
    print(type(axis))
Run Code Online (Sandbox Code Playgroud)

您将获得一个 matplotlib 对象,它实际上是一个一维数组,可以使用单个索引(即轴 [0]、轴 [1]...等)进行遍历。但是如果你这样做

fig, axes = plt.subplots(nrows=2, ncols=2)
for axis in axes:
    print(type(axis))
Run Code Online (Sandbox Code Playgroud)

您将得到一个 numpy ndarray 对象,它实际上是一个二维数组,只能使用 2 个索引(即轴 [0, 0]、轴 [1, 0]...等)进行遍历。因此,请注意如何合并 for 循环以遍历轴对象。