Skip to content

Commit 8cdf6e0

Browse files
committed
ENH: add rcParam for ConciseDate and interval_multiples
1 parent 99ba9f9 commit 8cdf6e0

File tree

3 files changed

+86
-9
lines changed

3 files changed

+86
-9
lines changed

lib/matplotlib/dates.py

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1826,8 +1826,11 @@ class DateConverter(units.ConversionInterface):
18261826
The 'unit' tag for such data is None or a tzinfo instance.
18271827
"""
18281828

1829-
@staticmethod
1830-
def axisinfo(unit, axis):
1829+
def __init__(self, interval_multiples=True):
1830+
self._interval_multiples = interval_multiples
1831+
super().__init__()
1832+
1833+
def axisinfo(self, unit, axis):
18311834
"""
18321835
Return the `~matplotlib.units.AxisInfo` for *unit*.
18331836
@@ -1836,7 +1839,8 @@ def axisinfo(unit, axis):
18361839
"""
18371840
tz = unit
18381841

1839-
majloc = AutoDateLocator(tz=tz)
1842+
majloc = AutoDateLocator(tz=tz,
1843+
interval_multiples=self._interval_multiples)
18401844
majfmt = AutoDateFormatter(majloc, tz=tz)
18411845
datemin = datetime.date(2000, 1, 1)
18421846
datemax = datetime.date(2010, 1, 1)
@@ -1878,17 +1882,19 @@ class ConciseDateConverter(DateConverter):
18781882
# docstring inherited
18791883

18801884
def __init__(self, formats=None, zero_formats=None, offset_formats=None,
1881-
show_offset=True):
1885+
show_offset=True, interval_multiples=True):
18821886
self._formats = formats
18831887
self._zero_formats = zero_formats
18841888
self._offset_formats = offset_formats
18851889
self._show_offset = show_offset
1890+
self._interval_multiples = interval_multiples
18861891
super().__init__()
18871892

18881893
def axisinfo(self, unit, axis):
18891894
# docstring inherited
18901895
tz = unit
1891-
majloc = AutoDateLocator(tz=tz)
1896+
majloc = AutoDateLocator(tz=tz,
1897+
interval_multiples=self._interval_multiples)
18921898
majfmt = ConciseDateFormatter(majloc, tz=tz, formats=self._formats,
18931899
zero_formats=self._zero_formats,
18941900
offset_formats=self._offset_formats,
@@ -1899,6 +1905,49 @@ def axisinfo(self, unit, axis):
18991905
default_limits=(datemin, datemax))
19001906

19011907

1902-
units.registry[np.datetime64] = DateConverter()
1903-
units.registry[datetime.date] = DateConverter()
1904-
units.registry[datetime.datetime] = DateConverter()
1908+
# The following is so that we can set the converter for dates
1909+
# via the validator for the rcParams `date.converter` and
1910+
# `date.interval_multiples`
1911+
1912+
1913+
global _converter
1914+
_conv_st = 'auto'
1915+
global _int_mult
1916+
_int_mult = True
1917+
1918+
1919+
def _set_converter(s):
1920+
"""Called by validator for rcParams date.converter"""
1921+
global _conv_st
1922+
_conv_st = s
1923+
_register_converters()
1924+
1925+
1926+
def _set_int_mult(b):
1927+
"""Called by validator for rcParams date.interval_multiples"""
1928+
global _int_mult
1929+
_int_mult = b
1930+
_register_converters()
1931+
1932+
1933+
def _register_converters():
1934+
"""
1935+
Helper to register the date converters when rcParams `date.converter` and
1936+
`date.interval_multiples` are changed. Called by the helpers above.
1937+
"""
1938+
global _conv_st
1939+
global _int_mult
1940+
if _conv_st == 'concise':
1941+
converter = ConciseDateConverter
1942+
else:
1943+
converter = DateConverter
1944+
1945+
interval_multiples = _int_mult
1946+
units.registry[np.datetime64] = converter(
1947+
interval_multiples=interval_multiples)
1948+
units.registry[datetime.date] = converter(
1949+
interval_multiples=interval_multiples)
1950+
units.registry[datetime.datetime] = converter(
1951+
interval_multiples=interval_multiples)
1952+
1953+
# _register_converters()

lib/matplotlib/rcsetup.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,26 @@ def validate_bool_maybe_none(b):
169169
raise ValueError('Could not convert "%s" to bool' % b)
170170

171171

172+
def _validate_date_converter(s):
173+
s = validate_string(s)
174+
try:
175+
import matplotlib.dates as mdates
176+
mdates._set_converter(s)
177+
except Exception as e:
178+
pass
179+
180+
181+
def _validate_date_int_mult(s):
182+
if s is None:
183+
return
184+
s = validate_bool(s)
185+
try:
186+
import matplotlib.dates as mdates
187+
mdates._set_int_mult(s)
188+
except Exception as e:
189+
pass
190+
191+
172192
def _validate_tex_preamble(s):
173193
message = (
174194
f"Support for setting the 'text.latex.preamble' and 'pgf.preamble' "
@@ -1283,6 +1303,11 @@ def _convert_validator_spec(key, conv):
12831303
'date.autoformatter.second': ['%H:%M:%S', validate_string],
12841304
'date.autoformatter.microsecond': ['%M:%S.%f', validate_string],
12851305

1306+
# 'auto', 'concise', 'auto-noninterval'
1307+
'date.converter': ['auto', _validate_date_converter],
1308+
# for auto date locator, choose interval_multiples
1309+
'date.interval_multiples': [True, _validate_date_int_mult],
1310+
12861311
#legend properties
12871312
'legend.fancybox': [True, validate_bool],
12881313
'legend.loc': ['best',

matplotlibrc.template

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,10 +432,13 @@
432432
#date.autoformatter.minute: %d %H:%M
433433
#date.autoformatter.second: %H:%M:%S
434434
#date.autoformatter.microsecond: %M:%S.%f
435-
436435
## The reference date for Matplotlib's internal date representation
437436
## See https://matplotlib.org/examples/ticks_and_spines/date_precision_and_epochs.py
438437
#date.epoch: 1970-01-01T00:00:00
438+
## 'auto', 'concise':
439+
#date.converter: 'auto'
440+
## For auto converter whether to use interval_multiples:
441+
#date.interval_multiples: True
439442

440443
## ***************************************************************************
441444
## * TICKS *

0 commit comments

Comments
 (0)