Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e4c7774

Browse files
committed
ENH: add rcParam for ConciseDate and interval_multiples
1 parent 09d8da2 commit e4c7774

File tree

3 files changed

+87
-9
lines changed

3 files changed

+87
-9
lines changed

lib/matplotlib/dates.py

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

1835-
@staticmethod
1836-
def axisinfo(unit, axis):
1835+
def __init__(self, interval_multiples=True):
1836+
self._interval_multiples = interval_multiples
1837+
super().__init__()
1838+
1839+
def axisinfo(self, unit, axis):
18371840
"""
18381841
Return the `~matplotlib.units.AxisInfo` for *unit*.
18391842
@@ -1842,7 +1845,8 @@ def axisinfo(unit, axis):
18421845
"""
18431846
tz = unit
18441847

1845-
majloc = AutoDateLocator(tz=tz)
1848+
majloc = AutoDateLocator(tz=tz,
1849+
interval_multiples=self._interval_multiples)
18461850
majfmt = AutoDateFormatter(majloc, tz=tz)
18471851
datemin = datetime.date(2000, 1, 1)
18481852
datemax = datetime.date(2010, 1, 1)
@@ -1884,17 +1888,19 @@ class ConciseDateConverter(DateConverter):
18841888
# docstring inherited
18851889

18861890
def __init__(self, formats=None, zero_formats=None, offset_formats=None,
1887-
show_offset=True):
1891+
show_offset=True, interval_multiples=True):
18881892
self._formats = formats
18891893
self._zero_formats = zero_formats
18901894
self._offset_formats = offset_formats
18911895
self._show_offset = show_offset
1896+
self._interval_multiples = interval_multiples
18921897
super().__init__()
18931898

18941899
def axisinfo(self, unit, axis):
18951900
# docstring inherited
18961901
tz = unit
1897-
majloc = AutoDateLocator(tz=tz)
1902+
majloc = AutoDateLocator(tz=tz,
1903+
interval_multiples=self._interval_multiples)
18981904
majfmt = ConciseDateFormatter(majloc, tz=tz, formats=self._formats,
18991905
zero_formats=self._zero_formats,
19001906
offset_formats=self._offset_formats,
@@ -1905,6 +1911,49 @@ def axisinfo(self, unit, axis):
19051911
default_limits=(datemin, datemax))
19061912

19071913

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

lib/matplotlib/rcsetup.py

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

176176

177+
def _validate_date_converter(s):
178+
s = validate_string(s)
179+
try:
180+
import matplotlib.dates as mdates
181+
mdates._set_converter(s)
182+
except Exception as e:
183+
pass
184+
185+
186+
def _validate_date_int_mult(s):
187+
if s is None:
188+
return
189+
s = validate_bool(s)
190+
try:
191+
import matplotlib.dates as mdates
192+
mdates._set_int_mult(s)
193+
except Exception as e:
194+
pass
195+
196+
177197
def _validate_tex_preamble(s):
178198
if s is None or s == 'None':
179199
cbook.warn_deprecated(
@@ -1271,13 +1291,19 @@ def _convert_validator_spec(key, conv):
12711291
"date.autoformatter.second": validate_string,
12721292
"date.autoformatter.microsecond": validate_string,
12731293

1294+
# 'auto', 'concise', 'auto-noninterval'
1295+
'date.converter': ['auto', _validate_date_converter],
1296+
# for auto date locator, choose interval_multiples
1297+
'date.interval_multiples': [True, _validate_date_int_mult],
1298+
12741299
# legend properties
12751300
"legend.fancybox": validate_bool,
12761301
"legend.loc": _ignorecase([
12771302
"best",
12781303
"upper right", "upper left", "lower left", "lower right", "right",
12791304
"center left", "center right", "lower center", "upper center",
12801305
"center"]),
1306+
12811307
# the number of points in the legend line
12821308
"legend.numpoints": validate_int,
12831309
# the number of points in the legend line for scatter

matplotlibrc.template

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,10 +442,13 @@
442442
#date.autoformatter.minute: %d %H:%M
443443
#date.autoformatter.second: %H:%M:%S
444444
#date.autoformatter.microsecond: %M:%S.%f
445-
446445
## The reference date for Matplotlib's internal date representation
447446
## See https://matplotlib.org/examples/ticks_and_spines/date_precision_and_epochs.py
448447
#date.epoch: 1970-01-01T00:00:00
448+
## 'auto', 'concise':
449+
#date.converter: 'auto'
450+
## For auto converter whether to use interval_multiples:
451+
#date.interval_multiples: True
449452

450453
## ***************************************************************************
451454
## * TICKS *

0 commit comments

Comments
 (0)