Closed
Description
Bug summary
matplotlib 3.5.0b1 breaks the following code, which runs fine on 3.4.3
The crash happens while running the last line:
cbar.ax.set_xticklabels(cbar.ax.get_xticklabels())
Admittedly this line seems like it should not do anything and certainly not produce an error.
In practice, my actual application contains the following:
cbar.ax.set_xticklabels(cbar.ax.get_xticklabels(), rotation=45)
which looks more like a hack than a supported usage of matplotlib's api, so I'd be happy to change it but I was not yet able to find a cleaner way to perform that rotation.
Still, no matter how untidy my application is, I'm fairly convinced that breaking it is a bug.
Code for reproduction
import matplotlib.pyplot as plt
import numpy as np
x, y = np.mgrid[1:100, 1:100]
z = np.random.random_sample(x.shape)
fig, ax = plt.subplots()
im = ax.contourf(x, y, z, levels=50)
cbar = fig.colorbar(im, orientation='horizontal')
cbar.ax.set_xticklabels(cbar.ax.get_xticklabels())
Actual outcome
Traceback
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /private/tmp/dustyn/t_mpl.py:11 in <module> │
│ │
│ 8 │
│ 9 im = ax.contourf(x, y, z, levels=50) │
│ 10 cbar = fig.colorbar(im, orientation='horizontal') │
│ ❱ 11 cbar.ax.set_xticklabels(cbar.ax.get_xticklabels()) │
│ 12 │
│ │
│ /Users/robcleme/.pyenv/versions/3.9.6/envs/mpl35_tmp/lib/python3.9/site-packages/matplotlib/axes │
│ /_base.py:75 in wrapper │
│ │
│ 72 │ │ get_method = attrgetter(f"{self.attr_name}.{self.method_name}") │
│ 73 │ │ │
│ 74 │ │ def wrapper(self, *args, **kwargs): │
│ ❱ 75 │ │ │ return get_method(self)(*args, **kwargs) │
│ 76 │ │ │
│ 77 │ │ wrapper.__module__ = owner.__module__ │
│ 78 │ │ wrapper.__name__ = name │
│ │
│ /Users/robcleme/.pyenv/versions/3.9.6/envs/mpl35_tmp/lib/python3.9/site-packages/matplotlib/axis │
│ .py:1798 in _set_ticklabels │
│ │
│ 1795 │ │ """ │
│ 1796 │ │ if fontdict is not None: │
│ 1797 │ │ │ kwargs.update(fontdict) │
│ ❱ 1798 │ │ return self.set_ticklabels(labels, minor=minor, **kwargs) │
│ 1799 │ │
│ 1800 │ def _set_tick_locations(self, ticks, *, minor=False): │
│ 1801 │ │ # see docstring of set_ticks │
│ │
│ /Users/robcleme/.pyenv/versions/3.9.6/envs/mpl35_tmp/lib/python3.9/site-packages/matplotlib/axis │
│ .py:1720 in set_ticklabels │
│ │
│ 1717 │ │ │ # Passing [] as a list of ticklabels is often used as a way to │
│ 1718 │ │ │ # remove all tick labels, so only error for > 0 ticklabels │
│ 1719 │ │ │ if len(locator.locs) != len(ticklabels) and len(ticklabels) != 0: │
│ ❱ 1720 │ │ │ │ raise ValueError( │
│ 1721 │ │ │ │ │ "The number of FixedLocator locations" │
│ 1722 │ │ │ │ │ f" ({len(locator.locs)}), usually from a call to" │
│ 1723 │ │ │ │ │ " set_ticks, does not match" │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
ValueError: The number of FixedLocator locations (51), usually from a call to set_ticks, does not match the number of ticklabels (9).
Expected outcome
a boring image :)
Operating system
OS/X
Matplotlib Version
.5.0b1
Matplotlib Backend
MacOSX
Python version
3.9.6
Jupyter version
N/A
Other libraries
No response
Installation
pip
Conda channel
No response