Stuffing a pandas DataFrame.plot into a matplotlib subplot

前端 未结 2 1591
孤街浪徒
孤街浪徒 2020-12-23 23:04

My brain hurts

I have some code that produces 33 graphics in one long column

#fig,axes = plt.subplots(nrows=11,ncols=3,figsize=(18,50))
accountList =         


        
相关标签:
2条回答
  • 2020-12-23 23:49

    Expanding on Bonlenfum's answer, here's a way to do it with a groupby clause:

    accountList = training.account.unique()
    accountList.sort()
    for i, group in training.groupby('account'):
        ix = np.where(accountList==i)[0][0]
        ix = np.unravel_index(ix, ax.shape)
        group.plot(ax=ax[ix],title = i)
    

    This way we can use the title in our graphs, and also accommodates groups with values that are missing (i.e. 1, 3, 8)

    0 讨论(0)
  • 2020-12-24 00:01

    The axes handles that subplots returns vary according to the number of subplots requested:

    • for (1x1) you get a single handle,
    • for (n x 1 or 1 x n) you get a 1d array of handles,
    • for (m x n) you get a 2d array of handles.

    It appears that your problem arises from the change in interface from the 2nd to 3rd cases (i.e. 1d to 2d axis array). The following snippets can help if you don't know ahead of time what the array shape will be.

    I have found numpy's unravel_index useful for iterating over the axes, e.g.:

    ncol = 3 # pick one dimension
    nrow = (len(accountList)+ ncol-1) / ncol # make sure enough subplots
    fig, ax = plt.subplots(nrows=nrow, ncols=ncol) # create the axes
    
    for i in xrange(len(accountList)):   # go over a linear list of data
      ix = np.unravel_index(i, ax.shape) # compute an appropriate index (1d or 2d)
    
      accountList[i].plot( ..., ax=ax[ix])   # pandas method plot
      ax[ix].plot(...)   # or direct axis object method plot (/scatter/bar/...)
    

    You can also reshape the returned array so that it is linear (as I used in this answer):

    for a in ax.reshape(-1):
        a.plot(...)
    

    As noted in the linked solution, axs needs a bit of massaging if you might have 1x1 subplots (and then receive a single axes handle; axs = np.array(axs) is enough).


    And after reading the docs more carefully (oops), setting squeeze=False forces subplots to return a 2d matrix regardless of the choices of ncols/nrows. (squeeze defaults to True).

    If you do this, you can either iterate over two dimensions (if it is natural for your data), or use either of the above approaches to iterate over your data linearly and computing a 2d index into ax.

    0 讨论(0)
提交回复
热议问题