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

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

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

Это мой код

 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

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

Спасибо за любое понимание


person Ashleigh Clayton    schedule 13.11.2013    source источник


Ответы (1)


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

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

So:

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

person Rutger Kassies    schedule 13.11.2013