Python plt.subplot()中的轴是一个;“numpy.ndarray”;对象,并且没有属性“;“地块”;
如果您试图理解错误消息,下面的信息可能是多余的。请从阅读开始 通过@user707650 使用MatPlotLib,我需要一个可概括的脚本,它可以从我的数据创建以下内容 包含A子图的窗口,其排列方式为每列有b子图。我希望能够更改a和b的值 如果我有2a子批次的数据,我需要两个窗口,每个窗口都有前面描述的“a子批次按照b每列子批次排列” 我正在绘制的x和y数据是存储在np.Array中的浮点数据,其结构如下: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
- 所有绘图的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,依此类推
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的主要依赖项。