From 353ceb45c469ca4d12bee7152a30cccb1a35ece1 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Sat, 29 May 2021 10:21:16 -0700 Subject: [PATCH] FIX: empty data assymetry --- lib/matplotlib/axes/_base.py | 20 ++++---- lib/matplotlib/axis.py | 26 +++++------ .../baseline_images/test_dates/date_empty.png | Bin 13041 -> 0 bytes lib/matplotlib/tests/test_dates.py | 44 +++++++++++++++++- lib/matplotlib/tests/test_units.py | 44 +++++++++++++++++- 5 files changed, 109 insertions(+), 25 deletions(-) delete mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_empty.png diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 76e605d71b03..ac7e8095ae1a 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -2863,8 +2863,8 @@ def autoscale_view(self, tight=None, scalex=True, scaley=True): if self.get_yscale() == 'log': y_stickies = y_stickies[y_stickies > 0] - def handle_single_axis(scale, autoscaleon, shared_axes, interval, - minpos, axis, margin, stickies, set_bound): + def handle_single_axis(scale, autoscaleon, shared_axes, name, + axis, margin, stickies, set_bound): if not (scale and autoscaleon): return # nothing to do... @@ -2876,12 +2876,16 @@ def handle_single_axis(scale, autoscaleon, shared_axes, interval, x_values = [] minimum_minpos = np.inf for ax in shared: - x_values.extend(getattr(ax.dataLim, interval)) + x_values.extend(getattr(ax.dataLim, f"interval{name}")) minimum_minpos = min(minimum_minpos, - getattr(ax.dataLim, minpos)) + getattr(ax.dataLim, f"minpos{name}")) x_values = np.extract(np.isfinite(x_values), x_values) if x_values.size >= 1: x0, x1 = (x_values.min(), x_values.max()) + elif getattr(self._viewLim, f"mutated{name}")(): + # No data, but explicit viewLims already set: + # in mutatedx or mutatedy. + return else: x0, x1 = (-np.inf, np.inf) # If x0 and x1 are non finite, use the locator to figure out @@ -2925,11 +2929,11 @@ def handle_single_axis(scale, autoscaleon, shared_axes, interval, # End of definition of internal function 'handle_single_axis'. handle_single_axis( - scalex, self._autoscaleXon, self._shared_x_axes, 'intervalx', - 'minposx', self.xaxis, self._xmargin, x_stickies, self.set_xbound) + scalex, self._autoscaleXon, self._shared_x_axes, 'x', + self.xaxis, self._xmargin, x_stickies, self.set_xbound) handle_single_axis( - scaley, self._autoscaleYon, self._shared_y_axes, 'intervaly', - 'minposy', self.yaxis, self._ymargin, y_stickies, self.set_ybound) + scaley, self._autoscaleYon, self._shared_y_axes, 'y', + self.yaxis, self._ymargin, y_stickies, self.set_ybound) def _get_axis_list(self): return self.xaxis, self.yaxis diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index f758f4537363..ff51196f3553 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -1457,7 +1457,7 @@ def update_units(self, data): if default is not None and self.units is None: self.set_units(default) - if neednew: + elif neednew: self._update_axisinfo() self.stale = True return True @@ -2267,17 +2267,15 @@ def set_inverted(self, inverted): def set_default_intervals(self): # docstring inherited xmin, xmax = 0., 1. - dataMutated = self.axes.dataLim.mutatedx() - viewMutated = self.axes.viewLim.mutatedx() - if not dataMutated or not viewMutated: + # only change view if dataLim has not changed and user has + # not changed the view: + if (not self.axes.dataLim.mutatedx() and + not self.axes.viewLim.mutatedx()): if self.converter is not None: info = self.converter.axisinfo(self.units, self) if info.default_limits is not None: xmin, xmax = self.convert_units(info.default_limits) - if not dataMutated: - self.axes.dataLim.intervalx = xmin, xmax - if not viewMutated: - self.axes.viewLim.intervalx = xmin, xmax + self.axes.viewLim.intervalx = xmin, xmax self.stale = True def get_tick_space(self): @@ -2530,17 +2528,15 @@ def set_inverted(self, inverted): def set_default_intervals(self): # docstring inherited ymin, ymax = 0., 1. - dataMutated = self.axes.dataLim.mutatedy() - viewMutated = self.axes.viewLim.mutatedy() - if not dataMutated or not viewMutated: + # only change view if dataLim has not changed and user has + # not changed the view: + if (not self.axes.dataLim.mutatedy() and + not self.axes.viewLim.mutatedy()): if self.converter is not None: info = self.converter.axisinfo(self.units, self) if info.default_limits is not None: ymin, ymax = self.convert_units(info.default_limits) - if not dataMutated: - self.axes.dataLim.intervaly = ymin, ymax - if not viewMutated: - self.axes.viewLim.intervaly = ymin, ymax + self.axes.viewLim.intervaly = ymin, ymax self.stale = True def get_tick_space(self): diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_empty.png b/lib/matplotlib/tests/baseline_images/test_dates/date_empty.png deleted file mode 100644 index 4bb9efcba428db2c3f1707df9db8f5141d9f365b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13041 zcmeHucUaR|n|6>+bDhw8SQK}e<5a}h1&L~o?fYceVAXPe{ z>Ieh{f~XK6K$J)kLPBUElw_a7`|f_b-|n~j_rBljbvZf^emObkIrnpy$Gg9nnh0$a z--y9rgifC_JdeQ$?#5u&SpB#TzLFAf^E&+T1OCM6i$B7zupeEb;Qu#VKV^-_V76RA zzXfs(UU*` z!9dsEAhf#Y>C($}g%i8T8_c?F=lVr&jGyeXz4XA8DH^u^zz>wax!wrkL0#T
qh4QH_n-=@MQ8Sqq6 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 diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index fc59b6b3f5fd..af13c2de5b4a 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -70,13 +70,55 @@ def test_date2num_NaT_scalar(units): assert np.isnan(tmpl) -@image_comparison(['date_empty.png']) def test_date_empty(): # make sure we do the right thing when told to plot dates even # if no date data has been presented, cf # http://sourceforge.net/tracker/?func=detail&aid=2850075&group_id=80706&atid=560720 fig, ax = plt.subplots() ax.xaxis_date() + fig.draw_no_output() + np.testing.assert_allclose(ax.get_xlim(), + [mdates.date2num(np.datetime64('2000-01-01')), + mdates.date2num(np.datetime64('2010-01-01'))]) + + mdates._reset_epoch_test_example() + mdates.set_epoch('0000-12-31') + fig, ax = plt.subplots() + ax.xaxis_date() + fig.draw_no_output() + np.testing.assert_allclose(ax.get_xlim(), + [mdates.date2num(np.datetime64('2000-01-01')), + mdates.date2num(np.datetime64('2010-01-01'))]) + mdates._reset_epoch_test_example() + + +def test_date_not_empty(): + fig = plt.figure() + ax = fig.add_subplot() + + ax.plot([50, 70], [1, 2]) + ax.xaxis.axis_date() + np.testing.assert_allclose(ax.get_xlim(), [50, 70]) + + +def test_axhline(): + # make sure that axhline doesn't set the xlimits... + fig, ax = plt.subplots() + ax.axhline(1.5) + ax.plot([np.datetime64('2016-01-01'), np.datetime64('2016-01-02')], [1, 2]) + np.testing.assert_allclose(ax.get_xlim(), + [mdates.date2num(np.datetime64('2016-01-01')), + mdates.date2num(np.datetime64('2016-01-02'))]) + + mdates._reset_epoch_test_example() + mdates.set_epoch('0000-12-31') + fig, ax = plt.subplots() + ax.axhline(1.5) + ax.plot([np.datetime64('2016-01-01'), np.datetime64('2016-01-02')], [1, 2]) + np.testing.assert_allclose(ax.get_xlim(), + [mdates.date2num(np.datetime64('2016-01-01')), + mdates.date2num(np.datetime64('2016-01-02'))]) + mdates._reset_epoch_test_example() @image_comparison(['date_axhspan.png']) diff --git a/lib/matplotlib/tests/test_units.py b/lib/matplotlib/tests/test_units.py index b0c5998c5338..c7a06e0e32ac 100644 --- a/lib/matplotlib/tests/test_units.py +++ b/lib/matplotlib/tests/test_units.py @@ -67,7 +67,8 @@ def default_units(value, axis): return None qc.convert = MagicMock(side_effect=convert) - qc.axisinfo = MagicMock(side_effect=lambda u, a: munits.AxisInfo(label=u)) + qc.axisinfo = MagicMock(side_effect=lambda u, a: + munits.AxisInfo(label=u, default_limits=(0, 100))) qc.default_units = MagicMock(side_effect=default_units) return qc @@ -219,3 +220,44 @@ def test_shared_axis_categorical(): ax2.plot(d2.keys(), d2.values()) ax1.xaxis.set_units(UnitData(["c", "d"])) assert "c" in ax2.xaxis.get_units()._mapping.keys() + + +def test_empty_default_limits(quantity_converter): + munits.registry[Quantity] = quantity_converter + fig, ax1 = plt.subplots() + ax1.xaxis.update_units(Quantity([10], "miles")) + fig.draw_no_output() + assert ax1.get_xlim() == (0, 100) + ax1.yaxis.update_units(Quantity([10], "miles")) + fig.draw_no_output() + assert ax1.get_ylim() == (0, 100) + + fig, ax = plt.subplots() + ax.axhline(30) + ax.plot(Quantity(np.arange(0, 3), "miles"), + Quantity(np.arange(0, 6, 2), "feet")) + fig.draw_no_output() + assert ax.get_xlim() == (0, 2) + assert ax.get_ylim() == (0, 30) + + fig, ax = plt.subplots() + ax.axvline(30) + ax.plot(Quantity(np.arange(0, 3), "miles"), + Quantity(np.arange(0, 6, 2), "feet")) + fig.draw_no_output() + assert ax.get_xlim() == (0, 30) + assert ax.get_ylim() == (0, 4) + + fig, ax = plt.subplots() + ax.xaxis.update_units(Quantity([10], "miles")) + ax.axhline(30) + fig.draw_no_output() + assert ax.get_xlim() == (0, 100) + assert ax.get_ylim() == (28.5, 31.5) + + fig, ax = plt.subplots() + ax.yaxis.update_units(Quantity([10], "miles")) + ax.axvline(30) + fig.draw_no_output() + assert ax.get_ylim() == (0, 100) + assert ax.get_xlim() == (28.5, 31.5)