TypeError AxesSubplot object does not support indexing

0 votes

I have a question about an error I receive when looping to plot multiple subplots from a data frame.

My data frame has many columns, of which I loop over to have a subplot of each column.

This is my code

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

I get the plot produced fine, but also an empty frame and the error:

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

I can't see where this error comes from if the first plot is produced fine, or why the second figure is produced?

May 7, 2020 in Python by kartik
• 37,520 points
21,327 views

1 answer to this question.

0 votes

Hello ,

  • If you plot multiple subplots, the plt.subplots() returns the axes in an array, that array allows indexing like you do with ax[plot]. When only 1 subplot is created, by default it returns the axes itself, not the axes within an array.
  • So your error occurs when len(channels) equals 1. You can suppress this behavior by setting squeeze=False in the .subplots() command. This forces it to always return a 'Rows x Cols' sized array with the axes, even if its a single one.

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

By adding the squeeze keyword you always get a 2D array in return, so the indexing for a subplot changes to ax[plot,0]. I have also specifically added the amount of columns .

Thank You!

answered May 7, 2020 by Niroj
• 82,840 points

Related Questions In Python

0 votes
1 answer

'str' object does not support item assignment

In Python, strings are not very mutable ...READ MORE

answered Feb 22, 2022 in Python by Aditya
• 7,680 points
1,349 views
0 votes
0 answers

TypeError: 'type' object is not subscriptable when indexing in to a dictionary

I use dict to shorten things as ...READ MORE

May 24, 2022 in Python by Kichu
• 19,040 points
1,378 views
0 votes
1 answer

print(instance(0).id) TypeError: 'list' object is not callable

Hey @Suraj, For me its working fine. ...READ MORE

answered Jan 18, 2019 in Python by Priyaj
• 58,020 points
2,948 views
0 votes
1 answer

Python TypeError: 'list' object is not callable.

The error says the list is not ...READ MORE

answered Feb 9, 2019 in Python by Omkar
• 69,220 points
29,196 views
0 votes
2 answers
+1 vote
2 answers

how can i count the items in a list?

Syntax :            list. count(value) Code: colors = ['red', 'green', ...READ MORE

answered Jul 7, 2019 in Python by Neha
• 330 points

edited Jul 8, 2019 by Kalgi 4,434 views
0 votes
1 answer
+1 vote
1 answer

Error:Getting Site Matching Query Does Not Exist Error after creating django admin

Hello @kartik, The Site object for your Django project is ...READ MORE

answered Jun 22, 2020 in Python by Niroj
• 82,840 points
12,543 views
0 votes
1 answer
webinar REGISTER FOR FREE WEBINAR X
REGISTER NOW
webinar_success Thank you for registering Join Edureka Meetup community for 100+ Free Webinars each month JOIN MEETUP GROUP