web-dev-qa-db-ja.com

plt.subplots()の軸は「numpy.ndarray」オブジェクトであり、属性「plot」はありません

エラーメッセージを理解しようとしている場合、以下の情報は不要な場合があります。 答え by@ user707650を読むことから始めてください。

MatPlotLibを使用して、データから次のものを作成する一般化可能なスクリプトが必要でした。

aサブプロットを含むウィンドウは、列ごとにbサブプロットがあるように配置されています。 aおよびbの値を変更できるようにしたい。

2aサブプロットのデータがある場合、2つのウィンドウが必要です。それぞれに前述の「ab列ごとのサブプロットに従って配置されたサブプロット」。

プロットしている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に格納されます。2番目のプロットのデータはインデックス6〜11に格納されます。 3番目のプロットには12〜18、4番目の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'
14
Lucubrator

単にaxを出力するだけでプログラムをデバッグすると、axが2次元配列であることがすぐにわかります。1つの次元が行、1つの列があります。

したがって、次のように、実際のaxインスタンスを取得するには、AxesSubplotにインデックスを付ける2つのインデックスが必要です。

ax[1,1].plot(...)

最初にaxを平坦化することにより、現在の方法でサブプロットを繰り返し処理する場合:

ax = ax.flatten()

そして今、axは1次元配列です。行または列が最初にステップスルーされるかどうかはわかりませんが、間違っている場合は転置を使用してください:

ax = ax.T.flatten()

もちろん、すでにサブインデックスが既にインデックスを持っているため、その場で各サブプロットを作成する方が合理的です。他の2つの数値は修正されています。

for x < plots_tot:
     ax = plt.subplot(nrows, ncols, x+1)

注:x <= plots_tot、ただし0から始まるxを使用すると、現在のコードでIndexErrorが取得されます(配列をフラット化した後)。 Matplotlibは、(残念ながら)サブプロットに対して1インデックスが付けられています。 0インデックスの変数(Pythonスタイル)を使用し、+1はサブプロットインデックス用です(上記と同様)。

33
user707650

N個のグラフを使用する場合、たとえばfig, ax = plt.subplots(3, 1)が好きなら、likeax[plot_count].plot(...)をしてください

0
Cloud Cho