8000 fix tests and make nonsingular work properly with AutoTimedeltaLocator · matplotlib/matplotlib@bfe21a7 · GitHub
[go: up one dir, main page]

Skip to content

Commit bfe21a7

Browse files
committed
fix tests and make nonsingular work properly with AutoTimedeltaLocator
1 parent 1069e94 commit bfe21a7

File tree

2 files changed

+58
-63
lines changed

2 files changed

+58
-63
lines changed

lib/matplotlib/dates.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2110,11 +2110,11 @@ def __init__(self, minticks=5, maxticks=None):
21102110

21112111
def __call__(self):
21122112
# docstring inherited
2113-
self.update_from_viewlim()
2113+
dmin, dmax = self.viewlim_to_dt()
2114+
self.update_from_limits(dmin, dmax)
21142115
return super().__call__()
21152116

2116-
def update_from_viewlim(self):
2117-
dmin, dmax = self.viewlim_to_dt()
2117+
def update_from_limits(self, dmin, dmax):
21182118
delta = dmax - dmin
21192119
# take absolute difference
21202120
if dmin > dmax:
@@ -2153,6 +2153,10 @@ def viewlim_to_dt(self):
21532153
vmin, vmax = vmax, vmin
21542154
return num2timedelta(vmin), num2timedelta(vmax)
21552155

2156+
def nonsingular(self, vmin, vmax):
2157+
self.update_from_limits(*num2timedelta([vmin, vmax]))
2158+
return super().nonsingular(vmin, vmax)
2159+
21562160

