From daa4d206583ccdf6bce73a7146ca03fdd859165a Mon Sep 17 00:00:00 2001 From: TD22057 Date: Tue, 27 Feb 2018 13:08:00 -0800 Subject: [PATCH 1/4] Fixes #10619. Reordered bar plot to correctly handle units --- lib/matplotlib/axes/_axes.py | 32 ++++++++-------- .../testing/jpl_units/EpochConverter.py | 2 +- lib/matplotlib/testing/jpl_units/__init__.py | 1 + lib/matplotlib/tests/test_units.py | 38 +++++++++++++++++++ 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 7681edf57f44..b7c5d1c1d528 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2190,10 +2190,6 @@ def bar(self, *args, **kwargs): adjust_xlim = True x = 0 - x, height, width, y, linewidth = np.broadcast_arrays( - # Make args iterable too. - np.atleast_1d(x), height, width, y, linewidth) - if orientation == 'vertical': self._process_unit_info(xdata=x, ydata=height, kwargs=kwargs) if log: @@ -2211,18 +2207,6 @@ def bar(self, *args, **kwargs): else: raise ValueError('invalid orientation: %s' % orientation) - linewidth = itertools.cycle(np.atleast_1d(linewidth)) - color = itertools.chain(itertools.cycle(mcolors.to_rgba_array(color)), - # Fallback if color == "none". - itertools.repeat([0, 0, 0, 0])) - if edgecolor is None: - edgecolor = itertools.repeat(None) - else: - edgecolor = itertools.chain( - itertools.cycle(mcolors.to_rgba_array(edgecolor)), - # Fallback if edgecolor == "none". - itertools.repeat([0, 0, 0, 0])) - # lets do some conversions now since some types cannot be # subtracted uniformly if self.xaxis is not None: @@ -2237,6 +2221,22 @@ def bar(self, *args, **kwargs): if yerr is not None: yerr = self.convert_yunits(yerr) + x, height, width, y, linewidth = np.broadcast_arrays( + # Make args iterable too. + np.atleast_1d(x), height, width, y, linewidth) + + linewidth = itertools.cycle(np.atleast_1d(linewidth)) + color = itertools.chain(itertools.cycle(mcolors.to_rgba_array(color)), + # Fallback if color == "none". + itertools.repeat([0, 0, 0, 0])) + if edgecolor is None: + edgecolor = itertools.repeat(None) + else: + edgecolor = itertools.chain( + itertools.cycle(mcolors.to_rgba_array(edgecolor)), + # Fallback if edgecolor == "none". + itertools.repeat([0, 0, 0, 0])) + # We will now resolve the alignment and really have # left, bottom, width, height vectors if align == 'center': diff --git a/lib/matplotlib/testing/jpl_units/EpochConverter.py b/lib/matplotlib/testing/jpl_units/EpochConverter.py index ccf02e858717..eecf3321135b 100644 --- a/lib/matplotlib/testing/jpl_units/EpochConverter.py +++ b/lib/matplotlib/testing/jpl_units/EpochConverter.py @@ -101,7 +101,7 @@ def duration2float( value ): = RETURN VALUE - Returns the value parameter converted to floats. """ - return value.days() + return value.seconds() / 86400.0 #------------------------------------------------------------------------ @staticmethod diff --git a/lib/matplotlib/testing/jpl_units/__init__.py b/lib/matplotlib/testing/jpl_units/__init__.py index 9b6ab73bdad6..074af4e83589 100644 --- a/lib/matplotlib/testing/jpl_units/__init__.py +++ b/lib/matplotlib/testing/jpl_units/__init__.py @@ -65,6 +65,7 @@ def register(): mplU.registry[ str ] = StrConverter() mplU.registry[ Epoch ] = EpochConverter() + mplU.registry[ Duration ] = EpochConverter() mplU.registry[ UnitDbl ] = UnitDblConverter() #======================================================================= diff --git a/lib/matplotlib/tests/test_units.py b/lib/matplotlib/tests/test_units.py index 14e8341e4b5d..d444d1aa3116 100644 --- a/lib/matplotlib/tests/test_units.py +++ b/lib/matplotlib/tests/test_units.py @@ -3,6 +3,7 @@ from matplotlib.testing.decorators import image_comparison import matplotlib.units as munits import numpy as np +import datetime try: # mock in python 3.3+ @@ -95,3 +96,40 @@ def test_plot_masked_units(): fig, ax = plt.subplots() ax.plot(data_masked_units) + +@image_comparison(baseline_images=['jpl_bar_units'], extensions=['png'], + savefig_kwarg={'dpi': 60}, style='mpl20') +def test_jpl_bar_units(): + from datetime import datetime + import matplotlib.testing.jpl_units as units + units.register() + + day = units.Duration("ET", 24.0 * 60.0 * 60.0) + x = [0*units.km, 1*units.km, 2*units.km] + w = [1*day, 2*day, 3*day] + b = units.Epoch("ET", dt=datetime(2009, 4, 25)) + + fig, ax = P.subplots() + ax.bar(x, w, bottom=b) + ax.set_ylim([b-1*day, b+w[-1]+1*day]) + +@image_comparison(baseline_images=['jpl_barh_units'], extensions=['png'], + savefig_kwarg={'dpi': 60}, style='mpl20') +def test_jpl_barh_units(): + from datetime import datetime + import matplotlib.testing.jpl_units as units + units.register() + + day = units.Duration("ET", 24.0 * 60.0 * 60.0) + x = [0*units.km, 1*units.km, 2*units.km] + w = [1*day, 2*day, 3*day] + b = units.Epoch("ET", dt=datetime(2009, 4, 25)) + + fig, ax = P.subplots() + ax.barh(x, w, left=b) + ax.set_xlim([b-1*day, b+w[-1]+1*day]) + + + + + From a1a4fd6c3fe9def67ecbe52ec9056777895c6bad Mon Sep 17 00:00:00 2001 From: TD22057 Date: Tue, 27 Feb 2018 14:01:40 -0800 Subject: [PATCH 2/4] Updated tests w/ correct freetype version --- .../test_units/jpl_bar_units.png | Bin 0 -> 20363 bytes .../test_units/jpl_barh_units.png | Bin 0 -> 14626 bytes lib/matplotlib/tests/test_units.py | 12 +++++++----- 3 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_units/jpl_bar_units.png create mode 100644 lib/matplotlib/tests/baseline_images/test_units/jpl_barh_units.png diff --git a/lib/matplotlib/tests/baseline_images/test_units/jpl_bar_units.png b/lib/matplotlib/tests/baseline_images/test_units/jpl_bar_units.png new file mode 100644 index 0000000000000000000000000000000000000000..8c79da4c7c4e3bb528cf4806b5f0e6df34dd36ea GIT binary patch literal 20363 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

