1. ホーム
  2. python

[解決済み] plt.subplots() の Axes は "numpy.ndarray" オブジェクトで、"plot" という属性を持っていない。

2022-02-07 01:27:56

質問

<ブロッククオート

エラーメッセージを理解しようとすると、以下の情報は余計なものになるかもしれません。まずは 答え によって ユーザー707650 .

MatPlotLib を使って、私のデータから以下のようなものを作成する、一般化できるスクリプトが欲しかったのです。

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

のデータがある場合、そのデータは 2a サブプロットでは、2つのウィンドウが必要で、それぞれに先に説明した " a に従って配置されたサブプロット。 b 列ごとのサブプロット"。

私がプロットしているxとyのデータはnp.arrayに格納されたfloatで、以下のような構造になっています。

  • 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'

解決方法は?

を表示させるだけでデバッグを行う場合 ax ということがすぐにわかります。 ax は2次元の配列で、1次元が行、1次元が列となります。

したがって ax を取得し、実際の AxesSubplot のように、インスタンスを作成します。

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 とはいえ x を0から始めると IndexError は、現在のコードで(配列を平坦化した後)次に進みます。Matplotlib は (残念ながら) サブプロットに対して 1-indexed です。私は 0 インデックスの変数(Python スタイル)を使うのが好きで、単に +1 をサブプロットインデックスとして使用します(上記のように)。