Closed
Description
Bug report
Bug summary
The following codes fail in matplotlib 3.1.1, while work properly in 3.0.3
case 1
Code for reproduction
import pandas as pd
from matplotlib import pyplot as plt
df = pd.DataFrame({"x":[1,2,3],"width":[.2,.4,.6]},index=[1,2,3])
plt.figure()
plt.bar(df.x, 1, width=df.width)
plt.show()
Actual outcome
Traceback (most recent call last):
File "/Desktop/fail_example.py", line 7, in <module>
plt.bar(df.x, 1, width=df.width)
File "/.pyenv/versions/3.7.3/lib/python3.7/site-packages/matplotlib/pyplot.py", line 2440, in bar
**({"data": data} if data is not None else {}), **kwargs)
File "/.pyenv/versions/3.7.3/lib/python3.7/site-packages/matplotlib/__init__.py", line 1601, in inner
return func(ax, *map(sanitize_sequence, args), **kwargs)
File "/.pyenv/versions/3.7.3/lib/python3.7/site-packages/matplotlib/axes/_axes.py", line 2430, in bar
label='_nolegend_',
File "/.pyenv/versions/3.7.3/lib/python3.7/site-packages/matplotlib/patches.py", line 707, in __init__
Patch.__init__(self, **kwargs)
File "/.pyenv/versions/3.7.3/lib/python3.7/site-packages/matplotlib/patches.py", line 89, in __init__
self.set_linewidth(linewidth)
File "/.pyenv/versions/3.7.3/lib/python3.7/site-packages/matplotlib/patches.py", line 368, in set_linewidth
self._linewidth = float(w)
Expected outcome
Outcome in 3.0.3:
case 2
Code for reproduction
import pandas as pd
from matplotlib import pyplot as plt
df = pd.DataFrame({"x":[1,3,10]},index=[1000,2000,3000])
plt.figure()
plt.bar(df.x, 1, width=.2)
plt.show()
Expected outcome
Outcome in 3.0.3:
Matplotlib version
- Operating system: MacOSX
- Matplotlib version: 3.1.1 (installed from pip)
- Matplotlib backend (
print(matplotlib.get_backend())
): MacOSX - Python version: 3.7.3
- Jupyter version (if applicable):
- Other libraries: pandas 0.24.2
Cause of the bug
_axes.py, line 2363 in bar:
x0 = x
x = np.asarray(self.convert_xunits(x))
width = self._convert_dx(width, x0, x, self.convert_xunits)
_axes.py, line 2166 in _convert_dx:
try:
x0 = x0[0]
except (TypeError, IndexError, KeyError):
x0 = x0
I guess x0 is expected to be a scalar after this line, However when x0 is an int-indexed (and 0 is not in its indices) pandas.Series, it is continued to be pandas.Series and causes chained disorders to end in the error above.
To evidence, they worked properly when rewritten as (ugly!):
try:
x0 = x0[0]
except (TypeError, IndexError, KeyError):
try:
x0 = x0.iat[0]
except:
x0 = x0