17
17
)
18
18
19
19
from dateutil .relativedelta import relativedelta
20
- from matplotlib import (
21
- dates ,
22
- units ,
23
- )
20
+ import matplotlib .dates as mdates
24
21
from matplotlib .ticker import (
25
22
AutoLocator ,
26
23
Formatter ,
27
24
Locator ,
28
25
)
29
26
from matplotlib .transforms import nonsingular
27
+ import matplotlib .units as munits
30
28
import numpy as np
31
29
32
30
from pandas ._libs import lib
@@ -126,25 +124,25 @@ def register() -> None:
126
124
pairs = get_pairs ()
127
125
for type_ , cls in pairs :
128
126
# Cache previous converter if present
129
- if type_ in units .registry and not isinstance (units .registry [type_ ], cls ):
130
- previous = units .registry [type_ ]
127
+ if type_ in munits .registry and not isinstance (munits .registry [type_ ], cls ):
128
+ previous = munits .registry [type_ ]
131
129
_mpl_units [type_ ] = previous
132
130
# Replace with pandas converter
133
- units .registry [type_ ] = cls ()
131
+ munits .registry [type_ ] = cls ()
134
132
135
133
136
134
def deregister () -> None :
137
135
# Renamed in pandas.plotting.__init__
138
136
for type_ , cls in get_pairs ():
139
137
# We use type to catch our classes directly, no inheritance
140
- if type (units .registry .get (type_ )) is cls :
141
- units .registry .pop (type_ )
138
+ if type (munits .registry .get (type_ )) is cls :
139
+ munits .registry .pop (type_ )
142
140
143
141
# restore the old keys
144
142
for unit , formatter in _mpl_units .items ():
145
143
if type (formatter ) not in {DatetimeConverter , PeriodConverter , TimeConverter }:
146
144
# make it idempotent by excluding ours.
147
- units .registry [unit ] = formatter
145
+ munits .registry [unit ] = formatter
148
146
149
147
150
148
def _to_ordinalf (tm : pydt .time ) -> float :
@@ -161,7 +159,7 @@ def time2num(d):
161
159
return d
162
160
163
161
164
- class TimeConverter (units .ConversionInterface ):
162
+ class TimeConverter (munits .ConversionInterface ):
165
163
@staticmethod
166
164
def convert (value , unit , axis ):
167
165
valid_types = (str , pydt .time )
@@ -174,13 +172,13 @@ def convert(value, unit, axis):
174
172
return value
175
173
176
174
@staticmethod
177
- def axisinfo (unit , axis ) -> units .AxisInfo | None :
175
+ def axisinfo (unit , axis ) -> munits .AxisInfo | None :
178
176
if unit != "time" :
179
177
return None
180
178
181
179
majloc = AutoLocator ()
182
180
majfmt = TimeFormatter (majloc )
183
- return units .AxisInfo (majloc = majloc , majfmt = majfmt , label = "time" )
181
+ return munits .AxisInfo (majloc = majloc , majfmt = majfmt , label = "time" )
184
182
185
183
@staticmethod
186
184
def default_units (x , axis ) -> str :
@@ -231,7 +229,7 @@ def __call__(self, x, pos: int = 0) -> str:
231
229
# Period Conversion
232
230
233
231
234
- class PeriodConverter (dates .DateConverter ):
232
+ class PeriodConverter (mdates .DateConverter ):
235
233
@staticmethod
236
234
def convert (values , units , axis ):
237
235
if is_nested_list_like (values ):
@@ -277,7 +275,7 @@ def get_datevalue(date, freq):
277
275
278
276
279
277
# Datetime Conversion
280
- class DatetimeConverter (dates .DateConverter ):
278
+ class DatetimeConverter (mdates .DateConverter ):
281
279
@staticmethod
282
280
def convert (values , unit , axis ):
283
281
# values might be a 1-d array, or a list-like of arrays.
@@ -291,12 +289,12 @@ def convert(values, unit, axis):
291
289
def _convert_1d (values , unit , axis ):
292
290
def try_parse (values ):
293
291
try :
294
- return dates .date2num (tools .to_datetime (values ))
292
+ return mdates .date2num (tools .to_datetime (values ))
295
293
except Exception :
296
294
return values
297
295
298
296
if isinstance (values , (datetime , pydt .date , np .datetime64 , pydt .time )):
299
- return dates .date2num (values )
297
+ return mdates .date2num (values )
300
298
elif is_integer (values ) or is_float (values ):
301
299
return values
302
300
elif isinstance (values , str ):
@@ -319,12 +317,12 @@ def try_parse(values):
319
317
except Exception :
320
318
pass
321
319
322
- values = dates .date2num (values )
320
+ values = mdates .date2num (values )
323
321
324
322
return values
325
323
326
324
@staticmethod
327
- def axisinfo (unit : tzinfo | None , axis ) -> units .AxisInfo :
325
+ def axisinfo (unit : tzinfo | None , axis ) -> munits .AxisInfo :
328
326
"""
329
327
Return the :class:`~matplotlib.units.AxisInfo` for *unit*.
330
328
@@ -338,17 +336,17 @@ def axisinfo(unit: tzinfo | None, axis) -> units.AxisInfo:
338
336
datemin = pydt .date (2000 , 1 , 1 )
339
337
datemax = pydt .date (2010 , 1 , 1 )
340
338
341
- return units .AxisInfo (
339
+ return munits .AxisInfo (
342
340
majloc = majloc , majfmt = majfmt , label = "" , default_limits = (datemin , datemax )
343
341
)
344
342
345
343
346
- class PandasAutoDateFormatter (dates .AutoDateFormatter ):
344
+ class PandasAutoDateFormatter (mdates .AutoDateFormatter ):
347
345
def __init__ (self , locator , tz = None , defaultfmt : str = "%Y-%m-%d" ) -> None :
348
- dates .AutoDateFormatter .__init__ (self , locator , tz , defaultfmt )
346
+ mdates .AutoDateFormatter .__init__ (self , locator , tz , defaultfmt )
349
347
350
348
351
- class PandasAutoDateLocator (dates .AutoDateLocator ):
349
+ class PandasAutoDateLocator (mdates .AutoDateLocator ):
352
350
def get_locator (self , dmin , dmax ):
353
351
"""Pick the best locator based on a distance."""
354
352
delta = relativedelta (dmax , dmin )
@@ -366,26 +364,26 @@ def get_locator(self, dmin, dmax):
366
364
locator .axis .set_data_interval (* self .axis .get_data_interval ())
367
365
return locator
368
366
369
- return dates .AutoDateLocator .get_locator (self , dmin , dmax )
367
+ return mdates .AutoDateLocator .get_locator (self , dmin , dmax )
370
368
371
369
def _get_unit (self ):
372
370
return MilliSecondLocator .get_unit_generic (self ._freq )
373
371
374
372
375
- class MilliSecondLocator (dates .DateLocator ):
373
+ class MilliSecondLocator (mdates .DateLocator ):
376
374
377
375
UNIT = 1.0 / (24 * 3600 * 1000 )
378
376
379
377
def __init__ (self , tz ) -> None :
380
- dates .DateLocator .__init__ (self , tz )
378
+ mdates .DateLocator .__init__ (self , tz )
381
379
self ._interval = 1.0
382
380
383
381
def _get_unit (self ):
384
382
return self .get_unit_generic (- 1 )
385
383
386
384
@staticmethod
387
385
def get_unit_generic (freq ):
388
- unit = dates .RRuleLocator .get_unit_generic (freq )
386
+ unit = mdates .RRuleLocator .get_unit_generic (freq )
389
387
if unit < 0 :
390
388
return MilliSecondLocator .UNIT
391
389
return unit
@@ -398,7 +396,7 @@ def __call__(self):
398
396
return []
399
397
400
398
# We need to cap at the endpoints of valid datetime
401
- nmax , nmin = dates .date2num ((dmax , dmin ))
399
+ nmax , nmin = mdates .date2num ((dmax , dmin ))
402
400
403
401
num = (nmax - nmin ) * 86400 * 1000
404
402
max_millis_ticks = 6
@@ -427,12 +425,12 @@ def __call__(self):
427
425
428
426
try :
429
427
if len (all_dates ) > 0 :
430
- locs = self .raise_if_exceeds (dates .date2num (all_dates ))
428
+ locs = self .raise_if_exceeds (mdates .date2num (all_dates ))
431
429
return locs
432
430
except Exception : # pragma: no cover
433
431
pass
434
432
435
- lims = dates .date2num ([dmin , dmax ])
433
+ lims = mdates .date2num ([dmin , dmax ])
436
434
return lims
437
435
438
436
def _get_interval (self ):
@@ -445,8 +443,8 @@ def autoscale(self):
445
443
# We need to cap at the endpoints of valid datetime
446
444
dmin , dmax = self .datalim_to_dt ()
447
445
448
- vmin = dates .date2num (dmin )
449
- vmax = dates .date2num (dmax )
446
+ vmin = mdates .date2num (dmin )
447
+ vmax = mdates .date2num (dmax )
450
448
451
449
return self .nonsingular (vmin , vmax )
452
450
0 commit comments