From 13b45558fac6fdf537924ba520caabf1cac1b1ae Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Sat, 25 Jun 2016 22:26:33 -0700 Subject: [PATCH 1/2] Fix containment and subslice optim. for steps. #6497 set the `_path` attribute of Line2D to the actually drawn path even if the drawstyle is `steps-*`; however containment tests and the subslice optimization for very long paths were not updated accordingly (see #6615). This patch fixes the issues. Note that `contains` returns, for events in a horizontal segment of a "steps-mid" drawstyle plot, the index of the point in the segment, regardless of whether the event occured to the left or the right of that point. --- lib/matplotlib/lines.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 18a1d8186a8e..cfa6b4d86081 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -479,6 +479,8 @@ def contains(self, mouseevent): else: # If line, return the nearby segment(s) ind = segment_hits(mouseevent.x, mouseevent.y, xt, yt, pixels) + if self._drawstyle.startswith("steps"): + ind //= 2 ind += self.ind_offset @@ -680,7 +682,8 @@ def recache(self, always=False): else: interpolation_steps = 1 xy = STEP_LOOKUP_MAP[self._drawstyle](*self._xy.T) - self._path = Path(np.asarray(xy).T, None, interpolation_steps) + self._path = Path(np.asarray(xy).T, + _interpolation_steps=interpolation_steps) self._transformed_path = None self._invalidx = False self._invalidy = False @@ -693,8 +696,9 @@ def _transform_path(self, subslice=None): """ # Masked arrays are now handled by the Path class itself if subslice is not None: - _steps = self._path._interpolation_steps - _path = Path(self._xy[subslice, :], _interpolation_steps=_steps) + xy = STEP_LOOKUP_MAP[self._drawstyle](*self._xy[subslice, :].T) + _path = Path(np.asarray(xy).T, + _interpolation_steps=self._path._interpolation_steps) else: _path = self._path self._transformed_path = TransformedPath(_path, self.get_transform()) From e7dd0e3e917630a43e760a892765e846d2515a31 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Wed, 29 Jun 2016 00:20:35 -0700 Subject: [PATCH 2/2] Adapt drawstyles test. Remove duplicated test as well. --- .../test_lines/drawstyle_variants.png | Bin 0 -> 10946 bytes lib/matplotlib/tests/test_axes.py | 6 ------ lib/matplotlib/tests/test_lines.py | 20 ++++++++++-------- 3 files changed, 11 insertions(+), 15 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_lines/drawstyle_variants.png diff --git a/lib/matplotlib/tests/baseline_images/test_lines/drawstyle_variants.png b/lib/matplotlib/tests/baseline_images/test_lines/drawstyle_variants.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6d97b7b4079f2e38ab981e63f4ea10fdc5b8e0 GIT binary patch literal 10946 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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 478f58441009..1ecc31b40dc8 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -4460,12 +4460,6 @@ def test_ls_ds_conflict(): linestyle='steps-pre:', drawstyle='steps-post') -@cleanup -def test_ls_ds_conflict(): - assert_raises(ValueError, plt.plot, range(32), - linestyle='steps-pre:', drawstyle='steps-post') - - @image_comparison(baseline_images=['date_timezone_x'], extensions=['png']) def test_date_timezone_x(): # Tests issue 5575 diff --git a/lib/matplotlib/tests/test_lines.py b/lib/matplotlib/tests/test_lines.py index 142816cab2b5..0d9151dbd3bb 100644 --- a/lib/matplotlib/tests/test_lines.py +++ b/lib/matplotlib/tests/test_lines.py @@ -118,16 +118,18 @@ def test_valid_linestyles(): line.set_linestyle('aardvark') -@cleanup +@image_comparison(baseline_images=['drawstyle_variants'], remove_text=True, + extensions=["png"]) def test_drawstyle_variants(): - fig = plt.figure() - ax = fig.add_subplot(1, 1, 1) - for ds in ("default", "steps-mid", "steps-pre", "steps-post", - "steps", None): - ax.plot(range(10), drawstyle=ds) - - fig.canvas.draw() - assert True + fig, axs = plt.subplots(6) + dss = ["default", "steps-mid", "steps-pre", "steps-post", "steps", None] + # We want to check that drawstyles are properly handled even for very long + # lines (for which the subslice optimization is on); however, we need + # to zoom in so that the difference between the drawstyles is actually + # visible. + for ax, ds in zip(axs.flat, dss): + ax.plot(range(2000), drawstyle=ds) + ax.set(xlim=(0, 2), ylim=(0, 2)) @cleanup