Skip to content

axes.locator_params fails with LogLocator (and most Locator subclasses) #3658

Closed

Description

@pierre-haessig

There is a "communication" issue between the axes.locator_params and the LogLocator class:

plt_scale = 'log'
#plt_scale = 'linear'

fig, (ax1) = plt.subplots(1, 1)

ax1.set(yscale=plt_scale)

# works for linear scale, not for log:
ax1.axes.locator_params('y', nbins=5)

Result:

AttributeError                            Traceback (most recent call last)
<ipython-input-74-3492af5f93c8> in <module>()
      7
      8 # works for linear scale, not for log:
----> 9 ax1.axes.locator_params('y', nbins=5)

/home/pierre/anaconda/lib/python2.7/site-packages/matplotlib/axes.pyc in locator_params(self, axis, tight, **kwargs)
   2305             self.xaxis.get_major_locator().set_params(**kwargs)
   2306         if _y:
-> 2307             self.yaxis.get_major_locator().set_params(**kwargs)
   2308         self.autoscale_view(tight=tight, scalex=_x, scaley=_y)
   2309

AttributeError: 'LogLocator' object has no attribute 'set_params'

What I get from the traceback is that locator_params method forwards the locator attributes (in my case nbins) to the actual locator object via its set_params method. And this method is missing from LogLocator. (set_params is indeed defined in MaxNLocator https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/ticker.py#L1297)

So my question is: shouldn't all Locator subclasses have a set_params method ?

(and then, my code example could raise a different error, or maybe a warning, complaining that LogLocator makes in fact no use of an nbins parameter!)

best,
Pierre

Activity

  1. modified the milestones: v1.4.x, on Oct 17, 2014
  2. tacaswell commented on Oct 17, 2014

    @tacaswell
    Member

    Thanks for the bug report.

    It turns out that only the MaxNLocater (and its sub-class AutoLocator) have set_params. This limitation is noted in the docstring (http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.locator_params).

    Would you be interested in doing this generalization? The easiest path would be to add a set_params to Locator that is a no-op + warning (so the code stops dying!) and then to add sensible implementations to each of the Locator classes.

  3. pierre-haessig commented on Oct 30, 2014

    @pierre-haessig
    SponsorContributorAuthor

    Interested, yes, but I don't have a proper time window for doing the work... :-(

    Should this be marked with 'API consistency' and 'low hanging fruit' labels ?

  4. efiring commented on Oct 30, 2014

    @efiring
    Member

    Good idea. Done.

  5. added a commit that references this issue on Mar 3, 2015
  6. tacaswell commented on Feb 15, 2016

    @tacaswell
    Member

    Closed by #4172 / #4191

  7. modified the milestones: v1.5.0, on Feb 16, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    API: consistencyConsistency of the matplotlib API, including naming, behavior, defaults, …

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions