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

时间:2016-06-22 12:17:16

标签: python-2.7 numpy multidimensional-array matplotlib subplot

  

如果您尝试了解错误消息,则以下信息可能是多余的。请首先阅读the answer    通过 @ user707650

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

包含 a 子图的窗口,以便每列有 b 子图。我希望能够更改 a b 的值。

如果我有 2a 子图的数据,我想要2个窗口,每个窗口都有前面描述的" a 根据 b 每个子列的子图排列的子图"。

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

  • 所有绘图的x数据始终相同,长度为5。

     'x_vector': [0.000, 0.005, 0.010, 0.020, 0.030, 0.040]
    
  • 所有绘图的y数据都存储在 y_vector 中,其中第一个绘图的数据存储在索引0到5中。第二个绘图的数据存储在索引6到11.第三个情节得到12-18,第四个得到19-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

我收到以下错误:

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'

4 个答案:

答案 0 :(得分:25)

如果您只需打印private DotView getChildForTouch(TableLayout table, float x, float y) { final int childWidth = ((TableRow) table.getChildAt(0)) .getChildAt(0).getWidth(); final int childHeight = ((TableRow) table.getChildAt(0)) .getChildAt(0).getHeight(); // find out the row of the child int row = 0; do { if (y > childHeight) { row++; y -= childHeight; } else { break; } } while (y > childHeight); int column = 0; do { if (x > childWidth) { column++; x -= childWidth; } else { break; } } while (x > childWidth); return (DotView) ((TableRow) table.getChildAt(row)) .getChildAt(column); } 来调试程序,就会很快发现ax是一个二维数组:行的一个维度,列的一个维度。

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

AxesSubplot

如果您想以现在的方式迭代子图,首先展平ax[1,1].plot(...)

ax

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

ax

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

ax = ax.T.flatten()

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

答案 1 :(得分:1)

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

fig, axes = plt.subplots(nrows=2, ncols=2)
for axis in axes:
    print(type(axis))

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

{{1}}

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

答案 2 :(得分:0)

如果您使用N by 1图,例如,如果您喜欢fig, ax = plt.subplots(3, 1),那么请喜欢ax[plot_count].plot(...)

答案 3 :(得分:0)

轴位于2-d,而不是1-d,因此您无法使用一个循环进行迭代。您还需要一个循环:

 fig,axes=plt.subplots(nrows=2,ncols=2)
    plt.tight_layout()
    for ho in axes:
        for i in ho:
            i.plot(a,a**2)

这没问题,但是如果我尝试:

for i in axes:
      i.plot(a,a**2)

发生错误。