From e1985d75e6b971bb53e843972983fd5c4e2a0739 Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Fri, 22 Mar 2019 12:40:32 -0400 Subject: [PATCH 01/14] Fix issue 10788 --- lib/matplotlib/axes/_axes.py | 8 ++++++ .../test_axes/bar_decimal_center.png | Bin 0 -> 14637 bytes .../test_axes/barh_decimal_center.png | Bin 0 -> 10703 bytes lib/matplotlib/tests/test_axes.py | 24 ++++++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/bar_decimal_center.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/barh_decimal_center.png diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index b290ae324432..ef7c280b46fe 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2344,6 +2344,14 @@ def bar(self, x, height, width=0.8, bottom=None, *, align="center", # Fallback if edgecolor == "none". itertools.repeat('none')) + # Resolve the float - Decimal TypeError + if (orientation == 'vertical' and x.size > 0 + and isinstance(x[0], Decimal)): + width = np.array([Decimal(itm) for itm in width]) + elif (orientation == 'horizontal' and y.size > 0 + and isinstance(y[0], Decimal)): + height = np.array([Decimal(itm) for itm in height]) + # We will now resolve the alignment and really have # left, bottom, width, height vectors if align == 'center': diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bar_decimal_center.png b/lib/matplotlib/tests/baseline_images/test_axes/bar_decimal_center.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5bf5cc4d734849ff270d511bc238cfcfba9c6f GIT binary patch literal 14637 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/barh_decimal_center.png b/lib/matplotlib/tests/baseline_images/test_axes/barh_decimal_center.png new file mode 100644 index 0000000000000000000000000000000000000000..70ce20bf2040dc6fe4f724a2329802428495d90a GIT binary patch literal 10703 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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 b0ea498a93a7..15c59925cf57 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1506,6 +1506,30 @@ def test_bar_tick_label_multiple_old_alignment(): align='center') +@image_comparison( + baseline_images=['bar_decimal_center'], + extensions=['png']) +def test_bar_decimal_center(): + # Test vertical, align-center bar chart with Decimal() input + # No exception should be raised + ax = plt.gca() + x = [Decimal(x) for x in [1.5, 8.4, 5.3, 4.2]] + y = [Decimal(y) for y in [1.1, 2.2, 3.3, 4.4]] + ax.bar(x, y, align='center') + + +@image_comparison( + baseline_images=['barh_decimal_center'], + extensions=['png']) +def test_barh_decimal_center(): + # Test horizontal, align-center bar chart with Decimal() input + # No exception should be raised + ax = plt.gca() + x = [Decimal(x) for x in [1.5, 8.4, 5.3, 4.2]] + y = [Decimal(y) for y in [1.1, 2.2, 3.3, 4.4]] + ax.barh(x, y, height=[0.5, 0.5, 1, 1], align='center') + + def test_bar_color_none_alpha(): ax = plt.gca() rects = ax.bar([1, 2], [2, 4], alpha=0.3, color='none', edgecolor='r') From 2279b162d6b9130137e2a3d10667985854bab7a5 Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Fri, 22 Mar 2019 12:44:10 -0400 Subject: [PATCH 02/14] Fix style --- lib/matplotlib/axes/_axes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index ef7c280b46fe..7c9ce33b40ed 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2348,7 +2348,7 @@ def bar(self, x, height, width=0.8, bottom=None, *, align="center", if (orientation == 'vertical' and x.size > 0 and isinstance(x[0], Decimal)): width = np.array([Decimal(itm) for itm in width]) - elif (orientation == 'horizontal' and y.size > 0 + elif (orientation == 'horizontal' and y.size > 0 and isinstance(y[0], Decimal)): height = np.array([Decimal(itm) for itm in height]) From 19bb0c7f1316a317a8eda9cb9032e72c1920350d Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Fri, 22 Mar 2019 12:54:48 -0400 Subject: [PATCH 03/14] Add missing import statement --- lib/matplotlib/axes/_axes.py | 1 + lib/matplotlib/tests/test_axes.py | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 7c9ce33b40ed..be968173b7ce 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5,6 +5,7 @@ import math import operator from numbers import Number +from decimal import Decimal import numpy as np from numpy import ma diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 15c59925cf57..9fc1eff2d5f5 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -11,6 +11,7 @@ import numpy as np from numpy import ma from cycler import cycler +from decimal import Decimal import pytest import warnings From 05dd388f3a01d3d92c494990cee35685e1a1be0c Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Sun, 24 Mar 2019 16:52:15 -0400 Subject: [PATCH 04/14] Move Decimal-float conversion to earlier point Instead of adding type conversion right before alignment calculation, move Decimal-float conversion into the existing conversion block. Create a helper function _decimal_convert(data) to force conversion, which support masked array. Update the related test cases to using check_figures_equal decorator instead of image comparation. --- lib/matplotlib/axes/_axes.py | 42 +++++++++++++----- .../test_axes/bar_decimal_center.png | Bin 14637 -> 0 bytes .../test_axes/barh_decimal_center.png | Bin 10703 -> 0 bytes lib/matplotlib/tests/test_axes.py | 36 +++++++++------ 4 files changed, 54 insertions(+), 24 deletions(-) delete mode 100644 lib/matplotlib/tests/baseline_images/test_axes/bar_decimal_center.png delete mode 100644 lib/matplotlib/tests/baseline_images/test_axes/barh_decimal_center.png diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index be968173b7ce..6272d1ebfe44 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2145,6 +2145,26 @@ def _convert_dx(dx, x0, xconv, convert): dx = convert(dx) return dx + def _decimal_convert(self, data): + """ + Small helper function to force the convertion from Decimal to float. + + Parameters + ---------- + data : array_like + The input data we want to force the convertion. + + Returns + ---------- + ans : the data after convertion. + """ + # If the data is masked array, then use asarray function from numpy.ma + # module, otherwise use numpy.asarray + convert = np.asarray + if isinstance(data, ma.MaskedArray): + convert = ma.asarray + return convert(data, dtype=np.float) + @_preprocess_data() @docstring.dedent_interpd def bar(self, x, height, width=0.8, bottom=None, *, align="center", @@ -2310,14 +2330,24 @@ def bar(self, x, height, width=0.8, bottom=None, *, align="center", # subtracted uniformly if self.xaxis is not None: x0 = x - x = np.asarray(self.convert_xunits(x)) + # self.convert_xunits doesn't convert Decimal input, use + # _decimal_convert to force conversion + x = self._decimal_convert(self.convert_xunits(x)) width = self._convert_dx(width, x0, x, self.convert_xunits) + # width is the input height when orientation is horizontal + # use _decimal_convert to force conversion between Decimal and + # float + width = self._decimal_convert(width) if xerr is not None: xerr = self._convert_dx(xerr, x0, x, self.convert_xunits) if self.yaxis is not None: y0 = y - y = np.asarray(self.convert_yunits(y)) + # y is the input x when orientation is horizontal. Force convertion + # between Decimal and float + y = self._decimal_convert(self.convert_yunits(y)) height = self._convert_dx(height, y0, y, self.convert_yunits) + # Force convertion between Decimal and float + height = self._decimal_convert(height) if yerr is not None: yerr = self._convert_dx(yerr, y0, y, self.convert_yunits) @@ -2345,14 +2375,6 @@ def bar(self, x, height, width=0.8, bottom=None, *, align="center", # Fallback if edgecolor == "none". itertools.repeat('none')) - # Resolve the float - Decimal TypeError - if (orientation == 'vertical' and x.size > 0 - and isinstance(x[0], Decimal)): - width = np.array([Decimal(itm) for itm in width]) - elif (orientation == 'horizontal' and y.size > 0 - and isinstance(y[0], Decimal)): - height = np.array([Decimal(itm) for itm in height]) - # We will now resolve the alignment and really have # left, bottom, width, height vectors if align == 'center': diff --git a/lib/matplotlib/tests/baseline_images/test_axes/bar_decimal_center.png b/lib/matplotlib/tests/baseline_images/test_axes/bar_decimal_center.png deleted file mode 100644 index ef5bf5cc4d734849ff270d511bc238cfcfba9c6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14637 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 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/barh_decimal_center.png b/lib/matplotlib/tests/baseline_images/test_axes/barh_decimal_center.png deleted file mode 100644 index 70ce20bf2040dc6fe4f724a2329802428495d90a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10703 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 diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 9fc1eff2d5f5..e7390f9c0195 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1507,28 +1507,36 @@ def test_bar_tick_label_multiple_old_alignment(): align='center') -@image_comparison( - baseline_images=['bar_decimal_center'], - extensions=['png']) -def test_bar_decimal_center(): +@check_figures_equal(extensions=["png"]) +def test_bar_decimal_center(fig_test, fig_ref): # Test vertical, align-center bar chart with Decimal() input # No exception should be raised - ax = plt.gca() - x = [Decimal(x) for x in [1.5, 8.4, 5.3, 4.2]] - y = [Decimal(y) for y in [1.1, 2.2, 3.3, 4.4]] + ax = fig_test.subplots() + x0 = [1.5, 8.4, 5.3, 4.2] + y0 = [1.1, 2.2, 3.3, 4.4] + x = [Decimal(x) for x in x0] + y = [Decimal(y) for y in y0] + # Test image ax.bar(x, y, align='center') + # Reference image + ax = fig_ref.subplots() + ax.bar(x0, y0, align='center') -@image_comparison( - baseline_images=['barh_decimal_center'], - extensions=['png']) -def test_barh_decimal_center(): +@check_figures_equal(extensions=["png"]) +def test_barh_decimal_center(fig_test, fig_ref): # Test horizontal, align-center bar chart with Decimal() input # No exception should be raised - ax = plt.gca() - x = [Decimal(x) for x in [1.5, 8.4, 5.3, 4.2]] - y = [Decimal(y) for y in [1.1, 2.2, 3.3, 4.4]] + ax = fig_test.subplots() + x0 = [1.5, 8.4, 5.3, 4.2] + y0 = [1.1, 2.2, 3.3, 4.4] + x = [Decimal(x) for x in x0] + y = [Decimal(y) for y in y0] + # Test image ax.barh(x, y, height=[0.5, 0.5, 1, 1], align='center') + # Reference image + ax = fig_ref.subplots() + ax.barh(x0, y0, height=[0.5, 0.5, 1, 1], align='center') def test_bar_color_none_alpha(): From 61b491f28f9f19ff3ce7a96ff819dfc38dcc6108 Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Sun, 24 Mar 2019 16:58:10 -0400 Subject: [PATCH 05/14] Fix typo --- lib/matplotlib/axes/_axes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 6272d1ebfe44..7cb032e770b7 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2147,12 +2147,12 @@ def _convert_dx(dx, x0, xconv, convert): def _decimal_convert(self, data): """ - Small helper function to force the convertion from Decimal to float. + Small helper function to force the conversion from Decimal to float. Parameters ---------- data : array_like - The input data we want to force the convertion. + The input data we want to force the conversion. Returns ---------- From 0a23d63f7a7bdc213f988aba09030246a7534077 Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Sat, 6 Apr 2019 15:56:03 -0400 Subject: [PATCH 06/14] Convert Decimal in convert_units in Axis Instead of creating a Decimal converter function in Axes, update the convert_units in Axis to convert x when x is a Decimal or a list of Decimal. Update the comments in test_axes.py for symmetry. --- lib/matplotlib/axes/_axes.py | 35 ++----------------------------- lib/matplotlib/axis.py | 17 +++++++++++++-- lib/matplotlib/tests/test_axes.py | 8 ++----- 3 files changed, 19 insertions(+), 41 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 7cb032e770b7..b290ae324432 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5,7 +5,6 @@ import math import operator from numbers import Number -from decimal import Decimal import numpy as np from numpy import ma @@ -2145,26 +2144,6 @@ def _convert_dx(dx, x0, xconv, convert): dx = convert(dx) return dx - def _decimal_convert(self, data): - """ - Small helper function to force the conversion from Decimal to float. - - Parameters - ---------- - data : array_like - The input data we want to force the conversion. - - Returns - ---------- - ans : the data after convertion. - """ - # If the data is masked array, then use asarray function from numpy.ma - # module, otherwise use numpy.asarray - convert = np.asarray - if isinstance(data, ma.MaskedArray): - convert = ma.asarray - return convert(data, dtype=np.float) - @_preprocess_data() @docstring.dedent_interpd def bar(self, x, height, width=0.8, bottom=None, *, align="center", @@ -2330,24 +2309,14 @@ def bar(self, x, height, width=0.8, bottom=None, *, align="center", # subtracted uniformly if self.xaxis is not None: x0 = x - # self.convert_xunits doesn't convert Decimal input, use - # _decimal_convert to force conversion - x = self._decimal_convert(self.convert_xunits(x)) + x = np.asarray(self.convert_xunits(x)) width = self._convert_dx(width, x0, x, self.convert_xunits) - # width is the input height when orientation is horizontal - # use _decimal_convert to force conversion between Decimal and - # float - width = self._decimal_convert(width) if xerr is not None: xerr = self._convert_dx(xerr, x0, x, self.convert_xunits) if self.yaxis is not None: y0 = y - # y is the input x when orientation is horizontal. Force convertion - # between Decimal and float - y = self._decimal_convert(self.convert_yunits(y)) + y = np.asarray(self.convert_yunits(y)) height = self._convert_dx(height, y0, y, self.convert_yunits) - # Force convertion between Decimal and float - height = self._decimal_convert(height) if yerr is not None: yerr = self._convert_dx(yerr, y0, y, self.convert_yunits) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 1a903733de86..b91eee7b54d5 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -6,6 +6,8 @@ import logging import numpy as np +from numpy import ma +from decimal import Decimal from matplotlib import rcParams import matplotlib.artist as martist @@ -1525,9 +1527,20 @@ def have_units(self): return self.converter is not None or self.units is not None def convert_units(self, x): - # If x is already a number, doesn't need converting + # If x is already a number if munits.ConversionInterface.is_numlike(x): - return x + # need to convert when x is a Decimal + if isinstance(x, Decimal): + return np.float(x) + # need to convert when x is a list of Decimal + elif np.iterable(x) and isinstance(x[0], Decimal): + converter = np.asarray + if isinstance(x, ma.MaskedArray): + converter = ma.asarray + return converter(x, dtype=np.float) + # Otherwise, doesn't need converting + else: + return x if self.converter is None: self.converter = munits.registry.get_converter(x) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index e7390f9c0195..e4d3f7aef49c 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1509,14 +1509,12 @@ def test_bar_tick_label_multiple_old_alignment(): @check_figures_equal(extensions=["png"]) def test_bar_decimal_center(fig_test, fig_ref): - # Test vertical, align-center bar chart with Decimal() input - # No exception should be raised ax = fig_test.subplots() x0 = [1.5, 8.4, 5.3, 4.2] y0 = [1.1, 2.2, 3.3, 4.4] x = [Decimal(x) for x in x0] y = [Decimal(y) for y in y0] - # Test image + # Test image - vertical, align-center bar chart with Decimal() input ax.bar(x, y, align='center') # Reference image ax = fig_ref.subplots() @@ -1525,14 +1523,12 @@ def test_bar_decimal_center(fig_test, fig_ref): @check_figures_equal(extensions=["png"]) def test_barh_decimal_center(fig_test, fig_ref): - # Test horizontal, align-center bar chart with Decimal() input - # No exception should be raised ax = fig_test.subplots() x0 = [1.5, 8.4, 5.3, 4.2] y0 = [1.1, 2.2, 3.3, 4.4] x = [Decimal(x) for x in x0] y = [Decimal(y) for y in y0] - # Test image + # Test image - horizontal, align-center bar chart with Decimal() input ax.barh(x, y, height=[0.5, 0.5, 1, 1], align='center') # Reference image ax = fig_ref.subplots() From 125dec7bbad3b78fc7316156e8921c67b94758d6 Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Sat, 6 Apr 2019 16:41:34 -0400 Subject: [PATCH 07/14] Add an length check to prevent potential error --- lib/matplotlib/axis.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 6bd6ca6dfd06..b5ac7f101ab8 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -1531,7 +1531,7 @@ def convert_units(self, x): if isinstance(x, Decimal): return np.float(x) # need to convert when x is a list of Decimal - elif np.iterable(x) and isinstance(x[0], Decimal): + elif np.iterable(x) and len(x) > 0 and isinstance(x[0], Decimal): converter = np.asarray if isinstance(x, ma.MaskedArray): converter = ma.asarray From eda2d01b34703d7987372ad9684fecf0c36e0055 Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Sat, 6 Apr 2019 17:26:03 -0400 Subject: [PATCH 08/14] Use iterator to avoid keyerror --- lib/matplotlib/axis.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index b5ac7f101ab8..86cd4dee3b6c 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -1527,15 +1527,21 @@ def have_units(self): def convert_units(self, x): # If x is already a number if munits.ConversionInterface.is_numlike(x): + if np.iterable(x): + is_decimal = False + # use iterator to avoid key error + for thisx in x: + is_decimal = isinstance(thisx, Decimal) + if is_decimal: + converter = np.asarray + if isinstance(x, ma.MaskedArray): + converter = ma.asarray + return converter(x, dtype=np.float) + else: + return x # need to convert when x is a Decimal - if isinstance(x, Decimal): + elif isinstance(x, Decimal): return np.float(x) - # need to convert when x is a list of Decimal - elif np.iterable(x) and len(x) > 0 and isinstance(x[0], Decimal): - converter = np.asarray - if isinstance(x, ma.MaskedArray): - converter = ma.asarray - return converter(x, dtype=np.float) # Otherwise, doesn't need converting else: return x From 7359ece1a380ab489fe37dc159cffd3f8d3ef11f Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Fri, 19 Apr 2019 16:06:39 -0400 Subject: [PATCH 09/14] Add DecimalConverter in units.py In axis.py, instead of first checking whether input is number like, direct handle them as a united quantity. Since Decimal is a kind of Number, so DecimalConvert doesn't need to provide extra AxisInfo or default unit. --- lib/matplotlib/axis.py | 35 ++++++++++------------------------- lib/matplotlib/units.py | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 94b3ba812554..d23be7c4346d 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -6,8 +6,6 @@ import logging import numpy as np -from numpy import ma -from decimal import Decimal from matplotlib import rcParams import matplotlib.artist as martist @@ -1545,27 +1543,6 @@ def have_units(self): return self.converter is not None or self.units is not None def convert_units(self, x): - # If x is already a number - if munits.ConversionInterface.is_numlike(x): - if np.iterable(x): - is_decimal = False - # use iterator to avoid key error - for thisx in x: - is_decimal = isinstance(thisx, Decimal) - if is_decimal: - converter = np.asarray - if isinstance(x, ma.MaskedArray): - converter = ma.asarray - return converter(x, dtype=np.float) - else: - return x - # need to convert when x is a Decimal - elif isinstance(x, Decimal): - return np.float(x) - # Otherwise, doesn't need converting - else: - return x - if self.converter is None: self.converter = munits.registry.get_converter(x) @@ -1574,8 +1551,16 @@ def convert_units(self, x): try: ret = self.converter.convert(x, self.units, self) except Exception as e: - raise munits.ConversionError('Failed to convert value(s) to axis ' - f'units: {x!r}') from e + # If x is already number like, converters other than + # DecimalConverter may raise error, so check here to walk around. + if munits.ConversionInterface.is_numlike(x): + return x + # Try convert again + try: + ret = self.converter.convert(x, self.units, self) + except Exception as e2: + raise munits.ConversionError('Failed to convert value(s) to ' + f'axis units: {x!r}') from e2 return ret def set_units(self, u): diff --git a/lib/matplotlib/units.py b/lib/matplotlib/units.py index 4cbac7c226ab..194ba3d01e33 100644 --- a/lib/matplotlib/units.py +++ b/lib/matplotlib/units.py @@ -45,6 +45,8 @@ def default_units(x, axis): from numbers import Number import numpy as np +from numpy import ma +from decimal import Decimal from matplotlib import cbook @@ -133,6 +135,43 @@ def is_numlike(x): return isinstance(x, Number) +class DecimalConverter(ConversionInterface): + """ + Converter for decimal.Decimal data to float. + """ + @staticmethod + def convert(value, unit, axis): + """ + Convert Decimals to floats. + + The *unit* and *axis* arguments are not used. + + Parameters + ---------- + value : decimal.Decimal or iterable + Decimal or list of Decimal need to be converted + """ + # If value is a Decimal + if isinstance(value, Decimal): + return np.float(value) + # else x is a list of Decimal + else: + converter = np.asarray + if isinstance(value, ma.MaskedArray): + converter = ma.asarray + return converter(value, dtype=np.float) + + @staticmethod + def axisinfo(unit, axis): + # Since Decimal is a kind of Number, don't need specific axisinfo. + return AxisInfo() + + @staticmethod + def default_units(x, axis): + # Return None since Decimal is a kind of Number. + return None + + class Registry(dict): """Register types with conversion interface.""" @@ -164,3 +203,4 @@ def get_converter(self, x): registry = Registry() +registry[Decimal] = DecimalConverter() From 45da1c5573006283542c403b1e45b535503df5ab Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Wed, 24 Apr 2019 15:27:56 -0400 Subject: [PATCH 10/14] Don't perform retey in convert_units --- lib/matplotlib/axis.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index d23be7c4346d..a3ff1fafcc5f 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -1555,12 +1555,9 @@ def convert_units(self, x): # DecimalConverter may raise error, so check here to walk around. if munits.ConversionInterface.is_numlike(x): return x - # Try convert again - try: - ret = self.converter.convert(x, self.units, self) - except Exception as e2: - raise munits.ConversionError('Failed to convert value(s) to ' - f'axis units: {x!r}') from e2 + # Otherwise, the conversion fails + raise munits.ConversionError('Failed to convert value(s) to ' + f'axis units: {x!r}') from e return ret def set_units(self, u): From cb0a64cd3fe2f26b2e439e3675a2ea04f3097a6a Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Tue, 30 Apr 2019 14:21:42 -0400 Subject: [PATCH 11/14] Remove changes --- lib/matplotlib/axes/_axes.py | 8 -------- lib/matplotlib/tests/test_axes.py | 24 ------------------------ 2 files changed, 32 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index fc47c141c342..b731e3242bc5 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -2376,14 +2376,6 @@ def bar(self, x, height, width=0.8, bottom=None, *, align="center", # Fallback if edgecolor == "none". itertools.repeat('none')) - # Resolve the float - Decimal TypeError - if (orientation == 'vertical' and x.size > 0 - and isinstance(x[0], Decimal)): - width = np.array([Decimal(itm) for itm in width]) - elif (orientation == 'horizontal' and y.size > 0 - and isinstance(y[0], Decimal)): - height = np.array([Decimal(itm) for itm in height]) - # We will now resolve the alignment and really have # left, bottom, width, height vectors if align == 'center': diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 864a98c01955..b413bf7a64e1 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1472,30 +1472,6 @@ def test_bar_tick_label_multiple_old_alignment(): align='center') -@image_comparison( - baseline_images=['bar_decimal_center'], - extensions=['png']) -def test_bar_decimal_center(): - # Test vertical, align-center bar chart with Decimal() input - # No exception should be raised - ax = plt.gca() - x = [Decimal(x) for x in [1.5, 8.4, 5.3, 4.2]] - y = [Decimal(y) for y in [1.1, 2.2, 3.3, 4.4]] - ax.bar(x, y, align='center') - - -@image_comparison( - baseline_images=['barh_decimal_center'], - extensions=['png']) -def test_barh_decimal_center(): - # Test horizontal, align-center bar chart with Decimal() input - # No exception should be raised - ax = plt.gca() - x = [Decimal(x) for x in [1.5, 8.4, 5.3, 4.2]] - y = [Decimal(y) for y in [1.1, 2.2, 3.3, 4.4]] - ax.barh(x, y, height=[0.5, 0.5, 1, 1], align='center') - - def test_bar_color_none_alpha(): ax = plt.gca() rects = ax.bar([1, 2], [2, 4], alpha=0.3, color='none', edgecolor='r') From 4005002875fcac1877b6a363193129586ce0118c Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Sat, 11 May 2019 20:01:58 -0400 Subject: [PATCH 12/14] Add is_natively_supported in ConversionInterface --- lib/matplotlib/axis.py | 13 ++++++------- lib/matplotlib/units.py | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 98c7639eccfd..3400d4b67472 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -1565,6 +1565,10 @@ def have_units(self): return self.converter is not None or self.units is not None def convert_units(self, x): + # If x is natively supported by Matplotlib, doesn't need converting + if munits.ConversionInterface.is_natively_supported(x): + return x + if self.converter is None: self.converter = munits.registry.get_converter(x) @@ -1573,13 +1577,8 @@ def convert_units(self, x): try: ret = self.converter.convert(x, self.units, self) except Exception as e: - # If x is already number like, converters other than - # DecimalConverter may raise error, so check here to walk around. - if munits.ConversionInterface.is_numlike(x): - return x - # Otherwise, the conversion fails - raise munits.ConversionError('Failed to convert value(s) to ' - f'axis units: {x!r}') from e + raise munits.ConversionError('Failed to convert value(s) to axis ' + f'units: {x!r}') from e return ret def set_units(self, u): diff --git a/lib/matplotlib/units.py b/lib/matplotlib/units.py index c12acc10cfcb..0f55b286bc21 100644 --- a/lib/matplotlib/units.py +++ b/lib/matplotlib/units.py @@ -134,6 +134,21 @@ def is_numlike(x): else: return isinstance(x, Number) + @staticmethod + def is_natively_supported(x): + """ + Return whether *x* is of a type that Matplotlib natively supports or + *x* is array of objects of such types. + """ + # Matplotlib natively supports all number types except Decimal + if np.iterable(x): + # Assume lists are homogeneous as other functions in unit system + for thisx in x: + return (isinstance(thisx, Number) and + not isinstance(thisx, Decimal)) + else: + return isinstance(x, Number) and not isinstance(x, Decimal) + class DecimalConverter(ConversionInterface): """ From b290867637a459f8234be88e1ef62675ef767164 Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Sun, 12 May 2019 10:18:49 -0400 Subject: [PATCH 13/14] Add more test cases Add one test case for plot with Decimal input Add one test case for scatter plot with Decimal input Add two test cases for bar plot with Decimal height/width --- lib/matplotlib/tests/test_axes.py | 55 +++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 015b4811ed85..e96a3ebf3235 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1506,6 +1506,34 @@ def test_barh_decimal_center(fig_test, fig_ref): ax.barh(x0, y0, height=[0.5, 0.5, 1, 1], align='center') +@check_figures_equal(extensions=["png"]) +def test_bar_decimal_width(fig_test, fig_ref): + x = [1.5, 8.4, 5.3, 4.2] + y = [1.1, 2.2, 3.3, 4.4] + w0 = [0.7, 1.45, 1, 2] + w = [Decimal(i) for i in w0] + # Test image - vertical bar chart with Decimal() width + ax = fig_test.subplots() + ax.bar(x, y, width=w, align='center') + # Reference image + ax = fig_ref.subplots() + ax.bar(x, y, width=w0, align='center') + + +@check_figures_equal(extensions=["png"]) +def test_barh_decimal_height(fig_test, fig_ref): + x = [1.5, 8.4, 5.3, 4.2] + y = [1.1, 2.2, 3.3, 4.4] + h0 = [0.7, 1.45, 1, 2] + h = [Decimal(i) for i in h0] + # Test image - horizontal bar chart with Decimal() height + ax = fig_test.subplots() + ax.barh(x, y, height=h, align='center') + # Reference image + ax = fig_ref.subplots() + ax.barh(x, y, height=h0, align='center') + + def test_bar_color_none_alpha(): ax = plt.gca() rects = ax.bar([1, 2], [2, 4], alpha=0.3, color='none', edgecolor='r') @@ -1848,6 +1876,21 @@ def test_scatter_2D(self): fig, ax = plt.subplots() ax.scatter(x, y, c=z, s=200, edgecolors='face') + @check_figures_equal(extensions=["png"]) + def test_scatter_decimal(fig_test, fig_ref): + x0 = np.array([1.5, 8.4, 5.3, 4.2]) + y0 = np.array([1.1, 2.2, 3.3, 4.4]) + x = np.array([Decimal(i) for i in x0]) + y = np.array([Decimal(i) for i in y0]) + c = ['r', 'y', 'b', 'lime'] + s = [24, 15, 19, 29] + # Test image - scatter plot with Decimal() input + ax = fig_test.subplots() + ax.scatter(x, y, c=c, s=s) + # Reference image + ax = fig_ref.subplots() + ax.scatter(x0, y0, c=c, s=s) + def test_scatter_color(self): # Try to catch cases where 'c' kwarg should have been used. with pytest.raises(ValueError): @@ -5994,6 +6037,18 @@ def test_plot_columns_cycle_deprecation(): plt.plot(np.zeros((2, 2)), np.zeros((2, 3))) +@check_figures_equal(extensions=["png"]) +def test_plot_decimal(fig_test, fig_ref): + x0 = np.arange(-10, 10, 0.3) + y0 = [5.2 * x ** 3 - 2.1 * x ** 2 + 7.34 * x + 4.5 for x in x0] + x = [Decimal(i) for i in x0] + y = [Decimal(i) for i in y0] + # Test image - line plot with Decimal input + fig_test.subplots().plot(x, y) + # Reference image + fig_ref.subplots().plot(x0, y0) + + # pdf and svg tests fail using travis' old versions of gs and inkscape. @check_figures_equal(extensions=["png"]) def test_markerfacecolor_none_alpha(fig_test, fig_ref): From c56c17525ab53fe994b62f48c25db952664ebb76 Mon Sep 17 00:00:00 2001 From: sasoripathos Date: Sun, 12 May 2019 10:33:57 -0400 Subject: [PATCH 14/14] Fix missing self argument --- lib/matplotlib/tests/test_axes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index e96a3ebf3235..f08f45b67e9b 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1877,7 +1877,7 @@ def test_scatter_2D(self): ax.scatter(x, y, c=z, s=200, edgecolors='face') @check_figures_equal(extensions=["png"]) - def test_scatter_decimal(fig_test, fig_ref): + def test_scatter_decimal(self, fig_test, fig_ref): x0 = np.array([1.5, 8.4, 5.3, 4.2]) y0 = np.array([1.1, 2.2, 3.3, 4.4]) x = np.array([Decimal(i) for i in x0])