Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Plotting fails when using subplot grid + manual axis #11556

Closed
jakevdp opened this issue Nov 9, 2015 · 6 comments
Closed

Plotting fails when using subplot grid + manual axis #11556

jakevdp opened this issue Nov 9, 2015 · 6 comments
Labels
Milestone

Comments

@jakevdp
Copy link
Contributor

jakevdp commented Nov 9, 2015

The following code raises an error (tested on pandas 0.17.0, matplotlib 1.4.3, and Python 3.4.2)

>>> fig, ax = plt.subplots()
>>> fig.add_axes([0.2, 0.2, 0.2, 0.2])
>>> pd.Series(np.random.rand(100)).plot(ax=ax)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-80531efe48c4> in <module>()
      8 fig, ax = plt.subplots()
      9 inset = fig.add_axes([0.2, 0.2, 0.2, 0.2])
---> 10 data.plot(ax=ax)

/Users/jakevdp/anaconda/envs/python3.4/lib/python3.4/site-packages/pandas/tools/plotting.py in __call__(self, kind, ax, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, label, secondary_y, **kwds)
   3491                            colormap=colormap, table=table, yerr=yerr,
   3492                            xerr=xerr, label=label, secondary_y=secondary_y,
-> 3493                            **kwds)
   3494     __call__.__doc__ = plot_series.__doc__
   3495 

/Users/jakevdp/anaconda/envs/python3.4/lib/python3.4/site-packages/pandas/tools/plotting.py in plot_series(data, kind, ax, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, label, secondary_y, **kwds)
   2581                  yerr=yerr, xerr=xerr,
   2582                  label=label, secondary_y=secondary_y,
-> 2583                  **kwds)
   2584 
   2585 

/Users/jakevdp/anaconda/envs/python3.4/lib/python3.4/site-packages/pandas/tools/plotting.py in _plot(data, x, y, subplots, ax, kind, **kwds)
   2378         plot_obj = klass(data, subplots=subplots, ax=ax, kind=kind, **kwds)
   2379 
-> 2380     plot_obj.generate()
   2381     plot_obj.draw()
   2382     return plot_obj.result

/Users/jakevdp/anaconda/envs/python3.4/lib/python3.4/site-packages/pandas/tools/plotting.py in generate(self)
    990             self._post_plot_logic_common(ax, self.data)
    991             self._post_plot_logic(ax, self.data)
--> 992         self._adorn_subplots()
    993 
    994     def _args_adjust(self):

/Users/jakevdp/anaconda/envs/python3.4/lib/python3.4/site-packages/pandas/tools/plotting.py in _adorn_subplots(self)
   1141                                 naxes=nrows * ncols, nrows=nrows,
   1142                                 ncols=ncols, sharex=self.sharex,
-> 1143                                 sharey=self.sharey)
   1144 
   1145         for ax in self.axes:

/Users/jakevdp/anaconda/envs/python3.4/lib/python3.4/site-packages/pandas/tools/plotting.py in _handle_shared_axes(axarr, nplots, naxes, nrows, ncols, sharex, sharey)
   3378                 layout = np.zeros((nrows+1,ncols+1), dtype=np.bool)
   3379                 for ax in axarr:
-> 3380                     layout[ax.rowNum, ax.colNum] = ax.get_visible()
   3381 
   3382                 for ax in axarr:

AttributeError: 'Axes' object has no attribute 'rowNum'
@jorisvandenbossche
Copy link
Member

I think this is a duplicate of #11520 (or at least related to), i.e. we assume in the code that the ax is an AxesSubplot instead of a plain Axes

@jakevdp
Copy link
Contributor Author

jakevdp commented Nov 9, 2015

In this case the ax actually is an AxesSubplot. It's the very presence of another non-subplot axes that causes the error. That is, if you comment out the line:

fig, ax = plt.subplots()
# fig.add_axes([0.2, 0.2, 0.2, 0.2])
pd.Series(np.random.rand(100)).plot(ax=ax)

then there is no error.

@jorisvandenbossche
Copy link
Member

Ah, yes, I missed the fact that it was not the add_axes created ax you passed to plot.

But in any case, the underlying issue is still the same, that in adorn_subplots all axes of the figure are inspected and assumed to be AxesSubplots. But because of the this, eg skipping this step if the supplied ax is not a SubplotAxes, will not be sufficient to fix this.

@jorisvandenbossche
Copy link
Member

@sinhrks @TomAugspurger @JanSchulz (you did quite a lot of work on this in #9740)

Maybe the easiest fix for this problem and of #11520 is that we only apply all the specific handling in _handle_shared_axes to actual SubplotAxes, and disregard of plain Axes? (but not really sure about its implications in all possible corner cases)

@jorisvandenbossche
Copy link
Member

What I mean is something like this: f906c08 This fixes at least the problem @jakevdp experiences

@jreback
Copy link
Contributor

jreback commented Nov 15, 2015

closed by #11561

@jreback jreback closed this as completed Nov 15, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants