Skip to content

Commit 40609e4

Browse files
authored
Merge pull request #21785 from jklymak/fix-concise-offset-zoom
Fix ConciseDateFormatter offset during zoom
2 parents f897de6 + 2ad1d5d commit 40609e4

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

lib/matplotlib/dates.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -791,15 +791,15 @@ def format_ticks(self, values):
791791
# offset fmt are for the offset in the upper left of the
792792
# or lower right of the axis.
793793
offsetfmts = self.offset_formats
794+
show_offset = self.show_offset
794795

795796
# determine the level we will label at:
796797
# mostly 0: years, 1: months, 2: days,
797798
# 3: hours, 4: minutes, 5: seconds, 6: microseconds
798799
for level in range(5, -1, -1):
799800
if len(np.unique(tickdate[:, level])) > 1:
800-
# level is less than 2 so a year is already present in the axis
801-
if (level < 2):
802-
self.show_offset = False
801+
if level < 2:
802+
show_offset = False
803803
break
804804
elif level == 0:
805805
# all tickdate are the same, so only micros might be different
@@ -839,11 +839,13 @@ def format_ticks(self, values):
839839
if '.' in labels[nn]:
840840
labels[nn] = labels[nn][:-trailing_zeros].rstrip('.')
841841

842-
if self.show_offset:
842+
if show_offset:
843843
# set the offset string:
844844
self.offset_string = tickdatetime[-1].strftime(offsetfmts[level])
845845
if self._usetex:
846846
self.offset_string = _wrap_in_tex(self.offset_string)
847+
else:
848+
self.offset_string = ''
847849

848850
if self._usetex:
849851
return [_wrap_in_tex(l) for l in labels]

lib/matplotlib/tests/test_dates.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,28 @@ def test_concise_formatter_show_offset(t_delta, expected):
604604
assert formatter.get_offset() == expected
605605

606606

607+
def test_offset_changes():
608+
fig, ax = plt.subplots()
609+
610+
d1 = datetime.datetime(1997, 1, 1)
611+
d2 = d1 + datetime.timedelta(weeks=520)
612+
613+
locator = mdates.AutoDateLocator()
614+
formatter = mdates.ConciseDateFormatter(locator)
615+
ax.xaxis.set_major_locator(locator)
616+
ax.xaxis.set_major_formatter(formatter)
617+
618+
ax.plot([d1, d2], [0, 0])
619+
fig.draw_without_rendering()
620+
assert formatter.get_offset() == ''
621+
ax.set_xlim(d1, d1 + datetime.timedelta(weeks=3))
622+
fig.draw_without_rendering()
623+
assert formatter.get_offset() == '1997-Jan'
624+
ax.set_xlim(d1, d1 + datetime.timedelta(weeks=520))
625+
fig.draw_without_rendering()
626+
assert formatter.get_offset() == ''
627+
628+
607629
@pytest.mark.parametrize('t_delta, expected', [
608630
(datetime.timedelta(weeks=52 * 200),
609631
['$\\mathdefault{%d}$' % (t, ) for t in range(1980, 2201, 20)]),

0 commit comments

Comments
 (0)