Ошибка при циклировании для создания подзаголовков

У меня вопрос о ошибке, которую я получаю при циклировании для построения нескольких подзадач из кадра данных.

В моем кадре данных есть много столбцов, из которых я петлю, чтобы иметь подзаголовок каждого столбца.

Это мой код

 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

Я не вижу, откуда эта ошибка возникает, если получается первый график, или почему создается вторая цифра?

Спасибо за понимание.

Ответ 1

Если вы создаете несколько подсетей, plt.subplots() возвращает оси в массиве, этот массив позволяет индексировать, как вы делаете с ax[plot]. Когда создается только 1 subplot, по умолчанию он возвращает сами оси, а не оси в массиве.

Итак, ваша ошибка возникает, когда len(channels) равно 1. Вы можете подавить это поведение, установив squeeze=False в команду .subplots(). Это заставляет его всегда возвращать массив размеров "Строки x Cols" с осями, даже если он один.

Итак:

 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).