8000 Update formatter with Locator in dates.py · matplotlib/matplotlib@c62ea13 · GitHub
[go: up one dir, main page]

Skip to content

Commit c62ea13

Browse files
Update formatter with Locator in dates.py
1 parent 9eda3db commit c62ea13

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

lib/matplotlib/axis.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,6 +1567,8 @@ def set_minor_formatter(self, formatter):
15671567
"matplotlib.ticker.Formatter")
15681568
self.isDefault_minfmt = False
15691569
self.minor.formatter = formatter
1570+
if hasattr(self.minor.formatter, "_ismajor"):
1571+
self.minor.formatter._ismajor = False
15701572
formatter.set_axis(self)
15711573
self.stale = True
15721574

@@ -1583,9 +1585,6 @@ def set_major_locator(self, locator):
15831585
"matplotlib.ticker.Locator")
15841586
self.isDefault_majloc = False
15851587
self.major.locator = locator
1586-
if (hasattr(self.get_major_formatter(), "_locator") and
1587-
hasattr(self.get_major_formatter(), "_tz")):
1588-
self.get_major_formatter()._locator = locator
15891588
locator.set_axis(self)
15901589
self.stale = True
15911590

@@ -1602,9 +1601,6 @@ def set_minor_locator(self, locator):
16021601
"matplotlib.ticker.Locator")
16031602
self.isDefault_minloc = False
16041603
self.minor.locator = locator
1605-
if (hasattr(self.get_minor_formatter(), "_locator") and
1606-
hasattr(self.get_minor_formatter(), "_tz")):
1607-
self.get_minor_formatter()._locator = locator
16081604
locator.set_axis(self)
16091605
self.stale = True
16101606

lib/matplotlib/dates.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,7 @@ def __init__(self, locator, tz=None, defaultfmt='%Y-%m-%d'):
806806
returned by ``locator._get_unit()``.
807807
"""
808808
self._locator = locator
809+
self._ismajor = True
809810
self._tz = tz
810811
self.defaultfmt = defaultfmt
811812
self._formatter = DateFormatter(self.defaultfmt, tz)
@@ -821,7 +822,16 @@ def __init__(self, locator, tz=None, defaultfmt='%Y-%m-%d'):
821822
rcParams['date.autoformatter.microsecond']}
822823

823824
def __call__(self, x, pos=None):
824-
locator_unit_scale = float(self._locator._get_unit())
825+
# Check if locator is still the one from the axis to format
826+
if hasattr(self.axis, "get_major_locator"):
827+
pot_locator = self.axis.get_major_locator() if self._ismajor \
828+
else self.axis.get_minor_locator()
829+
if self._locator is not pot_locator:
830+
self._locator = pot_locator
831+
try:
832+
locator_unit_scale = float(self._locator._get_unit())
833+
except AttributeError:
834+
locator_unit_scale = 1
825835
# Pick the first scale which is greater than the locator unit.
826836
fmt = next((fmt for scale, fmt in sorted(self.scaled.items())
827837
if scale >= locator_unit_scale),

lib/matplotlib/tests/test_dates.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import matplotlib.pyplot as plt
1212
from matplotlib.cbook import MatplotlibDeprecationWarning
1313
import matplotlib.dates as mdates
14+
import matplotlib.ticker as mticker
1415

1516

1617
def __has_pytz():
@@ -222,7 +223,7 @@ def test_DateFormatter():
222223

223224
def test_locator_set_formatter():
224225
"""
225-
Test if setting the locator only will update the formatter to use
226+
Test if setting the locator only will update the AutoDateFormatter to use
226227
the new locator.
227228
"""
228229
plt.rcParams["date.autoformatter.minute"] = "%d %H:%M"
@@ -240,6 +241,17 @@ def test_locator_set_formatter():
240241
'30 09:30', '30 10:00', '30 10:30']
241242
assert ticklabels == expected
242243

244+
ax.xaxis.set_major_locator(mticker.NullLocator())
245+
ax.xaxis.set_minor_locator(mdates.MinuteLocator((5, 55)))
246+
decoy_loc = mdates.MinuteLocator((12, 27))
247+
ax.xaxis.set_minor_formatter(mdates.AutoDateFormatter(decoy_loc))
248+
249+
ax.xaxis.set_minor_locator(mdates.MinuteLocator((15, 45)))
250+
fig.canvas.draw()
251+
ticklabels = [tl.get_text() for tl in ax.get_xticklabels(which="minor")]
252+
expected = ['30 08:15', '30 08:45', '30 09:15', '30 09:45', '30 10:15']
253+
assert ticklabels == expected
254+
243255

244256
def test_date_formatter_strftime():
245257
"""

0 commit comments

Comments
 (0)
0