Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python plt.subplot()中的轴是一个;“numpy.ndarray”;对象,并且没有属性“;“地块”;_Python_Numpy_Matplotlib_Multidimensional Array_Subplot - Fatal编程技术网

Python plt.subplot()中的轴是一个;“numpy.ndarray”;对象,并且没有属性“;“地块”;

Python plt.subplot()中的轴是一个;“numpy.ndarray”;对象,并且没有属性“;“地块”;,python,numpy,matplotlib,multidimensional-array,subplot,Python,Numpy,Matplotlib,Multidimensional Array,Subplot,如果您试图理解错误消息,下面的信息可能是多余的。请从阅读开始 通过@user707650 使用MatPlotLib,我需要一个可概括的脚本,它可以从我的数据创建以下内容 包含A子图的窗口,其排列方式为每列有b子图。我希望能够更改a和b的值 如果我有2a子批次的数据,我需要两个窗口,每个窗口都有前面描述的“a子批次按照b每列子批次排列” 我正在绘制的x和y数据是存储在np.Array中的浮点数据,其结构如下: 所有绘图的x数据始终相同,长度为5 'x_vector': [0.000, 0.00

如果您试图理解错误消息,下面的信息可能是多余的。请从阅读开始 通过@user707650

使用MatPlotLib,我需要一个可概括的脚本,它可以从我的数据创建以下内容

包含A子图的窗口,其排列方式为每列有b子图。我希望能够更改ab的值

如果我有2a子批次的数据,我需要两个窗口,每个窗口都有前面描述的“a子批次按照b每列子批次排列”

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

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

     'x_vector': [0.000, 0.005, 0.010, 0.020, 0.030, 0.040]
    
  • 所有图的y数据存储在y_向量中,其中第一个图的数据存储在索引0到5处。第二个图的数据存储在索引6到11处。第三个情节是12-18,第四个情节是19-24,依此类推

对于这个数据集,我总共有91个图(即91*6=546个值存储在y_向量中)

尝试:

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'
导入matplotlib.pyplot作为plt
#选项:
绘图_tot=14#绘图总数。实际上,将有7*13=91个地块。
位置_of_ydata=6#第n个图的值可以在索引'n*6'到'n*6+6'的y_向量中找到。
plots_window=7#每个窗口的打印总数。
行数=2#行数,即每列的子批次数。
#计算列数:
prim\u cols=打印窗口/行
额外成本=0
如果打印窗口%rows>0:
额外成本=1
cols=原始cols+额外cols
打印“cols:”,cols
打印“行:”,行
#绘图:
n=0
x=0
图,ax=plt.子批次(行、列)

当x通过简单地打印
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

注意:如果使用N×1图,则有
x,例如,如果您喜欢
fig,ax=plt.subplot(3,1)
,那么请喜欢
ax[plot\u count]。plot(…)

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

fig, axes = plt.subplots(nrows=1, ncols=2)
for axis in axes:
    print(type(axis))
您将得到一个matplotlib对象,它实际上是一个1D数组,可以使用单个索引(即轴[0]、轴[1]…等)遍历该数组。但如果你这样做了

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

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

轴是二维的,而不是一维的,因此不能使用一个循环进行迭代。您还需要一个循环:

 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)

出现错误。

导入numpy无关紧要:matplotlib(pyplot)已经在幕后完成了这项工作,因为它是matplotlib的主要依赖项。