From 2fd59d4e42013cb388b76cbd3ab68ea33b8f40fe Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 29 Jan 2015 11:54:08 -0500 Subject: [PATCH 1/6] Handle masked arrays in _fast_from_verts_and_codes --- lib/matplotlib/path.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/matplotlib/path.py b/lib/matplotlib/path.py index b2540be1c18f..9543b0a8b29a 100644 --- a/lib/matplotlib/path.py +++ b/lib/matplotlib/path.py @@ -182,6 +182,10 @@ def _fast_from_codes_and_verts(cls, verts, codes, internals=None): """ internals = internals or {} pth = cls.__new__(cls) + if ma.isMaskedArray(verts): + verts = verts.astype(np.float_).filled(np.nan) + else: + verts = np.asarray(verts, np.float_) pth._vertices = verts pth._codes = codes pth._readonly = internals.pop('readonly', False) From 6931619b594eeeb423ea296929145d92792b4c65 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 29 Jan 2015 11:54:27 -0500 Subject: [PATCH 2/6] Port of cf43d57f8: Support Markers with NaNs --- src/_backend_agg.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/_backend_agg.h b/src/_backend_agg.h index 0093443f7e12..8d454a1faaa6 100644 --- a/src/_backend_agg.h +++ b/src/_backend_agg.h @@ -502,7 +502,8 @@ inline void RendererAgg::draw_markers(GCAgg &gc, agg::rgba color) { typedef agg::conv_transform transformed_path_t; - typedef PathSnapper snap_t; + typedef PathNanRemover nan_removed_t; + typedef PathSnapper snap_t; typedef agg::conv_curve curve_t; typedef agg::conv_stroke stroke_t; typedef agg::pixfmt_amask_adaptor pixfmt_amask_type; @@ -515,14 +516,16 @@ inline void RendererAgg::draw_markers(GCAgg &gc, trans *= agg::trans_affine_translation(0.5, (double)height + 0.5); transformed_path_t marker_path_transformed(marker_path, marker_trans); - snap_t marker_path_snapped(marker_path_transformed, + nan_removed_t marker_path_nan_removed(marker_path_transformed, true, marker_path.has_curves()); + snap_t marker_path_snapped(marker_path_nan_removed, gc.snap_mode, marker_path.total_vertices(), points_to_pixels(gc.linewidth)); curve_t marker_path_curve(marker_path_snapped); transformed_path_t path_transformed(path, trans); - snap_t path_snapped(path_transformed, SNAP_FALSE, path.total_vertices(), 0.0); + nan_removed_t path_nan_removed(path_transformed, false, false); + snap_t path_snapped(path_nan_removed, SNAP_FALSE, path.total_vertices(), 0.0); curve_t path_curve(path_snapped); path_curve.rewind(0); From 44230b573dc946801d0b2237f0e2dbeca42fc150 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 29 Jan 2015 11:55:13 -0500 Subject: [PATCH 3/6] Mask non-positive values on log scale using NaNs rather than masked arrays. --- lib/matplotlib/scale.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/scale.py b/lib/matplotlib/scale.py index cc64d1d66e5e..d541aa86d484 100644 --- a/lib/matplotlib/scale.py +++ b/lib/matplotlib/scale.py @@ -87,12 +87,12 @@ def get_transform(self): def _mask_non_positives(a): """ Return a Numpy masked array where all non-positive values are - masked. If there are no non-positive values, the original array - is returned. + replaced with NaNs. If there are no non-positive values, the + original array is returned. """ mask = a <= 0.0 if mask.any(): - return ma.MaskedArray(a, mask=mask) + return np.where(mask, np.nan, a) return a From 7bc452de2b4e7e3d8afd1a4bfbdcd40871be43b7 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sat, 17 Jan 2015 13:31:25 -0500 Subject: [PATCH 4/6] TST : add test for log transform with zero example from PR #3998 --- .../test_path/semi_log_with_zero.png | Bin 0 -> 28860 bytes lib/matplotlib/tests/test_path.py | 11 +++++++++++ 2 files changed, 11 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_path/semi_log_with_zero.png 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 new file mode 100644 index 0000000000000000000000000000000000000000..8edfb8a0a64b08c8014852d12a130b817ea58d30 GIT binary patch literal 28860 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 C3dtV; literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_path.py b/lib/matplotlib/tests/test_path.py index 3d0c56bd5d43..b1e1f2307e16 100644 --- a/lib/matplotlib/tests/test_path.py +++ b/lib/matplotlib/tests/test_path.py @@ -72,6 +72,17 @@ def test_point_in_path_nan(): assert not contains[0] +@image_comparison(baseline_images=['semi_log_with_zero'], extensions=['png']) +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.grid(True) + plt.show() + + if __name__ == '__main__': import nose nose.runmodule(argv=['-s', '--with-doctest'], exit=False) From c2ef01155db2fe933a598b9eca1791fe0dcf3972 Mon Sep 17 00:00:00 2001 From: Thomas A Caswell Date: Sun, 18 Jan 2015 13:07:11 -0500 Subject: [PATCH 5/6] DOC/API : removed documented input constraint The docs on Path._fast_from_codes_and_verts said that `codes` can not be None, however the code does not check this and everyplace that `Path` uses `self._codes` it first verifies that the value is not `None` and `None` is a valid value to be passed to the Path `__init__` which falls through with the `_codes` attribute being `None`. --- lib/matplotlib/path.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/path.py b/lib/matplotlib/path.py index 9543b0a8b29a..c71cbc828881 100644 --- a/lib/matplotlib/path.py +++ b/lib/matplotlib/path.py @@ -172,7 +172,7 @@ def _fast_from_codes_and_verts(cls, verts, codes, internals=None): Parameters ---------- verts : numpy array - codes : numpy array (may not be None) + codes : numpy array internals : dict or None The attributes that the resulting path should have. Allowed keys are ``readonly``, ``should_simplify``, From c9e98c6d2936a415c0039098cffcacb528440407 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 29 Jan 2015 15:23:41 -0500 Subject: [PATCH 6/6] Don't show plot --- lib/matplotlib/tests/test_path.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/matplotlib/tests/test_path.py b/lib/matplotlib/tests/test_path.py index b1e1f2307e16..3304ed653ead 100644 --- a/lib/matplotlib/tests/test_path.py +++ b/lib/matplotlib/tests/test_path.py @@ -80,7 +80,6 @@ def test_log_transform_with_zero(): fig, ax = plt.subplots() ax.semilogy(x, y, "-o", lw=15) ax.grid(True) - plt.show() if __name__ == '__main__':