From baa5b5947990bc5027493d3d4f2c09f92436bc8f Mon Sep 17 00:00:00 2001 From: simonpf Date: Sun, 22 Oct 2017 18:30:57 +0200 Subject: [PATCH 1/4] Added capstyle and joinstyle attributes to Collection class. --- lib/matplotlib/collections.py | 59 +++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index ad660e97ecbd..3009c3d45355 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -52,11 +52,16 @@ class Collection(artist.Artist, cm.ScalarMappable): prop[i % len(props)] + Exceptions are *capstyle* and *joinstyle* properties, these can + only be set globally for the whole collection. + Keyword arguments and default values: * *edgecolors*: None * *facecolors*: None * *linewidths*: None + * *capstyle*: None + * *joinstyle*: None * *antialiaseds*: None * *offsets*: None * *transOffset*: transforms.IdentityTransform() @@ -104,6 +109,8 @@ def __init__(self, facecolors=None, linewidths=None, linestyles='solid', + capstyle=None, + joinstyle=None, antialiaseds=None, offsets=None, transOffset=None, @@ -145,6 +152,16 @@ def __init__(self, self.set_offset_position(offset_position) self.set_zorder(zorder) + if capstyle: + self.set_capstyle(capstyle) + else: + self._capstyle = None + + if joinstyle: + self.set_joinstyle(joinstyle) + else: + self._joinstyle = None + self._offsets = np.zeros((1, 2)) self._uniform_offsets = None if offsets is not None: @@ -304,6 +321,12 @@ def draw(self, renderer): extents.height < height): do_single_path_optimization = True + if self._joinstyle: + gc.set_joinstyle(self._joinstyle) + + if self._capstyle: + gc.set_capstyle(self._capstyle) + if do_single_path_optimization: gc.set_foreground(tuple(edgecolors[0])) gc.set_linewidth(self._linewidths[0]) @@ -536,6 +559,42 @@ def set_linestyle(self, ls): self._linewidths, self._linestyles = self._bcast_lwls( self._us_lw, self._us_linestyles) + def set_capstyle(self, cs): + """ + Set the capstyle for the collection. The capstyle can + only be set globally for all elements in the collection + + Parameters + ---------- + cs : ['butt' | 'round' | 'projecting'] + The capstyle + """ + if cs in ('butt', 'round', 'projecting'): + self._capstyle = cs + else: + raise ValueError('Unrecognized cap style. Found %s' % cs) + + def get_capstyle(self): + return self._capstyle + + def set_joinstyle(self, js): + """ + Set the joinstyle for the collection. The joinstyle can only be + set globally for all elements in the collection. + + Parameters + ---------- + js : ['miter' | 'round' | 'bevel'] + The joinstyle + """ + if js in ('miter', 'round', 'bevel'): + self._joinstyle = js + else: + raise ValueError('Unrecognized join style. Found %s' % js) + + def get_joinstyle(self): + return self._joinstyle + @staticmethod def _bcast_lwls(linewidths, dashes): '''Internal helper function to broadcast + scale ls/lw From e56e3baa050ab7a4c2c707d22dc51de3c99fe3d7 Mon Sep 17 00:00:00 2001 From: simonpf Date: Sun, 22 Oct 2017 19:09:12 +0200 Subject: [PATCH 2/4] Added test cases for setting of capstyle and joinstyle attributes. --- lib/matplotlib/tests/test_collections.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/matplotlib/tests/test_collections.py b/lib/matplotlib/tests/test_collections.py index c27aeb11a159..534690aea28f 100644 --- a/lib/matplotlib/tests/test_collections.py +++ b/lib/matplotlib/tests/test_collections.py @@ -626,6 +626,22 @@ def test_lslw_bcast(): assert_equal(col.get_linewidths(), [1, 2, 3]) +@pytest.mark.style('default') +def test_capstyle(): + col = mcollections.PathCollection([], capstyle='round') + assert_equal(col.get_capstyle(), 'round') + col.set_capstyle('butt') + assert_equal(col.get_capstyle(), 'butt') + + +@pytest.mark.style('default') +def test_joinstyle(): + col = mcollections.PathCollection([], joinstyle='round') + assert_equal(col.get_joinstyle(), 'round') + col.set_joinstyle('miter') + assert_equal(col.get_joinstyle(), 'miter') + + @image_comparison(baseline_images=['scatter_post_alpha'], extensions=['png'], remove_text=True, style='default') From 883377842170e83204bbca1d8e2f55255f2ac64e Mon Sep 17 00:00:00 2001 From: simonpf Date: Mon, 23 Oct 2017 21:04:28 +0200 Subject: [PATCH 3/4] Added image test for capstyle and joinstyle of Collection class --- .../test_collections/cap_and_joinstyle.png | Bin 0 -> 30397 bytes lib/matplotlib/tests/test_collections.py | 24 +++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_collections/cap_and_joinstyle.png diff --git a/lib/matplotlib/tests/baseline_images/test_collections/cap_and_joinstyle.png b/lib/matplotlib/tests/baseline_images/test_collections/cap_and_joinstyle.png new file mode 100644 index 0000000000000000000000000000000000000000..ef18c1311d89760315f32b18678447f0341dcb89 GIT binary patch literal 30397 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

X&HMCkWBEeJ7$)$B=b%fQ#bXelnEgP30JI6l( zj&ra1%Q7-nob03)nJ51kElQk4omTh9LL-rK%(dtQTWs${!3UN-QZxczS0DN|v@hb~ zV};TD?vuf^;oy#EaF=sGvOcp)5#w-LF;}XCn(f&RW^2@C<-tN_nU{$huR>SJ5~5kg zTr(5-Fam^Z8ZlAS6y(gEsa#jD-cqqWu(w!vRH8wgr&VI=Ol{uNH2P-3i`8k(MxP$X zH%|tIfug3oWWh5hX!nkPXWVDP`&aIVuZiw{@7x?j19Th!B#<)3|C!GA$LkCuV7iT< zn>M%F-WoUMiMp=-WTEcVgM!K-fY z7xNHN;kl)GI8Y>IWmrjT8w-U`8X-ZUIX^6C{9Eq*qi;}6M37P^lW1;cT~)}c{%ik! z{Pm^Y{f%@=DI=q-GOO&DB%NW2soXmY%qC{Zv=oy22sqPG%a1?dJxFm8QCS<%$euV8 zFO~XQP$8eMet%~vk=9|5`)H{@gkr7@n~VXU356OQ$h}y0<-Pj5$|D;OoPEoIjmYajwlGt%^t%2e7FME26V=mbs0VeV2vXjtWqr8{|pEgH-T0QjQu9RnI(t-Yu z&spS`SF{tPzC|+675(MZx)MeQXd#iFO41zJbj;zM!4c+}?;IyZYN}VRUj4ls9uSSk z5NX;aAUapQCZ8#*(AsL+jze|~Tkh*iMQFr1s=G3C&Zb16p|ow-&vCo~+*` z+0Un?ta@ZoYUs@-6qJ_;(uQ{Ir$*GMY!^sfVj_{)(2|1tR%-?+I@PT5w?zF}YHAl6gzdi*NtSbYpE^E8> z>hIQFvm{QwAuF9YRd+veDuHw7M$Y}`(!dYBn5N~OdUfaW3yeJ3IY;^&k6dp%Q@buO zmrRG#vexdzBi~Mnoco8JHJ;A2wGPWk*@$80E0>#LPgq!*^e)ew9(9I`x|a&L6e1tS zLq5DfLUW~dEBu7k$A|uw(Zu-9&LHf{g{UZH`_GOOUUO}woQqWTkrz36g|7KdNmwh`rQsejm$w_!*>H{YZEl%agxEdXhvED?m~c6`_p`~a zJNx^$VpbEUWrqIX64+>$xFU8^3Z#O+O#EzA@8fzu8#0^Wvel6coBz|^mxoiizx_Ux z(yU!}yUCE=Y7w==Q^iWVlmxQNJIOAWZ$cb;*r!iD z3uUUR>Jgd=WVopYTGRbPX$lMB9vu)G9}=_cu!jV=97xWz5nqV+_9lxEh|~95(#&NU z*ZAYo)^M-e8>*ijWncWVH6}$cUJsXUqFa#)KIZfO}#ss zIrlH_$i%$4OOxbBAx3kP3L$SaQax^Wlxu7k%TbKZQ>fs172S{2Ar@Mas_mDC!bH^+L8_NqKO zs`BzBS-dP0x?rNUuCv8i%N9X!K|q)}5O)iHsX_FwV!2kQo#dTz$1==SqI%TJpwp_~fO8|C847>L< zDc3|Cc+Gfx90>*Tpj!38?N!IO4#0A@66Os)8c2mS&QMOdg2UIXJq?wJZZD7S62D3E-@kv z;-E=I6~tuYB+n{aG3_KH4+>>R+Tiu~>{HFy6$E zwuRW>m>xZ%IV-sym(Z`YH=;J_bujUk(-wKgd3I|U$;+PM0Bs@7OIa-{>VecC6@%t z&%XVcZE4hSedR=!+CwC3jvBcCDi(G$I3g(MP4JS+17x5(zDzT}@;LQG&NYjOz)l}@ zRg$lsw?cW3)!mJwP$z#qO8Rm-uZz=R0d|3(+V$W91?5La@ng}51>y1fl6uE**Z{CY=ayU9DJiuDN>OsJW4akgp>vNGF_1X5FlT zKa zmtPX=Wk%WJdvNE-pR3MR&A#AIl%4x)FoqH#D7s%y+3J5+fqmqL$

vEzG~!io!4h+ry~Q6D(hs;O1>;+ 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 HPx}8GDm3|m literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_collections.py b/lib/matplotlib/tests/test_collections.py index 534690aea28f..03d5c80b38e9 100644 --- a/lib/matplotlib/tests/test_collections.py +++ b/lib/matplotlib/tests/test_collections.py @@ -14,7 +14,7 @@ import matplotlib.pyplot as plt import matplotlib.collections as mcollections import matplotlib.transforms as mtransforms -from matplotlib.collections import Collection, EventCollection +from matplotlib.collections import Collection, LineCollection, EventCollection from matplotlib.testing.decorators import image_comparison @@ -642,6 +642,28 @@ def test_joinstyle(): assert_equal(col.get_joinstyle(), 'miter') +@image_comparison(baseline_images=['cap_and_joinstyle'], + extensions=['png']) +def test_cap_and_joinstyle_image(): + fig = plt.figure() + ax = fig.add_subplot(1, 1, 1) + ax.set_xlim([-0.5, 1.5]) + ax.set_ylim([-0.5, 2.5]) + + x = np.array([0.0, 1.0, 0.5]) + ys = np.array([[0.0], [0.5], [1.0]]) + np.array([[0.0, 0.0, 1.0]]) + + segs = np.zeros((3, 3, 2)) + segs[:, :, 0] = x + segs[:, :, 1] = ys + line_segments = LineCollection(segs, linewidth=[10, 15, 20]) + line_segments.set_capstyle("round") + line_segments.set_joinstyle("miter") + + ax.add_collection(line_segments) + ax.set_title('Line collection with customized caps and joinstyle') + + @image_comparison(baseline_images=['scatter_post_alpha'], extensions=['png'], remove_text=True, style='default') From 36b9c4657f2ce4b4888572fb9a58811b847fa386 Mon Sep 17 00:00:00 2001 From: simonpf Date: Mon, 23 Oct 2017 21:06:03 +0200 Subject: [PATCH 4/4] Added whatsnew entry. --- doc/users/whats_new.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/users/whats_new.rst b/doc/users/whats_new.rst index 362384db8c94..525118696633 100644 --- a/doc/users/whats_new.rst +++ b/doc/users/whats_new.rst @@ -246,6 +246,13 @@ volumetric model. Improvements ++++++++++++ +Add ``capstyle`` and ``joinstyle`` attributes to `Collection` +------------------------------------------------------------- + +The `Collection` class now has customizable ``capstyle`` and ``joinstyle`` +attributes. This allows the user for example to set the ``capstyle`` of +errorbars. + CheckButtons widget ``get_status`` function -------------------------------------------