LCts{S7kE|0n!DE9q!~a42-l{#+*l6j0&Ko0 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 Date: Tue, 27 Feb 2018 16:02:40 -0800 Subject: [PATCH 3/4] Fixed tick locations w/ units --- lib/matplotlib/axes/_axes.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index b7c5d1c1d528..7a1b1b9ca862 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2194,16 +2194,10 @@ def bar(self, *args, **kwargs): self._process_unit_info(xdata=x, ydata=height, kwargs=kwargs) if log: self.set_yscale('log', nonposy='clip') - - tick_label_axis = self.xaxis - tick_label_position = x elif orientation == 'horizontal': self._process_unit_info(xdata=width, ydata=y, kwargs=kwargs) if log: self.set_xscale('log', nonposx='clip') - - tick_label_axis = self.yaxis - tick_label_position = y else: raise ValueError('invalid orientation: %s' % orientation) @@ -2225,6 +2219,14 @@ def bar(self, *args, **kwargs): # Make args iterable too. np.atleast_1d(x), height, width, y, linewidth) + # Now that units have been converted, set the tick locations. + if orientation == 'vertical': + tick_label_axis = self.xaxis + tick_label_position = x + elif orientation == 'horizontal': + tick_label_axis = self.yaxis + tick_label_position = y + linewidth = itertools.cycle(np.atleast_1d(linewidth)) color = itertools.chain(itertools.cycle(mcolors.to_rgba_array(color)), # Fallback if color == "none". From 0a63038a3f2c3ccfc5d57b18ced6302bea236d1f Mon Sep 17 00:00:00 2001 From: TD22057 Date: Tue, 27 Feb 2018 16:22:08 -0800 Subject: [PATCH 4/4] Removed trailing whitespace --- lib/matplotlib/axes/_axes.py | 2 +- lib/matplotlib/tests/test_units.py | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 7a1b1b9ca862..612b6f77a999 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2226,7 +2226,7 @@ def bar(self, *args, **kwargs): elif orientation == 'horizontal': tick_label_axis = self.yaxis tick_label_position = y - + linewidth = itertools.cycle(np.atleast_1d(linewidth)) color = itertools.chain(itertools.cycle(mcolors.to_rgba_array(color)), # Fallback if color == "none". diff --git a/lib/matplotlib/tests/test_units.py b/lib/matplotlib/tests/test_units.py index aec471b03458..65c8da7ea7d4 100644 --- a/lib/matplotlib/tests/test_units.py +++ b/lib/matplotlib/tests/test_units.py @@ -97,14 +97,14 @@ def test_plot_masked_units(): fig, ax = plt.subplots() ax.plot(data_masked_units) - + @image_comparison(baseline_images=['jpl_bar_units'], extensions=['png'], savefig_kwarg={'dpi': 120}, style='mpl20') def test_jpl_bar_units(): from datetime import datetime import matplotlib.testing.jpl_units as units units.register() - + day = units.Duration("ET", 24.0 * 60.0 * 60.0) x = [0*units.km, 1*units.km, 2*units.km] w = [1*day, 2*day, 3*day] @@ -114,14 +114,14 @@ def test_jpl_bar_units(): ax.bar(x, w, bottom=b) ax.set_ylim([b-1*day, b+w[-1]+1*day]) - + @image_comparison(baseline_images=['jpl_barh_units'], extensions=['png'], savefig_kwarg={'dpi': 120}, style='mpl20') def test_jpl_barh_units(): from datetime import datetime import matplotlib.testing.jpl_units as units units.register() - + day = units.Duration("ET", 24.0 * 60.0 * 60.0) x = [0*units.km, 1*units.km, 2*units.km] w = [1*day, 2*day, 3*day] @@ -130,8 +130,3 @@ def test_jpl_barh_units(): fig, ax = plt.subplots() ax.barh(x, w, left=b) ax.set_xlim([b-1*day, b+w[-1]+1*day]) - - - - -