pydata / pydata/xarray

Date in matplotlib conversion does not handle "YYYY-MM-DD" format for xarray=0.21.1

Open
#6,263 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

topic-plotting usage question
Dominant language
Python
Stars
4.2k
Forks
1.4k
Avg merge
2d 15h
Merged PRs (30d)
14

Description

What happened?

When setting axis limits is in matplotlib.:

ax.set_xlim(["2002-01-03","2002-01-20"])

A conversion error is raised.


IndexError Traceback (most recent call last)
File C:\work\miniconda3\envs\XROMStest\lib\site-packages\matplotlib\axis.py:1507, in Axis.convert_units(self, x)
1506 try:
-> 1507 ret = self.converter.convert(x, self.units, self)
1508 except Exception as e:

File C:\work\miniconda3\envs\XROMStest\lib\site-packages\matplotlib\dates.py:1921, in _SwitchableDateConverter.convert(self, *args, **kwargs)
1920 def convert(self, *args, **kwargs):
-> 1921 return self._get_converter().convert(*args, **kwargs)

File C:\work\miniconda3\envs\XROMStest\lib\site-packages\matplotlib\dates.py:1850, in DateConverter.convert(value, unit, axis)
1844 """
1845 If value is not already a number or sequence of numbers, convert it
1846 with date2num.
1847
1848 The unit and axis arguments are not used.
1849 """
-> 1850 return date2num(value)

File C:\work\miniconda3\envs\XROMStest\lib\site-packages\matplotlib\dates.py:443, in date2num(d)
441 return d
--> 443 tzi = getattr(d[0], 'tzinfo', None)
444 if tzi is not None:
445 # make datetime naive:

IndexError: too many indices for array: array is 0-dimensional, but 1 were indexed

The above exception was the direct cause of the following exception:

ConversionError Traceback (most recent call last)
Input In [4], in
10 fig, ax = plt.subplots()
11 ax.plot(times, y)
---> 12 ax.set_xlim(["2002-01-03","2002-01-20"])

File C:\work\miniconda3\envs\XROMStest\lib\site-packages\matplotlib\axes_base.py:3689, in _AxesBase.set_xlim(self, left, right, emit, auto, xmin, xmax)
3686 right = xmax
3688 self._process_unit_info([("x", (left, right))], convert=False)
-> 3689 left = self._validate_converted_limits(left, self.convert_xunits)
3690 right = self._validate_converted_limits(right, self.convert_xunits)
3692 if left is None or right is None:
3693 # Axes init calls set_xlim(0, 1) before get_xlim() can be called,
3694 # so only grab the limits if we really need them.

File C:\work\miniconda3\envs\XROMStest\lib\site-packages\matplotlib\axes_base.py:3603, in _AxesBase._validate_converted_limits(self, limit, convert)
3592 """
3593 Raise ValueError if converted limits are non-finite.
3594
(...)
3599 The limit value after call to convert(), or None if limit is None.
3600 """
3601 if limit is not None:
-> 3603 converted_limit = convert(limit)
3604 if (isinstance(converted_limit, Real)
3605 and not np.isfinite(converted_limit)):
3606 raise ValueError("Axis limits cannot be NaN or Inf")

File C:\work\miniconda3\envs\XROMStest\lib\site-packages\matplotlib\artist.py:252, in Artist.convert_xunits(self, x)
250 if ax is None or ax.xaxis is None:
251 return x
--> 252 return ax.xaxis.convert_units(x)

File C:\work\miniconda3\envs\XROMStest\lib\site-packages\matplotlib\axis.py:1509, in Axis.convert_units(self, x)
1507 ret = self.converter.convert(x, self.units, self)
1508 except Exception as e:
-> 1509 raise munits.ConversionError('Failed to convert value(s) to axis '
1510 f'units: {x!r}') from e
1511 return ret

ConversionError: Failed to convert value(s) to axis units: '2002-01-03'

When we downgrade to xarray=0.20..2. axis limits are changed as expected.

What did you expect to happen?

ax.set_xlim should interpert dates of format "YYYY-MM-DD" correctly and scale the xaxis appropriately.

Minimal Complete Verifiable Example
import xarray as xr
import numpy as np
import matplotlib.pyplot as plt

times = np.arange(np.datetime64('2001-01-02'),
                      np.datetime64('2002-02-03'), np.timedelta64(75, 'm'))
y = np.random.randn(len(times))


fig, ax = plt.subplots()
ax.plot(times, y)
ax.set_xlim(["2002-01-03","2002-01-20"])
Relevant log output

No response

Anything else we need to know?

It appears that matplotlib uses a pandas date converter when using xarray 0.20.2 is imported but not for xarray 0.21.1.

Environment

INSTALLED VERSIONS

commit: None
python: 3.8.12 | packaged by conda-forge | (default, Oct 12 2021, 21:22:46) [MSC v.1916 64 bit (AMD64)]
python-bits: 64
OS: Windows
OS-release: 10
machine: AMD64
processor: Intel64 Family 6 Model 140 Stepping 1, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None
LOCALE: ('English_United States', '1252')
libhdf5: 1.12.1
libnetcdf: 4.8.1

xarray: 0.21.1
pandas: 1.4.0
numpy: 1.21.5
scipy: 1.8.0
netCDF4: 1.5.8
pydap: None
h5netcdf: None
h5py: None
Nio: None
zarr: 2.11.0
cftime: 1.5.2
nc_time_axis: None
PseudoNetCDF: None
rasterio: None
cfgrib: None
iris: None
bottleneck: None
dask: 2022.01.1
distributed: 2022.01.1
matplotlib: 3.5.1
cartopy: 0.20.2
seaborn: None
numbagg: None
fsspec: 2022.01.0
cupy: None
pint: None
sparse: None
setuptools: 59.8.0
pip: 22.0.3
conda: None
pytest: None
IPython: 8.0.1
sphinx: None

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the minimal example in the issue and compare its behavior under xarray 0.20.2 and 0.21.1, focusing on matplotlib's date conversion and the pandas converter mentioned in the report. Reproduce the ConversionError with the listed Python, NumPy, pandas, and matplotlib versions; done means ax.set_xlim accepts the YYYY-MM-DD strings and scales the axis as expected.

Written by the indexing model from the issue text.

Assessment

Tech stack
matplotlib, numpy, pandas, python
Domain
data-visualization
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.