ループしてデータフレームから複数のサブプロットをプロットするときに受け取るエラーについて質問があります。
私のデータフレームには多くの列があり、そのうちの1つをループして各列のサブプロットを表示します。
これは私のコードです
def plot(df):
channels=[]
for i in df:
channels.append(i)
fig, ax = plt.subplots(len(channels), sharex=True, figsize=(50,100))
plot=0
for j in df:
ax[plot].plot(df["%s" % j])
ax[plot].set_xlabel('%s' % j)
plot=plot+1
plt.tight_layout()
plt.show()
プロットがうまく生成されますが、空のフレームとエラーも表示されます。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\AClayton\WinPython-64bit-2.7.5.3\python-2.7.5.AMD64\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 538, in runfile
execfile(filename, namespace)
File "C:/Users/AClayton/Desktop/Data/TS.py", line 67, in <module>
plot(all_data)
File "C:/Users/AClayton/Desktop/Data/TS.py", line 49, in plot
ax[plot].plot(reader["%s" % j])
TypeError: 'AxesSubplot' object does not support indexing
最初のプロットがうまく作成されている場合、またはなぜ2番目の図が作成されているのか、このエラーの原因がわかりません。
洞察をありがとう
複数のサブプロットをプロットする場合、plt.subplots()
は軸を配列で返します。その配列により、_ax[plot]
_と同じようにインデックスを作成できます。 1つのサブプロットのみが作成される場合、デフォルトでは、配列内のAxesではなく、Axes自体を返します。
したがって、len(channels)
が1に等しいときにエラーが発生します。.subplots()
コマンドで_squeeze=False
_を設定すると、この動作を抑制できます。これにより、たとえ1つであっても、常に「行x列」サイズの配列を軸とともに返すように強制します。
そう:
_ def plot(df):
channels=[]
for i in df:
channels.append(i)
fig, ax = plt.subplots(len(channels),1, sharex=True, figsize=(50,100), squeeze=False)
plot=0
for j in df:
ax[plot,0].plot(df["%s" % j])
ax[plot,0].set_xlabel('%s' % j)
plot=plot+1
plt.tight_layout()
plt.show()
_
squeeze
キーワードを追加すると、常に2D配列が返されるため、サブプロットのインデックスが_ax[plot,0]
_に変わります。また、列の数(この場合は1)を具体的に追加しました。