From b14d46d3de25fa3ffcfca21a897030f4f15cf84d Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Thu, 25 Feb 2016 23:02:18 +0100 Subject: [PATCH 01/11] Add maximum streamline length property. --- lib/matplotlib/streamplot.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/streamplot.py b/lib/matplotlib/streamplot.py index cbc413b2312e..8d371dbdb77c 100644 --- a/lib/matplotlib/streamplot.py +++ b/lib/matplotlib/streamplot.py @@ -22,7 +22,8 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', - minlength=0.1, transform=None, zorder=None, start_points=None): + minlength=0.1, maxlength=2.0, transform=None, zorder=None, + start_points=None): """Draws streamlines of a vector flow. *x*, *y* : 1d arrays @@ -53,6 +54,8 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, See :class:`~matplotlib.patches.FancyArrowPatch`. *minlength* : float Minimum length of streamline in axes coordinates. + *maxlength* : float + Maximum length of streamline in axes coordinates. *start_points*: Nx2 array Coordinates of starting points for the streamlines. In data coordinates, the same as the ``x`` and ``y`` arrays. @@ -126,7 +129,7 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, u = np.ma.masked_invalid(u) v = np.ma.masked_invalid(v) - integrate = get_integrator(u, v, dmap, minlength) + integrate = get_integrator(u, v, dmap, minlength, maxlength) trajectories = [] if start_points is None: @@ -401,7 +404,7 @@ class TerminateTrajectory(Exception): # Integrator definitions #======================== -def get_integrator(u, v, dmap, minlength): +def get_integrator(u, v, dmap, minlength, maxlength): # rescale velocity onto grid-coordinates for integrations. u, v = dmap.data2grid(u, v) @@ -439,9 +442,9 @@ def integrate(x0, y0): dmap.start_trajectory(x0, y0) except InvalidIndexError: return None - sf, xf_traj, yf_traj = _integrate_rk12(x0, y0, dmap, forward_time) + sf, xf_traj, yf_traj = _integrate_rk12(x0, y0, dmap, forward_time, maxlength) dmap.reset_start_point(x0, y0) - sb, xb_traj, yb_traj = _integrate_rk12(x0, y0, dmap, backward_time) + sb, xb_traj, yb_traj = _integrate_rk12(x0, y0, dmap, backward_time, maxlength) # combine forward and backward trajectories stotal = sf + sb x_traj = xb_traj[::-1] + xf_traj[1:] @@ -456,7 +459,7 @@ def integrate(x0, y0): return integrate -def _integrate_rk12(x0, y0, dmap, f): +def _integrate_rk12(x0, y0, dmap, f, maxlength): """2nd-order Runge-Kutta algorithm with adaptive step size. This method is also referred to as the improved Euler's method, or Heun's @@ -532,7 +535,7 @@ def _integrate_rk12(x0, y0, dmap, f): dmap.update_trajectory(xi, yi) except InvalidIndexError: break - if (stotal + ds) > 2: + if (stotal + ds) > maxlength: break stotal += ds From c60bfe2485c77aa339181b2f036fa0845d2daf15 Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Fri, 26 Feb 2016 00:45:20 +0100 Subject: [PATCH 02/11] Copy streamplot interface addition to axes and pyplot interfaces. --- lib/matplotlib/axes/_axes.py | 3 ++- lib/matplotlib/pyplot.py | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index c9126c31f59a..fc16c8ac9e11 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -4605,7 +4605,7 @@ def stackplot(self, x, *args, **kwargs): label_namer=None) def streamplot(self, x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', - minlength=0.1, transform=None, zorder=None, + minlength=0.1, maxlength=2.0, transform=None, zorder=None, start_points=None): if not self._hold: self.cla() @@ -4618,6 +4618,7 @@ def streamplot(self, x, y, u, v, density=1, linewidth=None, color=None, arrowsize=arrowsize, arrowstyle=arrowstyle, minlength=minlength, + maxlength=maxlength, start_points=start_points, transform=transform, zorder=zorder) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index b9782b7e3044..37bba9fcc42f 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -3288,8 +3288,8 @@ def step(x, y, *args, **kwargs): @_autogen_docstring(Axes.streamplot) def streamplot(x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', minlength=0.1, - transform=None, zorder=None, start_points=None, hold=None, - data=None): + transform=None, zorder=None, start_points=None, maxlength=4.0, + integration_direction='both', hold=None, data=None): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -3301,7 +3301,10 @@ def streamplot(x, y, u, v, density=1, linewidth=None, color=None, cmap=None, color=color, cmap=cmap, norm=norm, arrowsize=arrowsize, arrowstyle=arrowstyle, minlength=minlength, transform=transform, - zorder=zorder, start_points=start_points, data=data) + zorder=zorder, start_points=start_points, + maxlength=maxlength, + integration_direction=integration_direction, + data=data) finally: ax.hold(washold) sci(ret.lines) From 67aa36ebd510c1fb5a0edaca5d90bc9815774e7a Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Fri, 26 Feb 2016 00:45:43 +0100 Subject: [PATCH 03/11] # Das ist eine Kombination aus 2 Commits. # Das ist die erste Commit-Beschreibung: Test streamplot maxlength feature. # Commit-Beschreibung #2 wird ausgelassen: # Added streamline maxlength test png baseline image. --- .../streamplot_maxlength_test_image.png | Bin 0 -> 40904 bytes lib/matplotlib/tests/test_streamplot.py | 13 +++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_streamplot/streamplot_maxlength_test_image.png diff --git a/lib/matplotlib/tests/baseline_images/test_streamplot/streamplot_maxlength_test_image.png b/lib/matplotlib/tests/baseline_images/test_streamplot/streamplot_maxlength_test_image.png new file mode 100644 index 0000000000000000000000000000000000000000..337f376ccc436032c8c1f857d3cf58ae67bf300a GIT binary patch literal 40904 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_streamplot.py b/lib/matplotlib/tests/test_streamplot.py index 2f84121fac51..f2f8ff9e1e3b 100644 --- a/lib/matplotlib/tests/test_streamplot.py +++ b/lib/matplotlib/tests/test_streamplot.py @@ -57,6 +57,19 @@ def test_masks_and_nans(): plt.streamplot(X, Y, U, V, color=U, cmap=plt.cm.Blues) +@image_comparison(baseline_images=['streamplot_maxlength_test_image'], + extensions=['png']) +def test_maxlength(): + x = np.linspace(-3.,3.,100) + y = np.linspace(-3.,3.,100) + X,Y = np.meshgrid(x,y) + a = 0.1 + U = np.cos(a) * (-Y) - np.sin(a) * X + V = np.sin(a) * (-Y) + np.cos(a) * X + plt.streamplot(x, y, U, V, maxlength=10., start_points=[[0.,1.5]], + linewidth=2,density=2) + + @cleanup def test_streamplot_limits(): ax = plt.axes() From ea75ec1b41d9b28c6f9b69fd5460f4db0365929f Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Tue, 8 Nov 2016 11:55:26 +0100 Subject: [PATCH 04/11] Test streamplot maxlength feature. --- .../test_streamplot/streamplot_maxlength.png | Bin 0 -> 39960 bytes .../streamplot_maxlength_test_image.png | Bin 40904 -> 0 bytes lib/matplotlib/tests/test_streamplot.py | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_streamplot/streamplot_maxlength.png delete mode 100644 lib/matplotlib/tests/baseline_images/test_streamplot/streamplot_maxlength_test_image.png diff --git a/lib/matplotlib/tests/baseline_images/test_streamplot/streamplot_maxlength.png b/lib/matplotlib/tests/baseline_images/test_streamplot/streamplot_maxlength.png new file mode 100644 index 0000000000000000000000000000000000000000..2ccb71c0581f5c62862f8bc13ec3bb48eaf80c7c GIT binary patch literal 39960 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 kc;QmsUr9RS-D=TWD0Z#&t2=ra9h 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 diff --git a/lib/matplotlib/tests/test_streamplot.py b/lib/matplotlib/tests/test_streamplot.py index f2f8ff9e1e3b..8a8d8c0290ad 100644 --- a/lib/matplotlib/tests/test_streamplot.py +++ b/lib/matplotlib/tests/test_streamplot.py @@ -57,7 +57,7 @@ def test_masks_and_nans(): plt.streamplot(X, Y, U, V, color=U, cmap=plt.cm.Blues) -@image_comparison(baseline_images=['streamplot_maxlength_test_image'], +@image_comparison(baseline_images=['streamplot_maxlength'], extensions=['png']) def test_maxlength(): x = np.linspace(-3.,3.,100) From 6cef6bc58764e5a986ae959276d61fa37909bc64 Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Fri, 26 Feb 2016 01:56:22 +0100 Subject: [PATCH 05/11] New streamplot option integration_direction added. --- lib/matplotlib/axes/_axes.py | 5 +- lib/matplotlib/streamplot.py | 43 +++++++++++++----- .../test_streamplot/streamplot_direction.png | Bin 0 -> 26797 bytes lib/matplotlib/tests/test_streamplot.py | 24 +++++++--- 4 files changed, 53 insertions(+), 19 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_streamplot/streamplot_direction.png diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index fc16c8ac9e11..78107e688a49 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -4605,8 +4605,8 @@ def stackplot(self, x, *args, **kwargs): label_namer=None) def streamplot(self, x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', - minlength=0.1, maxlength=2.0, transform=None, zorder=None, - start_points=None): + minlength=0.1, maxlength=4.0, transform=None, zorder=None, + start_points=None,integration_direction='both'): if not self._hold: self.cla() stream_container = mstream.streamplot(self, x, y, u, v, @@ -4621,6 +4621,7 @@ def streamplot(self, x, y, u, v, density=1, linewidth=None, color=None, maxlength=maxlength, start_points=start_points, transform=transform, + integration_direction=integration_direction, zorder=zorder) return stream_container streamplot.__doc__ = mstream.streamplot.__doc__ diff --git a/lib/matplotlib/streamplot.py b/lib/matplotlib/streamplot.py index 8d371dbdb77c..c1f254a56431 100644 --- a/lib/matplotlib/streamplot.py +++ b/lib/matplotlib/streamplot.py @@ -22,8 +22,8 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', - minlength=0.1, maxlength=2.0, transform=None, zorder=None, - start_points=None): + minlength=0.1, maxlength=4.0, transform=None, zorder=None, + start_points=None,integration_direction='both'): """Draws streamlines of a vector flow. *x*, *y* : 1d arrays @@ -59,6 +59,8 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, *start_points*: Nx2 array Coordinates of starting points for the streamlines. In data coordinates, the same as the ``x`` and ``y`` arrays. + *integration_direction* : ['foward','backward','both'] + Integrate the streamline in forward, backward or both directions. *zorder* : int any number @@ -98,6 +100,15 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, line_kw = {} arrow_kw = dict(arrowstyle=arrowstyle, mutation_scale=10 * arrowsize) + if not integration_direction in ['both','forward','backward']: + errstr = "Integration direction '%s' not recognised." % integration_direction + errstr += "Expected 'both', 'forward' or 'backward'." + raise ValueError(errstr) + + if integration_direction=='both': + maxlength /= 2. + + use_multicolor_lines = isinstance(color, np.ndarray) if use_multicolor_lines: if color.shape != grid.shape: @@ -129,7 +140,7 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, u = np.ma.masked_invalid(u) v = np.ma.masked_invalid(v) - integrate = get_integrator(u, v, dmap, minlength, maxlength) + integrate = get_integrator(u, v, dmap, minlength, maxlength, integration_direction) trajectories = [] if start_points is None: @@ -404,7 +415,7 @@ class TerminateTrajectory(Exception): # Integrator definitions #======================== -def get_integrator(u, v, dmap, minlength, maxlength): +def get_integrator(u, v, dmap, minlength, maxlength, integration_direction): # rescale velocity onto grid-coordinates for integrations. u, v = dmap.data2grid(u, v) @@ -438,17 +449,27 @@ def integrate(x0, y0): resulting trajectory is None if it is shorter than `minlength`. """ + stotal, x_traj, y_traj = 0., [], [] + try: dmap.start_trajectory(x0, y0) except InvalidIndexError: return None - sf, xf_traj, yf_traj = _integrate_rk12(x0, y0, dmap, forward_time, maxlength) - dmap.reset_start_point(x0, y0) - sb, xb_traj, yb_traj = _integrate_rk12(x0, y0, dmap, backward_time, maxlength) - # combine forward and backward trajectories - stotal = sf + sb - x_traj = xb_traj[::-1] + xf_traj[1:] - y_traj = yb_traj[::-1] + yf_traj[1:] + if integration_direction in ['both','backward']: + s, xt, yt = _integrate_rk12(x0, y0, dmap, backward_time, maxlength) + stotal += s + x_traj += xt[::-1] + y_traj += yt[::-1] + + if integration_direction in ['both','forward']: + dmap.reset_start_point(x0, y0) + s, xt, yt = _integrate_rk12(x0, y0, dmap, forward_time, maxlength) + if len(x_traj) > 0: + xt = xt[1:] + yt = yt[1:] + stotal += s + x_traj += xt + y_traj += yt if stotal > minlength: return x_traj, y_traj diff --git a/lib/matplotlib/tests/baseline_images/test_streamplot/streamplot_direction.png b/lib/matplotlib/tests/baseline_images/test_streamplot/streamplot_direction.png new file mode 100644 index 0000000000000000000000000000000000000000..77786b3e48757efab825d5946b3bd33db49ee8a1 GIT binary patch literal 26797 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 Btycg5 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_streamplot.py b/lib/matplotlib/tests/test_streamplot.py index 8a8d8c0290ad..e13eb82f098a 100644 --- a/lib/matplotlib/tests/test_streamplot.py +++ b/lib/matplotlib/tests/test_streamplot.py @@ -16,6 +16,14 @@ def velocity_field(): V = 1 + X - Y**2 return X, Y, U, V +def swirl_velocity_field(): + x = np.linspace(-3.,3.,100) + y = np.linspace(-3.,3.,100) + X,Y = np.meshgrid(x,y) + a = 0.1 + U = np.cos(a) * (-Y) - np.sin(a) * X + V = np.sin(a) * (-Y) + np.cos(a) * X + return x, y, U, V @image_comparison(baseline_images=['streamplot_startpoints']) def test_startpoints(): @@ -60,16 +68,20 @@ def test_masks_and_nans(): @image_comparison(baseline_images=['streamplot_maxlength'], extensions=['png']) def test_maxlength(): - x = np.linspace(-3.,3.,100) - y = np.linspace(-3.,3.,100) - X,Y = np.meshgrid(x,y) - a = 0.1 - U = np.cos(a) * (-Y) - np.sin(a) * X - V = np.sin(a) * (-Y) + np.cos(a) * X + x, y, U, V = swirl_velocity_field() plt.streamplot(x, y, U, V, maxlength=10., start_points=[[0.,1.5]], linewidth=2,density=2) +@image_comparison(baseline_images=['streamplot_direction'], + extensions=['png']) +def test_direction(): + x, y, U, V = swirl_velocity_field() + plt.streamplot(x, y, U, V, integration_direction='backward', + maxlength=1.5, start_points=[[1.5,0.]], + linewidth=2, density=2) + + @cleanup def test_streamplot_limits(): ax = plt.axes() From e67ade88a29428f4e96a599b32ab240075dc3c07 Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Fri, 26 Feb 2016 11:41:01 +0100 Subject: [PATCH 06/11] Comply with pep8. --- lib/matplotlib/axes/_axes.py | 31 ++++++++++++++++--------------- lib/matplotlib/streamplot.py | 17 +++++++++-------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 78107e688a49..f4fde1744ea7 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -4606,23 +4606,24 @@ def stackplot(self, x, *args, **kwargs): def streamplot(self, x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', minlength=0.1, maxlength=4.0, transform=None, zorder=None, - start_points=None,integration_direction='both'): + start_points=None, integration_direction='both'): if not self._hold: self.cla() - stream_container = mstream.streamplot(self, x, y, u, v, - density=density, - linewidth=linewidth, - color=color, - cmap=cmap, - norm=norm, - arrowsize=arrowsize, - arrowstyle=arrowstyle, - minlength=minlength, - maxlength=maxlength, - start_points=start_points, - transform=transform, - integration_direction=integration_direction, - zorder=zorder) + stream_container = mstream.streamplot( + self, x, y, u, v, + density=density, + linewidth=linewidth, + color=color, + cmap=cmap, + norm=norm, + arrowsize=arrowsize, + arrowstyle=arrowstyle, + minlength=minlength, + maxlength=maxlength, + start_points=start_points, + transform=transform, + integration_direction=integration_direction, + zorder=zorder) return stream_container streamplot.__doc__ = mstream.streamplot.__doc__ diff --git a/lib/matplotlib/streamplot.py b/lib/matplotlib/streamplot.py index c1f254a56431..e0ffdda091fe 100644 --- a/lib/matplotlib/streamplot.py +++ b/lib/matplotlib/streamplot.py @@ -23,7 +23,7 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', minlength=0.1, maxlength=4.0, transform=None, zorder=None, - start_points=None,integration_direction='both'): + start_points=None, integration_direction='both'): """Draws streamlines of a vector flow. *x*, *y* : 1d arrays @@ -100,15 +100,15 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, line_kw = {} arrow_kw = dict(arrowstyle=arrowstyle, mutation_scale=10 * arrowsize) - if not integration_direction in ['both','forward','backward']: - errstr = "Integration direction '%s' not recognised." % integration_direction + if integration_direction not in ['both', 'forward', 'backward']: + errstr = "Integration direction " \ + "'%s' not recognised." % integration_direction errstr += "Expected 'both', 'forward' or 'backward'." raise ValueError(errstr) - if integration_direction=='both': + if integration_direction == 'both': maxlength /= 2. - use_multicolor_lines = isinstance(color, np.ndarray) if use_multicolor_lines: if color.shape != grid.shape: @@ -140,7 +140,8 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, u = np.ma.masked_invalid(u) v = np.ma.masked_invalid(v) - integrate = get_integrator(u, v, dmap, minlength, maxlength, integration_direction) + integrate = get_integrator(u, v, dmap, minlength, maxlength, + integration_direction) trajectories = [] if start_points is None: @@ -455,13 +456,13 @@ def integrate(x0, y0): dmap.start_trajectory(x0, y0) except InvalidIndexError: return None - if integration_direction in ['both','backward']: + if integration_direction in ['both', 'backward']: s, xt, yt = _integrate_rk12(x0, y0, dmap, backward_time, maxlength) stotal += s x_traj += xt[::-1] y_traj += yt[::-1] - if integration_direction in ['both','forward']: + if integration_direction in ['both', 'forward']: dmap.reset_start_point(x0, y0) s, xt, yt = _integrate_rk12(x0, y0, dmap, forward_time, maxlength) if len(x_traj) > 0: From ac00e8dfe7bfcf000831bdb292887e360c31c82c Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Mon, 14 Mar 2016 21:51:24 +0100 Subject: [PATCH 07/11] conserve kwargs order. --- lib/matplotlib/axes/_axes.py | 11 ++++++----- lib/matplotlib/streamplot.py | 8 ++++---- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index f4fde1744ea7..60006a7ed545 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -4605,8 +4605,9 @@ def stackplot(self, x, *args, **kwargs): label_namer=None) def streamplot(self, x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', - minlength=0.1, maxlength=4.0, transform=None, zorder=None, - start_points=None, integration_direction='both'): + minlength=0.1, transform=None, zorder=None, + start_points=None, maxlength=4.0, + integration_direction='both'): if not self._hold: self.cla() stream_container = mstream.streamplot( @@ -4619,11 +4620,11 @@ def streamplot(self, x, y, u, v, density=1, linewidth=None, color=None, arrowsize=arrowsize, arrowstyle=arrowstyle, minlength=minlength, - maxlength=maxlength, start_points=start_points, transform=transform, - integration_direction=integration_direction, - zorder=zorder) + zorder=zorder, + maxlength=maxlength, + integration_direction=integration_direction) return stream_container streamplot.__doc__ = mstream.streamplot.__doc__ diff --git a/lib/matplotlib/streamplot.py b/lib/matplotlib/streamplot.py index e0ffdda091fe..9c128bf6c4c5 100644 --- a/lib/matplotlib/streamplot.py +++ b/lib/matplotlib/streamplot.py @@ -22,8 +22,8 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', - minlength=0.1, maxlength=4.0, transform=None, zorder=None, - start_points=None, integration_direction='both'): + minlength=0.1, transform=None, zorder=None, start_points=None, + maxlength=4.0, integration_direction='both'): """Draws streamlines of a vector flow. *x*, *y* : 1d arrays @@ -101,8 +101,8 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, arrow_kw = dict(arrowstyle=arrowstyle, mutation_scale=10 * arrowsize) if integration_direction not in ['both', 'forward', 'backward']: - errstr = "Integration direction " \ - "'%s' not recognised." % integration_direction + errstr = ("Integration direction '%s' not recognised." % + integration_direction) errstr += "Expected 'both', 'forward' or 'backward'." raise ValueError(errstr) From e3d24e8ea3ae8af45aed2a1545ffa1845c2d81a8 Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Mon, 14 Mar 2016 21:51:52 +0100 Subject: [PATCH 08/11] Add Whatsnew entry for maxlength streamplot feature. --- doc/users/whats_new/streamplot_set_maximum_length.rst | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 doc/users/whats_new/streamplot_set_maximum_length.rst diff --git a/doc/users/whats_new/streamplot_set_maximum_length.rst b/doc/users/whats_new/streamplot_set_maximum_length.rst new file mode 100644 index 000000000000..e02c30df00bf --- /dev/null +++ b/doc/users/whats_new/streamplot_set_maximum_length.rst @@ -0,0 +1,4 @@ +Maximum streamline length and integration direction can now be specified +------------------------------------------------------------------------ + +This allows to follow the vector field for a longer time and can enhance the visibilty of the flow pattern in some use cases. From 6695ea984064e13bc730322cb93107d0f0e42186 Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Mon, 14 Mar 2016 23:13:20 +0100 Subject: [PATCH 09/11] rearranged docstrings. --- lib/matplotlib/streamplot.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/streamplot.py b/lib/matplotlib/streamplot.py index 9c128bf6c4c5..a63af383eacd 100644 --- a/lib/matplotlib/streamplot.py +++ b/lib/matplotlib/streamplot.py @@ -54,15 +54,15 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, See :class:`~matplotlib.patches.FancyArrowPatch`. *minlength* : float Minimum length of streamline in axes coordinates. - *maxlength* : float - Maximum length of streamline in axes coordinates. *start_points*: Nx2 array Coordinates of starting points for the streamlines. In data coordinates, the same as the ``x`` and ``y`` arrays. - *integration_direction* : ['foward','backward','both'] - Integrate the streamline in forward, backward or both directions. *zorder* : int any number + *maxlength* : float + Maximum length of streamline in axes coordinates. + *integration_direction* : ['foward','backward','both'] + Integrate the streamline in forward, backward or both directions. Returns: From c01484680925628596ddb0ce380f030f42d48781 Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Tue, 8 Nov 2016 12:16:58 +0100 Subject: [PATCH 10/11] Revision changes --- .../whats_new/streamplot_set_maximum_length.rst | 3 ++- lib/matplotlib/streamplot.py | 12 ++++++------ lib/matplotlib/tests/test_streamplot.py | 12 ++++++------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/doc/users/whats_new/streamplot_set_maximum_length.rst b/doc/users/whats_new/streamplot_set_maximum_length.rst index e02c30df00bf..434eb9ec9ecb 100644 --- a/doc/users/whats_new/streamplot_set_maximum_length.rst +++ b/doc/users/whats_new/streamplot_set_maximum_length.rst @@ -1,4 +1,5 @@ Maximum streamline length and integration direction can now be specified ------------------------------------------------------------------------ -This allows to follow the vector field for a longer time and can enhance the visibilty of the flow pattern in some use cases. +This allows to follow the vector field for a longer time and can enhance the +visibility of the flow pattern in some use cases. diff --git a/lib/matplotlib/streamplot.py b/lib/matplotlib/streamplot.py index a63af383eacd..c5cf891679f1 100644 --- a/lib/matplotlib/streamplot.py +++ b/lib/matplotlib/streamplot.py @@ -61,7 +61,7 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, any number *maxlength* : float Maximum length of streamline in axes coordinates. - *integration_direction* : ['foward','backward','both'] + *integration_direction* : ['forward', 'backward', 'both'] Integrate the streamline in forward, backward or both directions. Returns: @@ -101,9 +101,9 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, arrow_kw = dict(arrowstyle=arrowstyle, mutation_scale=10 * arrowsize) if integration_direction not in ['both', 'forward', 'backward']: - errstr = ("Integration direction '%s' not recognised." % - integration_direction) - errstr += "Expected 'both', 'forward' or 'backward'." + errstr = ("Integration direction '%s' not recognised." + "Expected 'both', 'forward' or 'backward'." % + integration_direction) raise ValueError(errstr) if integration_direction == 'both': @@ -466,8 +466,8 @@ def integrate(x0, y0): dmap.reset_start_point(x0, y0) s, xt, yt = _integrate_rk12(x0, y0, dmap, forward_time, maxlength) if len(x_traj) > 0: - xt = xt[1:] - yt = yt[1:] + xt = xt[1:] + yt = yt[1:] stotal += s x_traj += xt y_traj += yt diff --git a/lib/matplotlib/tests/test_streamplot.py b/lib/matplotlib/tests/test_streamplot.py index e13eb82f098a..782a15b13713 100644 --- a/lib/matplotlib/tests/test_streamplot.py +++ b/lib/matplotlib/tests/test_streamplot.py @@ -17,9 +17,9 @@ def velocity_field(): return X, Y, U, V def swirl_velocity_field(): - x = np.linspace(-3.,3.,100) - y = np.linspace(-3.,3.,100) - X,Y = np.meshgrid(x,y) + x = np.linspace(-3., 3., 100) + y = np.linspace(-3., 3., 100) + X, Y = np.meshgrid(x, y) a = 0.1 U = np.cos(a) * (-Y) - np.sin(a) * X V = np.sin(a) * (-Y) + np.cos(a) * X @@ -69,8 +69,8 @@ def test_masks_and_nans(): extensions=['png']) def test_maxlength(): x, y, U, V = swirl_velocity_field() - plt.streamplot(x, y, U, V, maxlength=10., start_points=[[0.,1.5]], - linewidth=2,density=2) + plt.streamplot(x, y, U, V, maxlength=10., start_points=[[0., 1.5]], + linewidth=2, density=2) @image_comparison(baseline_images=['streamplot_direction'], @@ -78,7 +78,7 @@ def test_maxlength(): def test_direction(): x, y, U, V = swirl_velocity_field() plt.streamplot(x, y, U, V, integration_direction='backward', - maxlength=1.5, start_points=[[1.5,0.]], + maxlength=1.5, start_points=[[1.5, 0.]], linewidth=2, density=2) From 4652f7f39743d943f1063a6a0ab020857b320de6 Mon Sep 17 00:00:00 2001 From: Manuel Jung Date: Wed, 9 Nov 2016 09:02:32 +0100 Subject: [PATCH 11/11] Add missing whitespace --- lib/matplotlib/streamplot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/streamplot.py b/lib/matplotlib/streamplot.py index c5cf891679f1..ccf068739cd9 100644 --- a/lib/matplotlib/streamplot.py +++ b/lib/matplotlib/streamplot.py @@ -101,7 +101,7 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, arrow_kw = dict(arrowstyle=arrowstyle, mutation_scale=10 * arrowsize) if integration_direction not in ['both', 'forward', 'backward']: - errstr = ("Integration direction '%s' not recognised." + errstr = ("Integration direction '%s' not recognised. " "Expected 'both', 'forward' or 'backward'." % integration_direction) raise ValueError(errstr)