[Matplotlib-devel] Easier tick formatters
Todd
toddrjen at gmail.com
Mon Mar 9 20:28:25 EDT 2020
The PR is number 16715 [1]
https://github.com/matplotlib/matplotlib/pull/16715
On Mon, Mar 9, 2020 at 2:16 PM Thomas Caswell <tcaswell at gmail.com> wrote:
> It looks like something funny is going on with your branch (It looks like
> there are some extra rebased commits), but other than that it look like a
> good start.
>
> Could you please open a PR so it can go through the normal code review
> process / have CI run?
>
> Tom
>
> On Mon, Mar 9, 2020 at 10:45 AM Todd <toddrjen at gmail.com> wrote:
>
>> On Wed, Mar 4, 2020 at 10:03 PM Todd <toddrjen at gmail.com> wrote:
>>
>>> Currently setting up the tick formatting on matplotlib requires you to
>>> import a formatter from the ticker module, create an instance of that
>>> formatter, then pass that to the axis. This makes sense for complicated
>>> formatting. However, there are some obvious cases where we can probably
>>> infer the type of formatting someone wants to do if we are just given the
>>> formatter content. For example
>>>
>>> * '' is probably going to be the null formatter
>>> * A callable, besides a formatter instance, is probably going to be a
>>> function formatter
>>> * A sequence or numpy array is probably going to be an index or fixed
>>> formatter, depending on the locator
>>> * Any other string is probably going to be a format string formatter
>>> or string method formatter.
>>>
>>> So I think we could allow the `set_major_formatter` and `set_minor_formatter`
>>> to take certain sorts of inputs and create the formatter automatically for
>>> the user, making such cases much, much easier. Specifically, I propose the
>>> following inputs be accepted:
>>>
>>> * `None` sets it to the default formatter
>>> * A callable (besides a formatter instance) is set to be a
>>> FuncFormatter
>>> * An empty string, `''`, is set to be a NullFormatter
>>> * Any other string is a StrMethodFormatter
>>> * An abc.collections.Sequence subclass or numpy ndarray subclass is
>>> an IndexFormatter, unless the axis is using a FixedLocator in which case it
>>> is a FixedLocator. We could restrict this to just lists and numpy arrays
>>> only.
>>>
>>> Any thoughts?
>>>
>>
>> Based on the input I have gotten so far, I have made a simplified version
>> of the approach [1]. It only handles the cases for str and function (or
>> rather callable, but I call it a function in the documentation). These
>> seem to handle most use-cases reasonably well. As Antony pointed out, None
>> is potentially confusing, and as Thomas pointed out IndexFormatter is
>> deprecated. That left only the empty NullFormatter (with an empty str),
>> StrMethodFormatter (with any other str), and FuncFormatter (with a
>> callable).
>>
>> Antony made a good case that we should keep the number of approaches as
>> small as possible. Since the NullFormatter is trivially handled with an
>> empty str, and that is really what it is behind-the-scenes, that was an
>> obvious one to cut.
>>
>> Antony made the good case that any str could be handled with str.format.
>> I tried that approach initially, but the issue I ended up having is that,
>> although it is obvious to experienced Python users, it isn't as obvious to
>> newer users. That would mean I would need to properly communicate this
>> workaround to users in the documentation. However, my attempts to do this
>> ended up being longer, more complicated, and harder to understand than
>> simply implementing the str case directly. So I ended up keeping the str
>> and function approaches. Of course this decision is open to discussion.
>>
>> I also updated the documentation, tests, and examples to explain these
>> new features. Please take a look and let me know what you think.
>>
>> One open issue is that I did not change any examples currently using any
>> of these formatters, I only added the new approach. I think it might be
>> good to change some of the simpler examples of using formatters to use this
>> new feature in order to make formatters seem more approachable, but I
>> haven't done that yet.
>>
>> [1]
>> https://github.com/toddrjen/matplotlib/commit/673e4b32bb8849d1de7f1180d5a48b13d68a6f34
>> _______________________________________________
>> Matplotlib-devel mailing list
>> Matplotlib-devel at python.org
>> https://mail.python.org/mailman/listinfo/matplotlib-devel
>>
>
>
> --
> Thomas Caswell
> tcaswell at gmail.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-devel/attachments/20200309/15963fd7/attachment-0001.html>
More information about the Matplotlib-devel
mailing list