21572161
class DateConverter(units.ConversionInterface):
21582162
"""

lib/matplotlib/tests/test_dates.py

Lines changed: 51 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ def test_date2num_masked():
8888
(False, True, True, False, False, False,
8989
True))
9090

91-
@pytest.mark.xfail # TODO: un-fail once formatters exist
9291
def test_timedelta_numpy():
9392
# TODO: merge with datetime test?
9493
# test that numpy timedeltas work properly...
@@ -1571,83 +1570,75 @@ def test_strftimedelta(td, fmt, expected):
15711570

15721571

15731572
@pytest.mark.parametrize(
1574-
"t_delta, fmt, kwargs, expected, expected_offset",
1573+
"t_delta, fmt, expected",
15751574
[
1576-
[datetime.timedelta(days=141), "%d %day", {},
1575+
[datetime.timedelta(days=141), "%d %day",
15771576
['100 days', '120 days', '140 days', '160 days', '180 days',
1578-
'200 days', '220 days', '240 days', '260 days'],
1579-
""],
1580-
1581-
# [datetime.timedelta(hours=40), "%H:%m",
1582-
# {'offset_fmt': '%d %day', 'offset_on': 'days'},
1583-
# ['4:00', '8:00', '12:00', '16:00', '20:00', '24:00',
1584-
# '28:00', '32:00', '36:00', '40:00'],
1585-
# "100 days"],
1586-
#
1587-
# [datetime.timedelta(minutes=30), "%M:%s.0",
1588-
# {'offset_fmt': '%d %day, %h:%m', 'offset_on': 'hours'},
1589-
# ['42:00.0', '45:00.0', '48:00.0', '51:00.0', '54:00.0',
1590-
# '57:00.0', '60:00.0', '63:00.0', '66:00.0', '69:00.0'],
1591-
# "100 days, 03:00"],
1592-
#
1593-
# [datetime.timedelta(seconds=30), "%S.%ms",
1594-
# {'offset_fmt': '%d %day, %h:%m', 'offset_on': 'minutes'},
1595-
# ['0.000', '3.000', '6.000', '9.000', '12.000', '15.000',
1596-
# '18.000', '21.000', '24.000', '27.000', '30.000'],
1597-
# "100 days, 03:40"],
1598-
#
1599-
# [datetime.timedelta(microseconds=600), "%S.%ms%us",
1600-
# {'offset_fmt': '%d %day, %h:%m:%s', 'offset_on': 'seconds'},
1601-
# ['0.999900', '1.000000', '1.000100', '1.000200', '1.000300',
1602-
# '1.000400', '1.000500', '1.000600', '1.000700'],
1603-
# "100 days, 03:39:59"]
1577+
'200 days', '220 days', '240 days', '260 days']],
1578+
[datetime.timedelta(hours=40), "%d %day %h:%m",
1579+
['100 days 00:00', '100 days 06:00', '100 days 12:00',
1580+
'100 days 18:00', '101 days 00:00', '101 days 06:00',
1581+
'101 days 12:00', '101 days 18:00', '102 days 00:00']],
1582+
1583+
[datetime.timedelta(minutes=30), "%m:%s.0",
1584+
['40:00.0', '45:00.0', '50:00.0', '55:00.0', '00:00.0',
1585+
'05:00.0', '10:00.0', '15:00.0', '20:00.0']],
1586+
1587+
[datetime.timedelta(seconds=30), "%s.%ms",
1588+
['00.000', '05.000', '10.000', '15.000', '20.000', '25.000',
1589+
'30.000', '35.000']],
1590+
1591+
[datetime.timedelta(microseconds=600), "%s.%ms%us",
1592+
['59.999600', '59.999800', '00.000000', '00.000200',
1593+
'00.000400', '00.000600', '00.000800', '00.001000']]
16041594
]
16051595
)
1606-
def test_timdelta_formatter(t_delta, fmt, kwargs, expected, expected_offset):
1607-
def _create_timedelta_locator(td1, td2, fmt, kwargs):
1596+
def test_timdelta_formatter(t_delta, fmt, expected):
1597+
def _create_timedelta_locator(td1, td2, fmt):
16081598
fig, ax = plt.subplots()
16091599

16101600
locator = mdates.AutoTimedeltaLocator()
1611-
formatter = mdates.TimedeltaFormatter(fmt, **kwargs)
1601+
formatter = mdates.TimedeltaFormatter(fmt)
16121602
ax.yaxis.set_major_locator(locator)
16131603
ax.yaxis.set_major_formatter(formatter)
16141604
ax.set_ylim(td1, td2)
16151605
fig.canvas.draw()
16161606
sts = [st.get_text() for st in ax.get_yticklabels()]
1617-
offset_text = ax.yaxis.get_offset_text().get_text()
1618-
return sts, offset_text
1607+
return sts
16191608

1620-
td1 = datetime.timedelta(days=100, hours=3, minutes=40)
1609+
td1 = datetime.timedelta(days=100, hours=3, minutes=45)
16211610
td2 = td1 + t_delta
1622-
strings, offset_string = _create_timedelta_locator(
1623-
td1, td2, fmt, kwargs
1611+
strings = _create_timedelta_locator(
1612+
td1, td2, fmt
16241613
)
16251614
assert strings == expected
1626-
assert offset_string == expected_offset
1627-
16281615

1629-
def test_timedelta_formatter_usetex():
1630-
formatter = mdates.TimedeltaFormatter("%h:%m", offset_on='days',
1631-
offset_fmt="%d %day", usetex=True)
1632-
values = [datetime.timedelta(days=0, hours=12),
1633-
datetime.timedelta(days=1, hours=0),
1634-
datetime.timedelta(days=1, hours=12),
1635-
datetime.timedelta(days=2, hours=0)]
16361616

1637-
labels = formatter.format_ticks(mdates.date2num(values))
1638-
1639-
start = '$\\mathdefault{'
1640-
i_start = len(start)
1641-
end = '}$'
1642-
i_end = -len(end)
1617+
@pytest.mark.parametrize('delta, expected', [
1618+
(datetime.timedelta(days=200),
1619+
['%d days' % day for day in range(20, 261, 20)]),
1620+
(datetime.timedelta(days=1),
1621+
['%d days, %02d:00' % (day, hour) for day, hour in [
1622+
(39, 18), (40, 0), (40, 6), (40, 12), (40, 18), (41, 0), (41, 6)]
1623+
]),
1624+
(datetime.timedelta(hours=2),
1625+
['%d days, %02d:%02d' % (day, hour, minu) for day, hour, minu in [
1626+
(39, 23, 45), (40, 0, 0), (40, 0, 15), (40, 0, 30), (40, 0, 45),
1627+
(40, 1, 0), (40, 1, 15), (40, 1, 30), (40, 1, 45), (40, 2, 0),
1628+
(40, 2, 15)]
1629+
])
1630+
])
1631+
def test_timedelta_formatter_usetex(delta, expected):
1632+
style.use("default")
16431633

1644-
def verify(string):
1645-
assert string[:i_start] == start
1646-
assert string[i_end:] == end
1634+
d1 = datetime.timedelta(days=40)
1635+
d2 = d1 + delta
16471636

1648-
# assert ticks are tex formatted
1649-
for lbl in labels:
1650-
verify(lbl)
1637+
locator = mdates.AutoTimedeltaLocator()
1638+
locator.create_dummy_axis()
1639+
locator.axis.set_view_interval(mdates.timedelta2num(d1),
1640+
mdates.timedelta2num(d2))
16511641

1652-
# assert offset is tex formatted
1653-
verify(formatter.get_offset())
1642+
formatter = mdates.AutoTimedeltaFormatter(locator, usetex=True)
1643+
assert [formatter(loc) for loc in locator()] == [
1644+
r'{\fontfamily{\familydefault}\selectfont %s}' % s for s in expected]

0 commit comments

Comments
 (0)
0