From 747c3cddacaae39dd0cec9082c32e78033f87ba4 Mon Sep 17 00:00:00 2001 From: Paul Hobson Date: Fri, 4 Nov 2016 14:23:50 -0700 Subject: [PATCH 1/3] Use np.nanmin/max to set ax limits in Axes.vlines Closes GH #7406. Also applied fixes to Axes.hlines and wrote tests for both. --- lib/matplotlib/axes/_axes.py | 38 +++++----- .../baseline_images/test_axes/hlines_basic.png | Bin 0 -> 9839 bytes .../baseline_images/test_axes/hlines_masked.png | Bin 0 -> 11609 bytes .../baseline_images/test_axes/hlines_with_nan.png | Bin 0 -> 20392 bytes .../baseline_images/test_axes/vlines_basic.png | Bin 0 -> 9892 bytes .../baseline_images/test_axes/vlines_masked.png | Bin 0 -> 11916 bytes .../baseline_images/test_axes/vlines_with_nan.png | Bin 0 -> 21335 bytes lib/matplotlib/tests/test_axes.py | 84 +++++++++++++++++++++ 8 files changed, 104 insertions(+), 18 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/hlines_basic.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/hlines_masked.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/hlines_with_nan.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/vlines_basic.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/vlines_masked.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/vlines_with_nan.png diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 05f678e2f2f..016f67d7361 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -965,6 +965,8 @@ def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', xmin = self.convert_xunits(xmin) xmax = self.convert_xunits(xmax) + y, xmin, xmax = cbook.delete_masked_points(y, xmin, xmax) + if not iterable(y): y = [y] if not iterable(xmin): @@ -973,20 +975,19 @@ def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', xmax = [xmax] y = np.ravel(y) - xmin = np.resize(xmin, y.shape) xmax = np.resize(xmax, y.shape) verts = [((thisxmin, thisy), (thisxmax, thisy)) for thisxmin, thisxmax, thisy in zip(xmin, xmax, y)] - coll = mcoll.LineCollection(verts, colors=colors, - linestyles=linestyles, label=label) - self.add_collection(coll, autolim=False) - coll.update(kwargs) + lines = mcoll.LineCollection(verts, colors=colors, + linestyles=linestyles, label=label) + self.add_collection(lines, autolim=False) + lines.update(kwargs) if len(y) > 0: - minx = min(xmin.min(), xmax.min()) - maxx = max(xmin.max(), xmax.max()) + minx = np.min([xmin.min(), xmax.min()]) + maxx = np.max([xmin.max(), xmax.max()]) miny = y.min() maxy = y.max() @@ -995,7 +996,7 @@ def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', self.update_datalim(corners) self.autoscale_view() - return coll + return lines @_preprocess_data(replace_names=["x", "ymin", "ymax", "colors"], label_namer="x") @@ -1046,6 +1047,8 @@ def vlines(self, x, ymin, ymax, colors='k', linestyles='solid', ymin = self.convert_yunits(ymin) ymax = self.convert_yunits(ymax) + x, ymin, ymax = cbook.delete_masked_points(x, ymin, ymax) + if not iterable(x): x = [x] if not iterable(ymin): @@ -1060,23 +1063,22 @@ def vlines(self, x, ymin, ymax, colors='k', linestyles='solid', verts = [((thisx, thisymin), (thisx, thisymax)) for thisx, thisymin, thisymax in zip(x, ymin, ymax)] #print 'creating line collection' - coll = mcoll.LineCollection(verts, colors=colors, - linestyles=linestyles, label=label) - self.add_collection(coll, autolim=False) - coll.update(kwargs) + lines = mcoll.LineCollection(verts, colors=colors, + linestyles=linestyles, label=label) + self.add_collection(lines, autolim=False) + lines.update(kwargs) if len(x) > 0: - minx = min(x) - maxx = max(x) - - miny = min(min(ymin), min(ymax)) - maxy = max(max(ymin), max(ymax)) + minx = x.min() + maxx = x.max() + miny = np.min([ymin.min(), ymax.min()]) + maxy = np.max([ymin.max(), ymax.max()]) corners = (minx, miny), (maxx, maxy) self.update_datalim(corners) self.autoscale_view() - return coll + return lines @_preprocess_data(replace_names=["positions", "lineoffsets", "linelengths", "linewidths", diff --git a/lib/matplotlib/tests/baseline_images/test_axes/hlines_basic.png b/lib/matplotlib/tests/baseline_images/test_axes/hlines_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..6d73964e0d54a90e7e4e70122d35337f09ada9f5 GIT binary patch literal 9839 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/vlines_masked.png b/lib/matplotlib/tests/baseline_images/test_axes/vlines_masked.png new file mode 100644 index 0000000000000000000000000000000000000000..b328c720be721681f3d3e44b7e99d5733e92773d GIT binary patch literal 11916 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/vlines_with_nan.png b/lib/matplotlib/tests/baseline_images/test_axes/vlines_with_nan.png new file mode 100644 index 0000000000000000000000000000000000000000..b4335041bf46609abda63a2bc1ba449c7b451c01 GIT binary patch literal 21335 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 22b1289b7f0..74bd9d18ca3 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -2812,6 +2812,90 @@ def test_eb_line_zorder(): ax.set_title("errorbar zorder test") +@image_comparison( + baseline_images=['vlines_basic', 'vlines_with_nan', 'vlines_masked'], + extensions=['png'] +) +def test_vlines(): + # normal + x1 = [2, 3, 4, 5, 7] + y1 = [2, -6, 3, 8, 2] + fig1, ax1 = plt.subplots() + ax1.vlines(x1, 0, y1, colors='g', linewidth=5) + + # GH #7406 + x2 = [2, 3, 4, 5, 6, 7] + y2 = [2, -6, 3, 8, np.nan, 2] + fig2, (ax2, ax3, ax4) = plt.subplots(nrows=3, figsize=(4, 8)) + ax2.vlines(x2, 0, y2, colors='g', linewidth=5) + + x3 = [2, 3, 4, 5, 6, 7] + y3 = [np.nan, 2, -6, 3, 8, 2] + ax3.vlines(x3, 0, y3, colors='r', linewidth=3, linestyle='--') + + x4 = [2, 3, 4, 5, 6, 7] + y4 = [np.nan, 2, -6, 3, 8, np.nan] + ax4.vlines(x4, 0, y4, colors='k', linewidth=2) + + # tweak the x-axis so we can see the lines better + for ax in [ax1, ax2, ax3, ax4]: + ax.set_xlim(0, 10) + + # check that the y-lims are all automatically the same + assert ax1.get_ylim() == ax2.get_ylim() + assert ax1.get_ylim() == ax3.get_ylim() + assert ax1.get_ylim() == ax4.get_ylim() + + fig3, ax5 = plt.subplots() + x5 = np.ma.masked_equal([2, 4, 6, 8, 10, 12], 8) + ymin5 = np.ma.masked_equal([0, 1, -1, 0, 2, 1], 2) + ymax5 = np.ma.masked_equal([13, 14, 15, 16, 17, 18], 18) + ax5.vlines(x5, ymin5, ymax5, colors='k', linewidth=2) + ax5.set_xlim(0, 15) + + +@image_comparison( + baseline_images=['hlines_basic', 'hlines_with_nan', 'hlines_masked'], + extensions=['png'] +) +def test_hlines(): + # normal + y1 = [2, 3, 4, 5, 7] + x1 = [2, -6, 3, 8, 2] + fig1, ax1 = plt.subplots() + ax1.hlines(y1, 0, x1, colors='g', linewidth=5) + + # GH #7406 + y2 = [2, 3, 4, 5, 6, 7] + x2 = [2, -6, 3, 8, np.nan, 2] + fig2, (ax2, ax3, ax4) = plt.subplots(nrows=3, figsize=(4, 8)) + ax2.hlines(y2, 0, x2, colors='g', linewidth=5) + + y3 = [2, 3, 4, 5, 6, 7] + x3 = [np.nan, 2, -6, 3, 8, 2] + ax3.hlines(y3, 0, x3, colors='r', linewidth=3, linestyle='--') + + y4 = [2, 3, 4, 5, 6, 7] + x4 = [np.nan, 2, -6, 3, 8, np.nan] + ax4.hlines(y4, 0, x4, colors='k', linewidth=2) + + # tweak the y-axis so we can see the lines better + for ax in [ax1, ax2, ax3, ax4]: + ax.set_ylim(0, 10) + + # check that the x-lims are all automatically the same + assert ax1.get_xlim() == ax2.get_xlim() + assert ax1.get_xlim() == ax3.get_xlim() + assert ax1.get_xlim() == ax4.get_xlim() + + fig3, ax5 = plt.subplots() + y5 = np.ma.masked_equal([2, 4, 6, 8, 10, 12], 8) + xmin5 = np.ma.masked_equal([0, 1, -1, 0, 2, 1], 2) + xmax5 = np.ma.masked_equal([13, 14, 15, 16, 17, 18], 18) + ax5.hlines(y5, xmin5, xmax5, colors='k', linewidth=2) + ax5.set_ylim(0, 15) + + @image_comparison(baseline_images=['step_linestyle', 'step_linestyle'], remove_text=True) def test_step_linestyle(): From 61c214eb4d6c436d41023a09f005885de817e86c Mon Sep 17 00:00:00 2001 From: Paul Hobson Date: Mon, 7 Nov 2016 11:10:19 -0800 Subject: [PATCH 2/3] Use builtin min/max in hlines/vlines This is a little simpler since we're finding the min or max of two scalars (avoids an intermediate list + diving into numpy). Also synced up the decorator between the two functions. --- lib/matplotlib/axes/_axes.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 016f67d7361..763a56d935d 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -919,7 +919,8 @@ def axvspan(self, xmin, xmax, ymin=0, ymax=1, **kwargs): self.autoscale_view(scaley=False) return p - @_preprocess_data(replace_names=['y', 'xmin', 'xmax'], label_namer="y") + @_preprocess_data(replace_names=['y', 'xmin', 'xmax', 'colors'], + label_namer='y') def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', label='', **kwargs): """ @@ -986,8 +987,8 @@ def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', lines.update(kwargs) if len(y) > 0: - minx = np.min([xmin.min(), xmax.min()]) - maxx = np.max([xmin.max(), xmax.max()]) + minx = min(xmin.min(), xmax.min()) + maxx = max(xmin.max(), xmax.max()) miny = y.min() maxy = y.max() @@ -998,8 +999,8 @@ def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', return lines - @_preprocess_data(replace_names=["x", "ymin", "ymax", "colors"], - label_namer="x") + @_preprocess_data(replace_names=['x', 'ymin', 'ymax', 'colors'], + label_namer='x') def vlines(self, x, ymin, ymax, colors='k', linestyles='solid', label='', **kwargs): """ @@ -1071,8 +1072,8 @@ def vlines(self, x, ymin, ymax, colors='k', linestyles='solid', if len(x) > 0: minx = x.min() maxx = x.max() - miny = np.min([ymin.min(), ymax.min()]) - maxy = np.max([ymin.max(), ymax.max()]) + miny = min(ymin.min(), ymax.min()) + maxy = max(ymin.max(), ymax.max()) corners = (minx, miny), (maxx, maxy) self.update_datalim(corners) From 1b3fb65219e79d3a5e114be564692b9d68a97b10 Mon Sep 17 00:00:00 2001 From: Paul Hobson Date: Mon, 7 Nov 2016 21:14:24 -0800 Subject: [PATCH 3/3] remove masked/invalid points after forcing to iterable --- lib/matplotlib/axes/_axes.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 763a56d935d..c650896bac1 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -966,8 +966,6 @@ def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', xmin = self.convert_xunits(xmin) xmax = self.convert_xunits(xmax) - y, xmin, xmax = cbook.delete_masked_points(y, xmin, xmax) - if not iterable(y): y = [y] if not iterable(xmin): @@ -975,6 +973,8 @@ def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', if not iterable(xmax): xmax = [xmax] + y, xmin, xmax = cbook.delete_masked_points(y, xmin, xmax) + y = np.ravel(y) xmin = np.resize(xmin, y.shape) xmax = np.resize(xmax, y.shape) @@ -1048,8 +1048,6 @@ def vlines(self, x, ymin, ymax, colors='k', linestyles='solid', ymin = self.convert_yunits(ymin) ymax = self.convert_yunits(ymax) - x, ymin, ymax = cbook.delete_masked_points(x, ymin, ymax) - if not iterable(x): x = [x] if not iterable(ymin): @@ -1057,6 +1055,8 @@ def vlines(self, x, ymin, ymax, colors='k', linestyles='solid', if not iterable(ymax): ymax = [ymax] + x, ymin, ymax = cbook.delete_masked_points(x, ymin, ymax) + x = np.ravel(x) ymin = np.resize(ymin, x.shape) ymax = np.resize(ymax, x.shape)