Skip to content

matplotlibrc validates some parameters wrongly #16583

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

Closed
moritzschaefer opened this issue Feb 27, 2020 · 5 comments
Closed

matplotlibrc validates some parameters wrongly #16583

moritzschaefer opened this issue Feb 27, 2020 · 5 comments

Comments

@moritzschaefer
Copy link

Bug report

Bug summary

I would like to set how xticks are aligned. There is the ha (for horizontalalignment) parameter which controls this with the possible values 'left', 'center' and 'right'.
To globally set this parameter, I tried to set xtick.alignment in my .matplotlibrc config file.
However when setting it to 'left', I get an error (when I start ipython):

Bad val 'right' on line #27
"xtick.alignment : right
"
in file "/home/moritz/.config/matplotlib/matplotlibrc"
Key xtick.alignment: Unrecognized alignment string 'right': valid strings are ['center', 'top', 'bottom', 'baseline', 'center_baseline']

So I tried to set it to 'bottom' (to see what happens) and plotted a simple curve (see code below), but then I got a ValueError:

...
/usr/lib/python3.8/site-packages/matplotlib/text.py in init(self, x, y, text, color, verticalalignment, horizontalalignment, multialignment, fontproperties, rotation, linespacing, rotation_mode, usetex, wrap, **kwargs)
156 self.set_wrap(wrap)
157 self.set_verticalalignment(verticalalignment)
--> 158 self.set_horizontalalignment(horizontalalignment)
159 self._multialignment = multialignment
160 self._rotation = rotation

/usr/lib/python3.8/site-packages/matplotlib/text.py in set_horizontalalignment(self, align)
940 align : {'center', 'right', 'left'}
941 """
--> 942 cbook._check_in_list(['center', 'right', 'left'], align=align)
943 self._horizontalalignment = align
944 self.stale = True

/usr/lib/python3.8/site-packages/matplotlib/cbook/init.py in _check_in_list(values, **kwargs)
2189 for k, v in kwargs.items():
2190 if v not in values:
-> 2191 raise ValueError(
2192 "{!r} is not a valid value for {}; supported values are {}"
2193 .format(v, k, ', '.join(map(repr, values))))

ValueError: 'top' is not a valid value for align; supported values are 'center', 'right', 'left'

In conclusion, the matplotlibrc validation for the xtick.alignment parameter is bogus.

Code for reproduction

Either

xtick.alignment : top

Or

xtick.alignment : left

in .matplotlibrc

matplotlib.pyplot.plot([1,2,3], [5,3,9])

for provoking the ValueError (see above

Matplotlib version

  • Operating system: Arch Linux
  • Matplotlib version: 3.1.3
  • Matplotlib backend (print(matplotlib.get_backend())):
  • Python version: 3.8.1
@ImportanceOfBeingErnest
Copy link
Member

It looks like #7970 headed out to introduce a vertical-alignment parameter to y-ticklabels only. But then a rework of that in #8081 introduceda parameter for the vertical alignment for y-ticklabels and the horizontal alignment for x-ticklabels - except that validation is still for vertical-alignment only.

I suppose the easy fix is to just replace

'xtick.alignment': ['center',
['center', 'top', 'bottom', 'baseline', 'center_baseline']],

Such fix has to go on top of #16483 which is milestoned for 3.3, but given that the problem hasn't bothered anyone since 2.0.1, it might be ok to not hassle about backporting.

@MuhammadFarooq1234
Copy link
Contributor

If no one is working on this, I would like take a shot at it.

@timhoffm
Copy link
Member

timhoffm commented Mar 3, 2020

Go for it.

@MuhammadFarooq1234
Copy link
Contributor

MuhammadFarooq1234 commented Mar 6, 2020

Thanks, I've updated the rcsetup.py like so:

'xtick.alignment': ['center', ['center', 'right', 'left']]

and validated it works. As for unit testing, is there a way to test this other than using image comparison tests? Something like a "get_tick_alignment" of the axis or something like that?

@efiring
Copy link
Member

efiring commented May 6, 2020

Closed by #16727.

@efiring efiring closed this as completed May 6, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants