web-dev-qa-db-ja.com

ループしてサブプロットを作成するときのエラー

ループしてデータフレームから複数のサブプロットをプロットするときに受け取るエラーについて質問があります。

私のデータフレームには多くの列があり、そのうちの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番目の図が作成されているのか、このエラーの原因がわかりません。

洞察をありがとう

18

複数のサブプロットをプロットする場合、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)を具体的に追加しました。

57
Rutger Kassies