From 07a9450b407ee5dc89b82e388840d510b009ef3e Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Wed, 18 Oct 2017 20:39:24 -0700 Subject: [PATCH 1/7] In LogTransform, clip after log, not before. When clipping before taking the log, the clip value in the output array cannot be beyond log(epsilon) ~ -300. When clipping after taking the log, the clip value can be much further (see comments regarding choice of value). This allows setting the default nonpos mode back to "clip". Some test images had to be updated as this effectively moves the position of the "clip point", slightly changing the slope of the line that goes to that point and thus the rasterization (by a tiny amount). --- lib/matplotlib/axes/_axes.py | 7 +--- lib/matplotlib/axes/_base.py | 12 ++---- lib/matplotlib/scale.py | 38 +++++++++++------- .../baseline_images/test_axes/log_scales.png | Bin 13712 -> 10312 bytes .../baseline_images/test_axes/log_scales.svg | 3 +- .../test_scale/logscale_mask.png | Bin 12163 -> 9503 bytes 6 files changed, 31 insertions(+), 29 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 2275361aa17c..dc8ca0536020 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -1618,6 +1618,7 @@ def semilogx(self, *args, **kwargs): self.cla() d = {'basex': kwargs.pop('basex', 10), 'subsx': kwargs.pop('subsx', None), + 'nonposx': kwargs.pop('nonposx', 'clip'), } self.set_xscale('log', **d) @@ -1673,6 +1674,7 @@ def semilogy(self, *args, **kwargs): self.cla() d = {'basey': kwargs.pop('basey', 10), 'subsy': kwargs.pop('subsy', None), + 'nonposy': kwargs.pop('nonposy', 'mask'), } self.set_yscale('log', **d) b = self._hold @@ -2851,11 +2853,6 @@ def errorbar(self, x, y, yerr=None, xerr=None, Valid kwargs for the marker properties are %(Line2D)s - - Notes - ----- - Error bars with negative values will not be shown when plotted on a - logarithmic axis. """ kwargs = cbook.normalize_kwargs(kwargs, _alias_map) # anything that comes in as 'None', drop so the default thing diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 00cc9ee7aa4a..2b538ad233af 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -2970,10 +2970,8 @@ def set_xscale(self, value, **kwargs): matplotlib.scale.LogisticTransform : logit transform """ - # If the scale is being set to log, mask nonposx to prevent headaches - # around zero - if value.lower() == 'log' and 'nonposx' not in kwargs: - kwargs['nonposx'] = 'mask' + if value.lower() == "log": # Avoid headaches around zero. + kwargs.setdefault("nonposx", "clip") g = self.get_shared_x_axes() for ax in g.get_siblings(self): @@ -3292,10 +3290,8 @@ def set_yscale(self, value, **kwargs): matplotlib.scale.LogisticTransform : logit transform """ - # If the scale is being set to log, mask nonposy to prevent headaches - # around zero - if value.lower() == 'log' and 'nonposy' not in kwargs: - kwargs['nonposy'] = 'mask' + if value.lower() == "log": # Avoid headaches around zero. + kwargs.setdefault("nonposy", "clip") g = self.get_shared_y_axes() for ax in g.get_siblings(self): diff --git a/lib/matplotlib/scale.py b/lib/matplotlib/scale.py index 7b8f224ee221..4844496aa680 100644 --- a/lib/matplotlib/scale.py +++ b/lib/matplotlib/scale.py @@ -92,15 +92,24 @@ class LogTransformBase(Transform): def __init__(self, nonpos): Transform.__init__(self) - if nonpos == 'mask': - self._fill_value = np.nan - else: - self._fill_value = 1e-300 + self._clip = {"clip": True, "mask": False}[nonpos] def transform_non_affine(self, a): - with np.errstate(invalid="ignore"): - a = np.where(a <= 0, self._fill_value, a) - return np.divide(np.log(a, out=a), np.log(self.base), out=a) + with np.errstate(divide="ignore", invalid="ignore"): + out = np.log(a) + out /= np.log(self.base) + if self._clip: + # SVG spec says that conforming viewers must support values up + # to 3.4e38 (C float); however experiments suggest that Inkscape + # (which uses cairo for rendering) runs into cairo's 24-bit limit + # (which is apparently shared by Agg). + # Ghostscript (used for pdf rendering appears to overflow even + # earlier, with the max value around 2 ** 15 for the tests to pass. + # On the other hand, in practice, we want to clip beyond + # np.log10(np.nextafter(0, 1)) ~ -323 + # so 1000 seems safe. + out[a <= 0] = -1000 + return out class InvertedLogTransformBase(Transform): @@ -432,18 +441,17 @@ class LogitTransform(Transform): def __init__(self, nonpos): Transform.__init__(self) - if nonpos == 'mask': - self._fill_value = np.nan - else: - self._fill_value = 1e-300 self._nonpos = nonpos + self._clip = {"clip": True, "mask": False}[nonpos] def transform_non_affine(self, a): """logit transform (base 10), masked or clipped""" - with np.errstate(invalid="ignore"): - a = np.select( - [a <= 0, a >= 1], [self._fill_value, 1 - self._fill_value], a) - return np.log10(a / (1 - a)) + with np.errstate(divide="ignore", invalid="ignore"): + out = np.log10(a / (1 - a)) + if self._clip: # See LogTransform for choice of clip value. + out[a <= 0] = -1000 + out[1 <= a] = 1000 + return out def inverted(self): return LogisticTransform(self._nonpos) diff --git a/lib/matplotlib/tests/baseline_images/test_axes/log_scales.png b/lib/matplotlib/tests/baseline_images/test_axes/log_scales.png index 9e68e62fd75dd87bffee3f4ab5d97f63fcaa2f09..e305de1d9ac7b55b59b28fa5f8d7d36e191619bb 100644 GIT binary patch literal 10312 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 literal 13712 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 - Date: Sat, 21 Oct 2017 23:30:03 -0400 Subject: [PATCH 3/7] MNT: add exception for invalid kwargs to LogScale --- lib/matplotlib/scale.py | 6 ++++++ lib/matplotlib/tests/test_scale.py | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/matplotlib/scale.py b/lib/matplotlib/scale.py index 545f4f596ab0..459c1c0326c5 100644 --- a/lib/matplotlib/scale.py +++ b/lib/matplotlib/scale.py @@ -235,6 +235,12 @@ def __init__(self, axis, **kwargs): subs = kwargs.pop('subsy', None) nonpos = kwargs.pop('nonposy', 'clip') + if len(kwargs): + raise ValueError(("provided too many kwargs, can only pass " + "{'basex', 'subsx', nonposx'} or " + "{'basey', 'subsy', nonposy'}. You passed ") + + "{!r}".format(kwargs)) + if nonpos not in ['mask', 'clip']: raise ValueError("nonposx, nonposy kwarg must be 'mask' or 'clip'") diff --git a/lib/matplotlib/tests/test_scale.py b/lib/matplotlib/tests/test_scale.py index e23ba8fcdd51..e9eec0e8a9ac 100644 --- a/lib/matplotlib/tests/test_scale.py +++ b/lib/matplotlib/tests/test_scale.py @@ -4,6 +4,7 @@ import matplotlib.pyplot as plt import numpy as np import io +import pytest @image_comparison(baseline_images=['log_scales'], remove_text=True) @@ -65,3 +66,10 @@ def test_logscale_mask(): ax.plot(np.exp(-xs**2)) fig.canvas.draw() ax.set(yscale="log") + + +def test_extra_kwargs_raise(): + fig, ax = plt.subplots() + with pytest.raises(ValueError): + ax.set_yscale('log', nonpos='mask') + From 746d466dd14c1f180e236556dde5bf7aff6fd8ea Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 21 Oct 2017 23:56:06 -0400 Subject: [PATCH 4/7] TST: add test for clip and masking of negative values on log scale - bug reports from #9288 - bug report from #9457 - demo of errorbars going negative --- .../test_scale/logscale_nonpos_values.png | Bin 0 -> 17034 bytes lib/matplotlib/tests/test_scale.py | 26 ++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_scale/logscale_nonpos_values.png diff --git a/lib/matplotlib/tests/baseline_images/test_scale/logscale_nonpos_values.png b/lib/matplotlib/tests/baseline_images/test_scale/logscale_nonpos_values.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e233e8ecd80fac44494441071e7ab900a0ca38 GIT binary patch literal 17034 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 j^?$d={C~HR>QpryjOe|@#_Bq1N>{T literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_scale.py b/lib/matplotlib/tests/test_scale.py index e9eec0e8a9ac..9b78377b26bc 100644 --- a/lib/matplotlib/tests/test_scale.py +++ b/lib/matplotlib/tests/test_scale.py @@ -73,3 +73,29 @@ def test_extra_kwargs_raise(): with pytest.raises(ValueError): ax.set_yscale('log', nonpos='mask') + +@image_comparison(baseline_images=['logscale_nonpos_values'], remove_text=True, + extensions=['png'], style='mpl20') +def test_logscale_nonpos_values(): + np.random.seed(19680801) + xs = np.random.normal(size=int(1e3)) + fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2) + ax1.hist(xs, range=(-5, 5), bins=10) + ax1.set_yscale('log') + ax2.hist(xs, range=(-5, 5), bins=10) + ax2.set_yscale('log', nonposy='mask') + + xdata = np.arange(0, 10, 0.01) + ydata = np.exp(-xdata) + edata = 0.2*(10-xdata)*np.cos(5*xdata)*np.exp(-xdata) + + ax3.fill_between(xdata, ydata - edata, ydata + edata) + ax3.set_yscale('log') + + x = np.logspace(-1, 1) + y = x ** 3 + yerr = x**2 + ax4.errorbar(x, y, yerr=yerr) + + ax4.set_yscale('log') + ax4.set_xscale('log') From 0f9c6fb89fb9dcffc0f55dec8774e30c300897da Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 22 Oct 2017 00:11:31 -0400 Subject: [PATCH 5/7] DOC: add API changes notes --- doc/api/api_changes.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/doc/api/api_changes.rst b/doc/api/api_changes.rst index 790a56cb63a6..9e1c267f9c77 100644 --- a/doc/api/api_changes.rst +++ b/doc/api/api_changes.rst @@ -10,9 +10,24 @@ out what caused the breakage and how to fix it by updating your code. For new features that were added to Matplotlib, please see :ref:`whats-new`. +API Changes in 2.1.1 +==================== + +Default behavior of log scales reverted to clip <= 0 values +----------------------------------------------------------- + +The change it 2.1.0 to mask in logscale by default had more disruptive +changes than anticipated and has been reverted, however the clipping is now +done in a way that fixes the issues that motivated changing the default behavior +to ``'mask'``. + +As a side effect of this change, error bars which go negative now work as expected +on log scales. + API Changes in 2.1.0 ==================== + Default behavior of log scales changed to mask <= 0 values ---------------------------------------------------------- From b81b323142b71aa33ca21f177e284c51bea02475 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 23 Oct 2017 15:41:00 -0400 Subject: [PATCH 6/7] API: let loglog, semilogx, semilogy defer to default nonpos behavior --- lib/matplotlib/axes/_axes.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index dc8ca0536020..69d21b1ec732 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -1556,11 +1556,9 @@ def loglog(self, *args, **kwargs): dx = {'basex': kwargs.pop('basex', 10), 'subsx': kwargs.pop('subsx', None), - 'nonposx': kwargs.pop('nonposx', 'mask'), } dy = {'basey': kwargs.pop('basey', 10), 'subsy': kwargs.pop('subsy', None), - 'nonposy': kwargs.pop('nonposy', 'mask'), } self.set_xscale('log', **dx) @@ -1618,7 +1616,6 @@ def semilogx(self, *args, **kwargs): self.cla() d = {'basex': kwargs.pop('basex', 10), 'subsx': kwargs.pop('subsx', None), - 'nonposx': kwargs.pop('nonposx', 'clip'), } self.set_xscale('log', **d) @@ -1674,7 +1671,6 @@ def semilogy(self, *args, **kwargs): self.cla() d = {'basey': kwargs.pop('basey', 10), 'subsy': kwargs.pop('subsy', None), - 'nonposy': kwargs.pop('nonposy', 'mask'), } self.set_yscale('log', **d) b = self._hold From e3b777f83c18321cca17721d87c032b00fca8d0d Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Mon, 23 Oct 2017 15:50:19 -0400 Subject: [PATCH 7/7] API/TST: update test image for new log clipping behavior --- .../test_path/semi_log_with_zero.png | Bin 29487 -> 24929 bytes lib/matplotlib/tests/test_path.py | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_path/semi_log_with_zero.png b/lib/matplotlib/tests/baseline_images/test_path/semi_log_with_zero.png index 13a7772426dd7fa3734965fc1b08c68f3de161a7..842b4027dbf35bb2359612cc99d4765d70f865f1 100644 GIT binary patch literal 24929 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 literal 29487 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 A9RL6T diff --git a/lib/matplotlib/tests/test_path.py b/lib/matplotlib/tests/test_path.py index 25635b2d8ac3..ea2891bedf90 100644 --- a/lib/matplotlib/tests/test_path.py +++ b/lib/matplotlib/tests/test_path.py @@ -87,13 +87,15 @@ def test_path_clipping(): xy, facecolor='none', edgecolor='red', closed=True)) -@image_comparison(baseline_images=['semi_log_with_zero'], extensions=['png']) +@image_comparison(baseline_images=['semi_log_with_zero'], extensions=['png'], + style='mpl20') def test_log_transform_with_zero(): x = np.arange(-10, 10) y = (1.0 - 1.0/(x**2+1))**20 fig, ax = plt.subplots() - ax.semilogy(x, y, "-o", lw=15) + ax.semilogy(x, y, "-o", lw=15, markeredgecolor='k') + ax.set_ylim(1e-7, 1) ax.grid(True)