From 7c7b0372e3fab05b79cd72e822a1658fb80e7fee Mon Sep 17 00:00:00 2001 From: Ian Thomas Date: Sun, 22 Apr 2012 22:01:48 +0100 Subject: [PATCH 1/7] Added tripcolor triangle-centred colour values. --- lib/matplotlib/tri/tripcolor.py | 57 +++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/lib/matplotlib/tri/tripcolor.py b/lib/matplotlib/tri/tripcolor.py index aaf7896be39d..58d40491d898 100644 --- a/lib/matplotlib/tri/tripcolor.py +++ b/lib/matplotlib/tri/tripcolor.py @@ -28,12 +28,19 @@ def tripcolor(ax, *args, **kwargs): :class:`~matplotlib.tri.Triangulation` for a explanation of these possibilities. - The next argument must be *C*, the array of color values, one per - point in the triangulation. - - *shading* may be 'flat', 'faceted' or 'gouraud'. If *shading* is - 'flat' or 'faceted', the colors used for each triangle are from - the mean C of the triangle's three points. + The next argument must be *C*, the array of color values, either + one per point in the triangulation if color values are defined at + points, or one per triangle in the triangulation if color values + are defined at triangles. If there are the same number of points + and triangles in the triangulation it is assumed that color + values are defined at points unless the kwarg *colorpoints* is + set to *False*. + + *shading* may be 'flat' (the default), 'faceted' or 'gouraud'. If + *shading* is 'flat' or 'faceted' and C values are defined at + points, the color values used for each triangle are from the mean + C of the triangle's three points. If *shading* is 'gouraud' then + color values must be defined at triangles. The remaining kwargs are the same as for :meth:`~matplotlib.axes.Axes.pcolor`. @@ -50,20 +57,28 @@ def tripcolor(ax, *args, **kwargs): vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) shading = kwargs.pop('shading', 'flat') + colorpoints = kwargs.pop('colorpoints', True) tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) - x = tri.x - y = tri.y - triangles = tri.get_masked_triangles() - C = np.asarray(args[0]) - if C.shape != x.shape: - raise ValueError('C array must have same length as triangulation x and' - ' y arrays') if shading == 'gouraud': + if len(C) != len(tri.x): + raise ValueError('For gouraud shading, the length of C ' + 'array must be the same as the number of ' + 'triangulation points') collection = TriMesh(tri, **kwargs) else: + if len(C) != len(tri.x) and len(C) != len(tri.triangles): + raise ValueError('Length of C array must be the same as either ' + 'the number of triangulation points or triangles') + + # CAtPoints is True if C defined at points + # or False if C defined at triangles. + CAtPoints = (len(C) == len(tri.x)) + if len(C) == len(tri.x) and len(C) == len(tri.triangles): + CAtPoints = colorpoints + if shading == 'faceted': edgecolors = (0,0,0,1), linewidths = (0.25,) @@ -75,10 +90,18 @@ def tripcolor(ax, *args, **kwargs): kwargs.setdefault('linewidths', linewidths) # Vertices of triangles. - verts = np.concatenate((x[triangles][...,np.newaxis], - y[triangles][...,np.newaxis]), axis=2) - # Color values, one per triangle, mean of the 3 vertex color values. - C = C[triangles].mean(axis=1) + maskedTris = tri.get_masked_triangles() + verts = np.concatenate((tri.x[maskedTris][...,np.newaxis], + tri.y[maskedTris][...,np.newaxis]), axis=2) + + # Color values. + if CAtPoints: + # One color per triangle, the mean of the 3 vertex color values. + C = C[maskedTris].mean(axis=1) + elif tri.mask is not None: + # Remove color values of masked triangles. + C = C.compress(1-tri.mask) + collection = PolyCollection(verts, **kwargs) collection.set_alpha(alpha) From b1812f748d77504ba2778da7b3a6d3e963dc6521 Mon Sep 17 00:00:00 2001 From: Ian Thomas Date: Mon, 13 Aug 2012 21:09:45 +0100 Subject: [PATCH 2/7] tripcolor shading='faceted' deprecated in favour of edgecolors. --- lib/matplotlib/tri/tripcolor.py | 43 +++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/lib/matplotlib/tri/tripcolor.py b/lib/matplotlib/tri/tripcolor.py index 58d40491d898..59dcc413a0a7 100644 --- a/lib/matplotlib/tri/tripcolor.py +++ b/lib/matplotlib/tri/tripcolor.py @@ -36,11 +36,12 @@ def tripcolor(ax, *args, **kwargs): values are defined at points unless the kwarg *colorpoints* is set to *False*. - *shading* may be 'flat' (the default), 'faceted' or 'gouraud'. If - *shading* is 'flat' or 'faceted' and C values are defined at - points, the color values used for each triangle are from the mean - C of the triangle's three points. If *shading* is 'gouraud' then - color values must be defined at triangles. + *shading* may be 'flat' (the default) or 'gouraud'. If *shading* + is 'flat' and C values are defined at points, the color values + used for each triangle are from the mean C of the triangle's + three points. If *shading* is 'gouraud' then color values must be + defined at triangles. *shading* of 'faceted' is deprecated; + please use *edgecolors* instead. The remaining kwargs are the same as for :meth:`~matplotlib.axes.Axes.pcolor`. @@ -62,6 +63,28 @@ def tripcolor(ax, *args, **kwargs): tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) C = np.asarray(args[0]) + + # Handling of linewidths, shading, edgecolors and antialiased as + # in Axes.pcolor + linewidths = (0.25,) + if 'linewidth' in kwargs: + kwargs['linewidths'] = kwargs.pop('linewidth') + kwargs.setdefault('linewidths', linewidths) + + if shading == 'faceted': # Deprecated. + edgecolors = 'k', + else: + edgecolors = 'none' + if 'edgecolor' in kwargs: + kwargs['edgecolors'] = kwargs.pop('edgecolor') + ec = kwargs.setdefault('edgecolors', edgecolors) + + if 'antialiased' in kwargs: + kwargs['antialiaseds'] = kwargs.pop('antialiased') + if 'antialiaseds' not in kwargs and ec.lower() == "none": + kwargs['antialiaseds'] = False + + if shading == 'gouraud': if len(C) != len(tri.x): raise ValueError('For gouraud shading, the length of C ' @@ -79,16 +102,6 @@ def tripcolor(ax, *args, **kwargs): if len(C) == len(tri.x) and len(C) == len(tri.triangles): CAtPoints = colorpoints - if shading == 'faceted': - edgecolors = (0,0,0,1), - linewidths = (0.25,) - else: - edgecolors = 'face' - linewidths = (1.0,) - kwargs.setdefault('edgecolors', edgecolors) - kwargs.setdefault('antialiaseds', (0,)) - kwargs.setdefault('linewidths', linewidths) - # Vertices of triangles. maskedTris = tri.get_masked_triangles() verts = np.concatenate((tri.x[maskedTris][...,np.newaxis], From 8a21c57fa03e4c0cd30df8de817059f988f09054 Mon Sep 17 00:00:00 2001 From: Ian Thomas Date: Tue, 14 Aug 2012 19:58:38 +0100 Subject: [PATCH 3/7] Removed confusing tripcolor kwarg colorpoints and using facecolors instead. --- lib/matplotlib/tri/tripcolor.py | 51 +++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/lib/matplotlib/tri/tripcolor.py b/lib/matplotlib/tri/tripcolor.py index 59dcc413a0a7..e9925cdfea92 100644 --- a/lib/matplotlib/tri/tripcolor.py +++ b/lib/matplotlib/tri/tripcolor.py @@ -33,8 +33,8 @@ def tripcolor(ax, *args, **kwargs): points, or one per triangle in the triangulation if color values are defined at triangles. If there are the same number of points and triangles in the triangulation it is assumed that color - values are defined at points unless the kwarg *colorpoints* is - set to *False*. + values are defined at points; to force the use of color values at + triangles use the kwarg *facecolors*=C instead of just *C*. *shading* may be 'flat' (the default) or 'gouraud'. If *shading* is 'flat' and C values are defined at points, the color values @@ -58,10 +58,32 @@ def tripcolor(ax, *args, **kwargs): vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) shading = kwargs.pop('shading', 'flat') - colorpoints = kwargs.pop('colorpoints', True) + facecolors = kwargs.pop('facecolors', None) tri, args, kwargs = Triangulation.get_from_args_and_kwargs(*args, **kwargs) - C = np.asarray(args[0]) + + # C is the colors array, defined at either points or faces (i.e. triangles). + # If facecolors is None, C are defined at points. + # If facecolors is not None, C are defined at faces. + if facecolors is not None: + C = facecolors + else: + C = np.asarray(args[0]) + + # If there are a different number of points and triangles in the + # triangulation, can omit facecolors kwarg as it is obvious from + # length of C whether it refers to points or faces. + # Do not do this for gouraud shading. + if facecolors is None and len(C) == len(tri.triangles) and \ + len(C) != len(tri.x) and shading != 'gouraud': + facecolors = C + + # Check length of C is OK. + if (facecolors is None and len(C) != len(tri.x)) or \ + (facecolors is not None and len(C) != len(tri.triangles)): + raise ValueError('Length of color values array must be the same ' + 'as either the number of triangulation points ' + 'or triangles') # Handling of linewidths, shading, edgecolors and antialiased as @@ -86,29 +108,22 @@ def tripcolor(ax, *args, **kwargs): if shading == 'gouraud': + if facecolors is not None: + raise ValueError('Gouraud shading does not support the use ' + 'of facecolors kwarg') if len(C) != len(tri.x): - raise ValueError('For gouraud shading, the length of C ' - 'array must be the same as the number of ' - 'triangulation points') + raise ValueError('For gouraud shading, the length of color ' + 'values array must be the same as the ' + 'number of triangulation points') collection = TriMesh(tri, **kwargs) else: - if len(C) != len(tri.x) and len(C) != len(tri.triangles): - raise ValueError('Length of C array must be the same as either ' - 'the number of triangulation points or triangles') - - # CAtPoints is True if C defined at points - # or False if C defined at triangles. - CAtPoints = (len(C) == len(tri.x)) - if len(C) == len(tri.x) and len(C) == len(tri.triangles): - CAtPoints = colorpoints - # Vertices of triangles. maskedTris = tri.get_masked_triangles() verts = np.concatenate((tri.x[maskedTris][...,np.newaxis], tri.y[maskedTris][...,np.newaxis]), axis=2) # Color values. - if CAtPoints: + if facecolors is None: # One color per triangle, the mean of the 3 vertex color values. C = C[maskedTris].mean(axis=1) elif tri.mask is not None: From f5f357e8fdb107963416b4caf579cbb75b9eb1f3 Mon Sep 17 00:00:00 2001 From: Ian Thomas Date: Tue, 14 Aug 2012 20:11:54 +0100 Subject: [PATCH 4/7] Added tripcolor facecolors example. --- examples/pylab_examples/tripcolor_demo.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/examples/pylab_examples/tripcolor_demo.py b/examples/pylab_examples/tripcolor_demo.py index 0817c63c53b1..f97910af7d89 100644 --- a/examples/pylab_examples/tripcolor_demo.py +++ b/examples/pylab_examples/tripcolor_demo.py @@ -32,19 +32,19 @@ mask = np.where(xmid*xmid + ymid*ymid < min_radius*min_radius, 1, 0) triang.set_mask(mask) -# pcolor plot. +# tripcolor plot. plt.figure() plt.gca().set_aspect('equal') plt.tripcolor(triang, z, shading='flat', cmap=plt.cm.rainbow) plt.colorbar() -plt.title('tripcolor of Delaunay triangulation: flat') +plt.title('tripcolor of Delaunay triangulation, flat shading') # Illustrate Gouraud shading. plt.figure() plt.gca().set_aspect('equal') plt.tripcolor(triang, z, shading='gouraud', cmap=plt.cm.rainbow) plt.colorbar() -plt.title('tripcolor with Gouraud shading') +plt.title('tripcolor of Delaunay triangulation, gouraud shading') # You can specify your own triangulation rather than perform a Delaunay @@ -70,9 +70,6 @@ [-0.057,0.916],[-0.025,0.933],[-0.077,0.990],[-0.059,0.993] ]) x = xy[:,0]*180/3.14159 y = xy[:,1]*180/3.14159 -x0 = -5 -y0 = 52 -z = np.exp(-0.01*( (x-x0)*(x-x0) + (y-y0)*(y-y0) )) triangles = np.asarray([ [67,66, 1],[65, 2,66],[ 1,66, 2],[64, 2,65],[63, 3,64],[60,59,57], @@ -90,14 +87,21 @@ [32,31,33],[39,38,72],[33,72,38],[33,38,34],[37,35,38],[34,38,35], [35,37,36] ]) +xmid = x[triangles].mean(axis=1) +ymid = y[triangles].mean(axis=1) +x0 = -5 +y0 = 52 +zfaces = np.exp(-0.01*( (xmid-x0)*(xmid-x0) + (ymid-y0)*(ymid-y0) )) + # Rather than create a Triangulation object, can simply pass x, y and triangles # arrays to tripcolor directly. It would be better to use a Triangulation object # if the same triangulation was to be used more than once to save duplicated # calculations. +# Can specify one color value per face rather than one per point by using the +# facecolors kwarg. plt.figure() plt.gca().set_aspect('equal') -plt.tripcolor(x, y, triangles, z, shading='flat', edgecolors='k', - cmap='summer') +plt.tripcolor(x, y, triangles, facecolors=zfaces, edgecolors='k') plt.colorbar() plt.title('tripcolor of user-specified triangulation') plt.xlabel('Longitude (degrees)') From ece0fb1223a2ea9c91d181a102105768fb9a8789 Mon Sep 17 00:00:00 2001 From: Ian Thomas Date: Tue, 14 Aug 2012 21:07:04 +0100 Subject: [PATCH 5/7] Added tripcolor unit test. --- lib/matplotlib/__init__.py | 1 + .../test_triangulation/tripcolor1.pdf | Bin 0 -> 9878 bytes .../test_triangulation/tripcolor1.png | Bin 0 -> 34541 bytes .../test_triangulation/tripcolor1.svg | 1229 +++++++++++++++++ lib/matplotlib/tests/test_triangulation.py | 28 + 5 files changed, 1258 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_triangulation/tripcolor1.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_triangulation/tripcolor1.png create mode 100644 lib/matplotlib/tests/baseline_images/test_triangulation/tripcolor1.svg diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 3860b031e319..312d30a76f43 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -1021,6 +1021,7 @@ def tk_window_focus(): 'matplotlib.tests.test_legend', 'matplotlib.tests.test_colorbar', 'matplotlib.tests.test_patches', + 'matplotlib.tests.test_triangulation' ] def test(verbosity=1): diff --git a/lib/matplotlib/tests/baseline_images/test_triangulation/tripcolor1.pdf b/lib/matplotlib/tests/baseline_images/test_triangulation/tripcolor1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ac2c3873949c35b90c82ce1591efd5df8dbfc824 GIT binary patch literal 9878 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 c_dwtrT_o{ literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_triangulation/tripcolor1.png b/lib/matplotlib/tests/baseline_images/test_triangulation/tripcolor1.png new file mode 100644 index 0000000000000000000000000000000000000000..1e5e83701ffbe7fdf4eaad3a6713cd17cb9bb5f4 GIT binary patch literal 34541 zcmd?Q^;?zC_dR^*ZloI|1VxbUF6j~}=?3X8={&U3NC}FRv~(lV-QC?G;dhR&&-;hx zZ+Omy7Yes?&+OT=_Fj9hiBwgV#X=`Thd>}$@^Vt@5C{Sd1Ol&viVS{|?jGa_z9G6u z$ZMj4k1wiO1o$_aqug5;2n5F%_6M$5w8$C)p@GOtiEDah9xQtJj=MdgoV;mK8s~z2 z&5eBtZbpPtqgWABQx%KKj&jak7g8DaJBq~+l67MBUfSLDLO*gU%0`ch%1#>lQusVs zcq|3#YJUINcEVaiZ=dAbvVQ3+^v81{g<<)P&E4(RL)uTHmn4XIu#Xz1Tpj{0>~9I~ z6%blF@X1RxhLezjeK9UQXXv6xiD>>kL->kK?B6rY7CM3d z22vaN|M@^MhOQ90!lVK}H(wfD+)ReEiTkApW@ia|B*>1dz|DjI2Wyi!`=@Guft{it zS<1XS)A9RQZ1~5q5fiKv?$(tjJ2BwbH^81)>I@jjOKlNyk=2I2xN3hLvHrIYvSM~!>S3l*Q z?Wx7#rt?;UgnQSA`Qx(1y+6E^V|sVe~2F1@66?HUrs7t zU3yD7cj4ixHy_F1NeCG-z;dCJDc`7&g{TC*(g8${4)==GTl({1qP$w}Gdk=;~V$&PIY& z@E;%Q9jtlzF-~Y;yaiUlGE%Jst6DGz9sCK zRm5{)Sp}g>EI$%pm9YP9B#YZY8mcNWzm!Awb)T?e=s4$)fdvbkL8N^ZcHR28C*1eT z<3mOiPiWP%mt?r;xE~a-G*bTPF;r$T)U1%~oJO{*4$D8IPFQqwU&TFy`6C>d&H1xcsl@HJyv^TN($l-jx*fy7P>zJxeSf zU$n(b;Jloia^=M;DcZi6{OINp>qx!4?EXVEZ*=L$e^Uh8t-OhKsc>1Xmi+AQq< zInBG#A>gt)qOlJ6l77IF-ur3to#Eo517`{+y1WzDheqry>WLZ+=7Pp6mJ0!4VV+F) z^47THuUUwHrWvL4nh#?R8NP$}zKyX#iuZCm_=sfvG(%miJVd>(iA z7A#B=G{ODfPx+8o!~VEfQAi^fS>t}inOCQyGdG2!Bbc0=ygBK_Nyy2G>*|skb&8M+ z)z#Hi)zS)0QWijSZ!~btj4%~ckQ)7R<<6z86WG@kPVFDj9Zeh!6_+AA8GFsXn&~ox zM@hdn1I1VSUR*;N`-F&wlf!jK6(aWd9gXDjPCjT{suw5V7E_~4RM|DAIO@`8p?MD_ z=JA@5VsZjMXIP`T#jY|enQDk;&6SjUp`VQeJ z!TxpKAXd|f4SbL1yoqyj4dhGjhQeC$t?(4w4g17Av#V$ zd2+8esYQvj_hm9YRfAWgMo-6VRxoS)e@Y%K=h%{~Y7&NTtVzx25({5G1BK_&Ytk|(la}EV58^>{bESGr15!uKlX(=f9K6#aH9bfjcek%(xV>33B(L@#vqL zfjF1kL|>o6RbUbBZ|na0&plt=_dB-_{4utY9ey)s`ll;Pfdeu6TyI@NiV1G10(>;E z9y5p*ml_+?{M=3_{yb)@sPsns6fmA9p8ROBz>9+ua71xW9-k&H8?B6MK)1Y1Uo`ny zi1nw2E>6^5$?ssYWz)35ux^LC9g=VD@CC%+VEp~Gd@Q;W;Nh?6QFP&ceeW;-D|o+3 zv--fAY(OtQB_aAt1QgeeZh5_$1uj`7Mv@C9eDV*RuvF~vF;)^)Oi zn%Bgt&YJ|ToogBmifJ!dMh z+cW%84mt579qr&0e*JjmyBmmaR&od?*6`aQzV~F=&z;vkeIU#eS@f1bs1?wV>ZKt) z<)cV_qX)L>TLmQHm3-XVw{^Aa!xy9SaX8xFp1)Lu#?qloH4pc`3~m8kW*#1rn3Uw?_=-GE&J->W zvhO!-diR?gxK?O9gV9jV-pNy+W3EGv#;knmES*nJjBeBIU@N9#F7D~Ugl1a5mA83D z^yW=8G*^L5jF84C2Y&ia%tx|hhq(aPMR}*~+7xp^Sv_BbgT%b;DjLP82WpX}Y}#Nd%#fj<_6Q4XJiLK=$xsKp{B-P2j@X%@UgQb5DYR??#< zd5~wS8iNG67kr8|8ylOK-!~L*Yq1vjK67W24?hp#-rP`_XS0HGGLO<-PiyeVsVrZp=`NZ^o7_eB`;sG4RhQbY$Kw_%9zu{}Oz zFrh>_3gh2eG||dyWdf=n^Bn0IjCW>D*IYs^j2f<(>hXeGjcV3)kx+3CRf|d^JlTYN zC>WsHJUcM)O~#6?ISx~(|hW4FvT0>V{B)RI0(?U0jTJ3#lS=vyN zPiU#(`y+G$sM1=jf%hSZ8_tCMdpd#4s@DAoGZ%=&1sXRmn#W^tC=Qx6ssd&Y`z*^1 zW;l;CgF9-JVf+1&y;$6%2GJ3&bl!NO7QUre5nA#sD?524>(S(jy{)81S zdoA`z@_vsAnK27t$U9OfYPj-=6%QMvHv=hb0_ZFuqYy>W0wivk{2gXOq(%m`SH2>t zQYfRSL^S9%!rN5I&pp6e(SK}Y>o$GtT@tLZMyhDHlG0@zM%ydD7-w94Z_a;mT5pR! zKH1ABlHw&&6~%^vh?1+Wm9?mT%)X4$ zKt^WsJogo<<1v8Qw!~uEd;EoYKv; z8F9%kjT7X=2Y`~1Zou7w#BwMD#Gkt$p_Sp-FEZ-y%hu_6~!(RC|xfh25zWc zc`Je5W6xI|!j@O%<=sVJS%B{%3avXDN!gd~kVIL&^L|EU*om}D*wQintb(`|BGV1$rRCo=M#GizhRg54ip4(f?wF-&<~Nb6||G@Q{{j zotFh^lsE~Ax8d}s7b?n#{9p%Nx8^D{Y`#=T5 zs4;c8PBh9Hyy4)PWUGeBs8w$6Jkw(3^Bm=N*5xm-y`zbn0( z)D?-Hr^Y6xna8t@pIkN*MALZ8tjKF{+^*NDF5Uate-7a@&kO8d{thB|*0qwEo+Ugu zv4-GnEJTV{vZheHdt1$q5J*yYkYswgllDbMWH|_L%g)D07g4Z+FfbZrmHt^;jRHFY| z_0JOQk}v_O-p^EAa5I_l5L=(d9p>~^J|`~2*~DNTDi0;&pN{FoM+Xd!tR%PSI;DJJ z`F%gy;H6?2(DwI-I!|L zlanTpWjts&NybzbO9lP&iQ)h}ez?5V6Uq?m5oDTPqc&A2-EU+J+$XH^Ez}t~YeBB) z%g68Mqj3%onv;?~QD9@1loL}*R&gF@M~6=f!2Fwqtyo-|r>MGL-bmd8ekWLkHXD#6oV*=bxHA@@f!n+RcLU3#DBN z2Y>5xAqBYcx0@m`>rW5bbzv8UVvL!89$jtw<>m&?KQWuwgmPkq@f}O?TaatxtE0N$ z$8*#@NkP+hqZte4A(wGlZLo9I=cNv~OAqA_Jsx}OHe;iNM=3eZldh=Kr)Kun1TGIQ zcF1Mb+n*QS{{{P(6MZ)?`X%a*!1u+!RlFZ%xMoPg*-yp1FY@EFft_hCmjWD0uhSLf zA(I=(Ok$!Vu55yNBvORT_fHPpwZ!`100j}=H(=YU&-yTRXkeqrOie{W#SIFc3qJ`h z@sbb-Eq65L?tkSa@e}n$23B;#iGHn4pq2CYRFnYf-^*(O7uZgvrxIjD|==Cb%u zViQh)97(*{2rlobH@$*FQTzEh3^{1W#vzN9A_o@728u#9H70yThQACuyIm^I1pPl3 zoB+hw!o+cBWQvC7p=A)@J38C4dQKT$ebXPw&BlMu)K zOS!9CDcM|+0?O>T>5}u2f%P&LMN37S;9hIQx}eB12qd^W$QqmgVK9#7gfqW;vmq^T zmJkLw*@qUmWu|kIBCBWB|APFJPTyq-p<0Uw*b%zU-jivdS8~PFaw#lWp~$|?MP(D? zDi-z=P*}2(4zDwSq0jhsoyp;j)CooHj!w~Z=fY?^3j(@Hb^6I*JX-M#0XvAUU5+S5 zwnAX>?eW#uPA^iKB ztcj=|`dMJE-HBnNw!6_oHL7Y}x6THoV+F^sRH3^4a?z1X%egqQ;}s`$F+UsXV~^C- zyQHLqMTa2(!~CJOX8aU6;OomUHy3;q0w?mL&Mv!fpnN5z@#z*Ows z98og+*yY0(?y;;9o+3#JFjD4KpmRQ6t-Er#=C_N6_0zb13RlM|l+fKo`sSG|Q)FP@ zOzaG-UMIr0YQX){7;^jkcowMb|FI+^h)nisXmqm&-l?iCnM~tip6Lip_u|{YBGF;M z!3Z~cG`>~xKL?Rsi&;szhm=BEn*wan_MpI%r|gq$%k7)pgxR8*(=l-}71s_G`Vd@H z$NoU{)GTdZ3zAR+x28gM&o2VO5xTFrxH~&J*jKIub_cQ ze(q4((`&6g%0YPees`B-=#Wl}etoHd`926^jK%l2N{P5MQBgH^j|@0R{88WK*u+pP zHuB7Bu%7#*OEJ-grV4OGLBoF)mH5!la zW`$>h95XMUIgz|=wVlSZrHQi=LJMh|T4*&gHI9T?_VrPDdq2h1(&Zu?e#(0gXVpCNLv6K5r`#GPzjDix5-M+`*}OZTFTJ<$A-(9 z4FFWMwvC7GnM0#ET1IdZtrjmkwKz$!$m{EPLYY`8t#Vd-4X>8m_J1W4f`c#awmsaF zA$n46iyp@SSETg5%i&d>^O15&d*H0SeFQOO2we~os+;ZmBR6J0XM%qgUUc#i*50hT zE-Ued2m&s$wvMk+T1hR8$?CD47aGo`kvfz%7NuK+mTBbr84_5ZOi1xd&1@1(Mp$>* zmBYQ&0Cw)B^eG%?Zewo}nmtfF`y6_$92!gBMqaaZnc9W{h(-Tl)W0U{H$)7HCx1UsL zCdEGNV_lFnaL(xbzHeRdA%7U|$X7kYXVM>FCzMs}=9jSO_d<{`8oOMvYx( zRd!tle^(nbVX-USEKijl_E&+va=J54lQ5h93}Iw*cl3pTT+A(`fIOCD5bU%GoP_Z_ zZY!c*whJsncb>ZBzL7F*_F$#JjwvpE0;*K~{>Q$A{zrrWEDK=az6wz7uH@eqohDGa z5;6>2^c*)t{hX)ylmGD%weUY`JZj}>hYZWgic(*uf3qM=&^L?6#g2bjomXOnIl^~F zqXqH9;<)J^?V(8sHbOj%d_DoD{q*fSN=0SGzhFQAN!v6<(#(|k+>TPRJX!gpx!Y6V27rmozT zNk99)N{zj-o@r-ZOrwD@>2Y*3=vltJ`gCs{GGu*iEq?XQ{tdQUVcD`#)K~Q0&SKwW z7%)yhcUv!2yu4UKf;3sy&=uvvs7&#|KD5_#*~~>;AoTD945l~*?}N|5~1`fxZg#IrR=1DV-GF^$MKK?r%?<^qR)+bc+Bn5r9*{9EfwOG%#O^i#a&+)1K)l99nCUT)>MsmjPohrc+moK2vG#+yH^;a&>K!k zubN+d8_6)h(dl=x*)4e_$bSbZNK+)~1^W!9f>$SUDfYm15q0xq<`Tq zo-X!UBPwce7RPw~%mnr>2R-fB>8efMV_}FzBo-8g|7mt1gz(()c&~%5;?wv|tAL_<|1)#mMLSg(XAH z6lIp*aLukMLwC2xg*;7DeMRgV;4}eA*~%^s?s0cDQpfq-xj*S;rM>4gP3TgjWEalF zgy%eq&IoBs&5Y?JYbb$#5Vfz}d7zQUcNL&?6)!^VPYAcT;duBh^e@Vydqi@~c z?q{x-xDkq9lElv~QJve4|1}l-V+-XsJsp1DVD;(FX_|qYn0mF_p@@{O-!Eq{%v6{P z?hWJ9m5VKAG(>n5w$zDT*F|N?o0Ru|;gg$OSFU^5;Co&~N%WH>GT0Rx#4O;5%KVYP z%^Q!0C&6q>tx8w>A%wTCt83!Eh%z>&S$Wcg+7|X=Sz}H{0l{82;J#Nkxtx`M#fP3) zsi#j`BQNpQ$F(D!z#{5}XjY3OJXj%ZOJhODFbR|eD>Fh@I5V6K{hHTg6PE8bOI{sq zJ|P8-6$Y-$&n_wkJB(zyaNB>?@ z>7BWJ&e4$Y1R(+gQIo^msDu4o)*<{!OduNq_lUde+4~~XjX_x{;T+U0J63IS+0_eO z-XC_(vsNh^c2NWo!=Fa9gHx;R4)}Mykyh{$20$0==~l7R@&jLb;iTp@Yd& zvDVf)2kyNax&``dVkQw7>~IW%tGcG)9>gddEJERmn0YpdAzRGvwz-qg-p0m8<#2v> zx08jFFYo> zjg@M*mf~W68~lr+mDR|sE|h9M5AKlVr%!2x!)%qR0}rh(%wA+iZAWG9*vqi1S@KdY z2bRvVs2RjB#b-k`_@Wezjo`+@hfoYd9SRJ#={-D{wYL}biZMVJ>N!*1)jlN*G<62V z=6=~1b4r0AGGfum{De*D6Kie$=&1jpZ_`Q2j0=_A+ZSnC;r3HIcANSRoVlOBMpCn} zu-yyqN^fg;Je8Nw*VnHTesAzTK6iW9_2(nO`vngikIp;OJU6)@7kni&HsXLc4H!1R^ zI)N9oxTq8-lb1cjsE9uoi8wE2maUAjN%Dtr_qS{ekS z(*+2Xl(E?p<`}B=bN|X5!5AfK*`%`xRcjNPY+KBnmk1cR_)PXf`hO#3Gs4f0ScIye zyKO4#1h`-6;YAhX0%6gEmPOk)4^Dc$$ml`)e^k*!5rynBVHUfUs;xaSgbPZiA$rpC zT0+Z0C?u+*thW&F@?fjbp(%m;W~mVp7^k5gUl`Q9CqEyi?}V9szl7%hnD6*pusc|3 zHeq(jw{8(S4tDAR5Qr|$R8@7(Cx9wi@`W;u!`;MP8LQ|od^X%Z18CRnnDY+9$ir8NZSlJxje1`7u4JXN2UQcSccPvt-0;M0Hj-pV`z0L2I~pmR_e`IC zPn3v;0fSukMfVXeD=;)@60Ss?lb-~88KG1P+trzJ5i2J4Gc0DsK55 z#^fU|1}rRm;gJ1lpP#&o;mmFIq4O)5rvI8Btbr`& z7Q;i(;vUnx)qH>Wtieoaq4qC6PjR!Ay zmtG&gJ6`Mu*zPT)rXaWEUbNX|A$0~&Mlq+ZC*tfnVMMks)<6KJ(!B`3YQ&_ z#!m11p?W@w=}|a`dqr3tW@ausgrEF^od6(&*)QQ5owQ|-<1FGpRt`LCd;P-Kdmp{_ z5Sw&XrBEz;Ra0N&jK&zuT7*t)YMb-S{jQSqVfHO`RQm=DnoM!aMKI-bvRApQSQ^YjkRj%|Y(HS`#2KIyr5 z`xj%(4>FZD*k@%y`+6?ftDWon&1__wSX?9HV8dYuvYpcxij!u6aD;PPTcoFS+<*k1 z74m-eJXf6XYkUnWzLy}$34FzxU%RI4(oX$X-OA<~@|o0cx>o{)Bv?0C|78``yv9|m zhbANAnr8VYY7&;bn>(o=+Mmu*l0_P^+Ku=!5b)uq4aNiO!rxXBhy^pyMjEshIMoJM zojR#)JAti$?YY?M-oIA+qq=IWN>WlqYJMLf64;U}_$wC2W{hfH=Y3IhmB*Kq^}2~W ze@O>q?zv3x^#$=^C#r%3&Q`#ZTGbWofpl@7C&`oF4K!JQh%n*VTe5>bv0F)aA#XPm zgql5gF;d-4p$%CTItpo-^|F?GR@zuy&!6FAfugTEaxiIG9-0-~W-{5{qK~cm%U*qq zq9=V6q+&^37EtB_?^Cv>bB*I71A+z{%$J+B^iN4s|1`?nnL7szbDZvcV2$mXlVS@Fff02^Bg&q6xlt3$NNiZ)y#0UMP zYdZ}DNX6zl79^&@Qo$9UPi#)>&8``rr3z$Vqs)b6qE446oz#I!K5g3U&(}D|Ti7#$ zDE@zgI-82!)7zY0<@qV@{<`5b|G(yWn)M+>q#WAoBun8LM=6RwBMjn&`i}c;cvHiKxeXW`tgH;Pn}d1jWjj+65;(17}})E}@Rl{5LELlAhcK;yl_* zwHMbKQrGz!KYx~a&`gj1i_Z`L(Qqqdm|XzvS9{c&=7Q_nV@jWZpY>>eNwWu7O1Z3n zq0$)8$lYIv4W=K0U|_`Floj^+Y|&3-$PDsD$wu5B9>;_p9c{t&+2fz57%ruHRf93V z#>sssq>l~;_H9qU#_I8puK?%kwsCzCw13=)cjDqAR_Z*xTj3^&E7>XZ{$y@Fy<*YY z_?U8(osFL2hWRD@q`txTw~vsMqbn)4Ov)vO$=&eVRROuUkIdV2Zh#p^)ruS`+xaa4 zl7V(M!0Nuh*--m#xMA%d8;t}Kx6Mj+gTM}Me&7H!0qnJ_YZ!M_U_#KllFBGcwow`| zAM@9gp^0%yRwbvPCdY9V%!)UwH2Ctug=y3@>~7_EtgNi72_6e{>9g$agyiYsmei;k zbI-So56>uHa<&ExSG|Q>KZSL_OEayFVEeCSE*cUWN)B2mBz2Y5Cd+t))@9Sl|mp&0aQ0|I%G9*ZpVaB=@u`18E@>aPu; z#ZIjR?Csr7bD|JR+A3P&rCR>#y*sEoWwo)CPP_*$z#TPL-ZM1a4?6VBK6~%57q}`d zM#|~s+h##~|J5wT2TiFxqqpv4RBw~OmPpU`$7*LbSe+a)L-gya$=;iXH9VmmWd~NW zxuF){U?61}R}JcIUlqLOf{Q&vFvceLLbbH@`B{FT5G{Co zBj4Qp=ixt{h^X|oK`}FLWA_q!!P(7BMpWYCf>yYeWJ4uND9lXJqfv=DJ)gh&8Z~;y z`}$Q(1raE^;RP%jySH(0LfCzdBd+HCdQLq9gjE`~GtP7o3cmB`&K~HnpkjGF!HPfQhyw$0L+ZUKThqCm;msaWw7XTkD>+*HR@-|f zT3#(&NN)^CvP_QyJZgz^pf6n%SVKd>C~*wA#asFZw?XY_prB9QVrR$En11N;ZL;m!@hiHC%x=)z= z_!}Xh5!AWJ3MhTnRo@*+etG(Hy5R#SCAwgAMvZ_;03A!c5$DD= z4vuLk;wXNqeLb)==_!}=<+B20;0HBPO4r8chRNbgAIpaT$uRlogwoGy*AophY8q z$5PAU9GN9#!WGqo=XGYBlLeeqh;PPdy{HgNI19+R5kU?@-27B}% zvvZ$TfKA6;rv_hPiZ{r$CX~kV&E_d4{2L@)@%M@Xnru6dvqtqimk6rxQk@+I_hx)# ztKZ$#oS$5mzfENw{4}5R(qEVU;?K-GpH*%*ouqX9JB%bcfGU&cd;#H!tw$0s+XmrM z@}>|p?-665qsbr290Xe6^r~ikWC=|uGa>`(aAcpqA!ZE|g*4SnhP>MDb|>WDsL%Ih zCZiq(r|vn3259?kbw>Lbg`mBXn*FB;p-vg!Cv}6`a?&`1yI=1;9*f-E7!tGoAkwbF zsd^+9aVGJd+QyKB0jN*$7pD9Kd1!Sz4^`P;k`e7?IsvrH)gn&%F>+laLLr2`E;W(r zO@=_&Y0Kv&Qx!6P=D*Z`?z~Y}hBQMmVtjyF$q)MGyL{B{k*NqWKY+2hOf|NGnb{YB zwB?eH1kuoIJSdv6&osL?7-Nxn*bD$%U;J;2m0!nIcpLXpZ+)Db0l;a|3m`*QK4$El zZmDMMkT8JD7;=J`jLG%bp_UJz4pxlv-q)nNV`An&iyEqk5zjjn9>z!2B}2G&`(XF| zPc}94=H7O*OhK&8hf!vMUm}T!1ND8uf1iSGy#!|mm{g&_FI4m4 zYrtj-_@$SASM0|E$xLx{(Yu=Up3^hZ2h;?Hm1SEWic_|9}JMf)*V1kPj33ulidlp|dA-n<>$jQ3v&>3b(Oz9`4hNH9Gtg zKyvU40_OBZid>ipL+2|t8upYl5rE2Qe{YMo-;YQ~psogV9pjRr*N4U8$McBf8 z)8ks-f#g=)_b<}*GzFii7ZOnF8?a5dJk{3ssg!k%skndi7`(AE_8cJF7uKw2dbMOuD4FA+Bx)U7joXh&%RJY-JXETk5x}L zBc(eze4o~i6C2U1cyDLcS`yIKkB5NUOAxzXUJ!DO*HXPBAz~2E2Lpm3s*;0;0(1-; z)$DE<><%m|bw*vzqMo#6rh0zsgX)!QZh>{xyy0HUGG35YiUwD8-~tPJ!v=fvuQCks zl8Tpp9~Z4P(e`J8%wiHTCT9d02NvjT8!e~|b$iFl@((kz7%_9kzRv)2ZyBn^v41BT zOBO-6y|xgQczHsNNJBrT$8tQ{aTekyqY!1l4_}S6{ALLy~lODcX zXO@Sse%u?HzN1EQTWh42KSEUFF1~sBQj-rZ`;{!cpgIqOxmOhBhXc~DGjA*Rp(W*S?*vm^tpd5cnb^H-yQe3w z6pVyrDv{SOy4Gz8z16d0n)K3w_|GQ=qZVd!KGvTa{si5LC~!kaO4w>RH8OEJeZ}?= zmr}a2_Fy8v<{N@LNLwmT8^1m;cKVM(;U8M~nv+LApM1twArU`?y%Ig=Ng=4TnBPZh zDhoN1go^{sK`q$4)NK49896IK7azQ@v;c$pUOL~Gb-q|!0ib}H;T+1Z(=x>(5N1-! z{9`?gbwU)(DAC8Jl5-j0oHQN=Zr)Pr*yaY0W`=_Yj&m6`LlCyrI*$uv0{%MM9ELdq-ArNM`vUa@*d~2U2yt8 zegf(;W)bR>oH%@r_XRv}azyl1qn(++VUZXkriy9(wAt1>+5K>)DF4i%UQ-V&>XZIN z2u?VYi$aM4K)JnWhFq&@3C)07C0G3JoB4U`n{idQtciJQMg+$R+ULa_Fz(CX`TMJ< z!*h&t$I_+rn6I+DRt|&>Rnoi@D@j}>J0yfiWREqB=Lc|Bg%8>?wy#`{HK;O6e1s zS&Nn5$x1SXOy%uiL;MziFZ-K53R5OW+C7x>;du=XzI5zWg0#it`rn*itjG*W-R)p` zCsTTpJl6eU0J8Xo47V9NBn}}JS9~uyB{;<@fr{rMhOUHBG{B)AR8t;kc!)j%ImhdE znu@bSv-=~O@*UYlpX{oxh=ydaPMbYK`JQm)ifA)a-b*Q&`g?d!js_CC3K31uun z18(p*LawUs#kJSEOfL|5&~$dJnVI#A1;Joev90)&@}$c}CxW@)_J_vF@OyAWDL(7i zgQ+P_B0 zhikt1UwBrEEYLK1TnHO@8zdpeYH*siw~mAiOx*hA*au4XHurMtI{f)pu} zBu0+4?IuK7Qlvo1JjOq$lLM5@DKVv9)C}@L%0?PV%QQ^;W5y54!j@Fd=Qng-T(#3ymaZj(D85@fDfK5Y1{s#}kmM4ibf zpfGXs(AG%Ju=YW+{)!$Sq&kj|FHo@O@NRP~@dC>-r0QhupN;ayyI=GMe3!ocnTXKB z>pW@(u9!Ww;b-CG9LfyZX1}MBjb#o^zb5namL&VQQ1b>v^!l|#M*T;5ffwvc(Q+wnc*p*NZyBoTOW|I`>i}W5OmRQBKXapC4cPHxcB8maYe~2HDqbd zrh~MI*-1#f1gjEIJ#E8`2#Kc#nTqf~E1eUYKlO08tQff<*+y9s6O zTW}>!6|pvdF22?k4t;tf0*dFvPBia0inK>Di+5NH3hlyrdX{V~q!{s37ZbmEnNrOE zrv)Gy8e$U`=6&%3+W6B-93}@>_$LQXjJU1j!jlv-B;m7u^~?f#kxS1`Wi#KGcF2sC zykr%)zan`esg<|GjHj`W^enh-#~5U$NsGu`g9mNO!tXT|+TaUtvOM(B7BL(3aA&7o zX{~fA|6}!91vw0QnX6{r>|rNs{gRA5J9fH7;}NAl=Zc|&<0lfhz{Ie}DBs3G z>~&Hq{h-IsN(l}_x#0W3MZ+R6HbE74(J}CAdwLb>OCRRtZo9iS`Aa@8tHHi^6kQ!+^<8bFh<|-y!hk4ls;$GcpgP$d(H9=n|J^qKy0oR~(T^U%o6ur3Cad+M~nP+W#DZ~{-f*b=1k?Fm3*t|Ey2m*qzU z6u-9rrzhg8Ib$tlGc691KqpJ?{F#F6(#**aYW4^dqc=x~|7j_Vt>2@F+;#;Lgu4L} zV2#6GENzY*m&JrGFKRAiIF}sl9?GRO+^Fs}2)cqqyFo6^H^&iX%pR;Hm!M@thyiYt zOyA2V-LOf*24OpJjbx>{M z*1>%6E$O)T6SnBdr~`tsh_+WoT=6I^LGX-k1)@U`8~fP<2BUiJTGyRwjYJDmf#`V@ zC9g^uF=enogFlp9i$^;I)Eut|q*sZ-)jjWvX)NpdJ#}!K=2xOQw@%7$mQrWHcbGr2 zH88)mm;CK;d)e)K>4M+m&Lv@v;>5a?+aTVB6^n4E9tpJI-kJk^`0rAfBB5ujjTsCF z@~CZTECOh5AMKFGlpQ)Pg3oH5fsBzxilg@VH9NDOA)P=E96a30pobEltzGmE^F(Y1 zOe+Ddw1P^J3r@F7w=$xcdsB}Fs1$CZZytCSKb_W}4ZIF31hU^&kmwNFCQ@~4G37Zd zDv!!v-SztL=&!hf>*vB1Bp)IP^wfrd!5?(X)53{cKMwQb?7K4>Pb6D_<;~oe?4N|D zNJmfrZ^Ca&a)DFGUW9(e{CT`b9vCaS^AZ#k@b?BwtH>%Re~~k($?e_HdJYR>UUH_6 zlA%IMzA5q*1r}ZR&7#TPos8djDqE+(frSO#Q#2vXKdOPEQnq*Z2R$a>luzq-ZoKW* zzgkG$6~15>AZ_h~i#{mFKb!FZ zDJ?^a%$&_ft?G6C{InMWZk$PR8owk}<#I=lswE9IKdFY4VN>?R;S+uML;Js;eG)mW^=y-G?C&t0cGIBcabDz&NTL=sU~tgz0->X5Zuxh>N3a3BBED zD}6H=)xd|_A+bGV4Up6s+`HVnI*}TamK2ThWJXq`KGJnrdRRrE zMDQ;|)2ZZvO5+Q6CK_{348%|ne+5O7GjR6kAJc9oyg{U`)_TiB9YrTUqQb15YzIEJv59}mm$!66(rxv+l zp!)yHdke29*Y|svMjAmu+5nMmB_u@Yl15sPR&wYT5v4&o58WV2*U(5vhteU^-7&*^ zKcnY-Kfk}>WwF+%XP!H+*w?=H%mEVEXS~lxFJ(4;ig?W@Jbw#_*wPMs@`#m>_QRHW zXk7im2ew$oW8e1%?PnWS@=*J&sp~!e^kDn;!@IS3vs!)@ zaM_5{4WBP#p;ldvH(rE6?SF=;VvuccuHJokl`C`st1*P#BW>BP7ZniRWXHQ5ua2X! zRtTifk}9MTrON_cdRE8}oAb+NxGSRx5^w9er&4r88wuV&m-B*dQm9YurUEzVD*04vkey^8T92a#QSj-eYe1WxMqWN~q31x2gnb)U@zdoa$3=sl;y#2VLzpnr4ip^D-#Om1F z>QhCIk`(&Q7IdmdEK|BO6hd|2%4Wgshn6;Oa4r?N{d(xv zuR|`bZJNlpWkMdFLyzCJd~Nb}FFU4i;<(1mbkSfUI#w^~&3Ag+%~8!Gn?)%d!I*xR zi&5LhQok&HnX;NDL7ecmUl;aWqcJ4zMlPamioS2;(cG*MiPSD{SCrU=zhPy$CoXNQ z!w7ZB94`W7HH}X>D!%8tk8iYWAh&XfMPC3Z>_H$p)^3e#KX#!zYhgL^`a~I?z*#IA zy((+Od!5KqAqz#!4xjHMPCw8#PSrnESS*X&v=(VQvN@N@4!$n4mRE4U#NG2!dHvB!6IxRb_#zRe$Llmd@ht zzTJb0g1wll@89w(yf^N88=pN3Eu1$KudCBj>hQwHQ0#83P$a32v;4)cO*yBXT;O}D zZ}d8I-f9A|{JAQQ$tKR#vD4v}1X>7Iop{-CUb6D})!dO~X_JSR3}MK;nOOSaLI{rY z1G8fi6U@cHtBdr(H&gg3=U3u0F&VvL!#CURy3Ne_G8bDMd{MG!zllTId^bxfp6&2? z`rRx$U)TCldsXs-_gK&3&W#pwfM2HJOIgs&qM@J-iB2mep$u zfvt6T1&3ZaA6pk}VSF5D|4oc}%{cM-q;Jt$RnH@D#CFh^BfFKOTMyn&AXYSk#uAdv zgfVwRTX(#kZMZa?RW-O`I~~Px?XmFAZr0E34BzYBSF~s+0*iWB5QyKXk-boLH52ml z3!Bo8{3`hb&C;`egS#AtQU9op-0_nU49{wehimIuBTw!vA-u(oa+LBTeN7j!qCe$C z3$$79T`1+XV!U|u|L^CQq%g*yn%@!z{5og9C7^t(UA5H2aANFSn^mRz{ z(N!;AjVcP+Def76)YP8$O|X^=G2>^*{yV9zwiylM$2SKJ_jzh(ZH94gc;Db07eO-T z+b*Vy9H;(8KGJy|awE7j$#&mp)o;1RB@;2J&NTz%i&Csa0=p&*0`sFvc{)2WID??! z6_uU#)VA{2uQ03A#|8WUtbr@(=nbm$sb32|n;01{P;R<2KOC3#`ix|AB2PQ4;L9wG zsDYCsm1e&m8;3MP&ibN6nsU#&MVOHNqd6 z%tjqTCu>H`vv2CKC|1K@^5?N@gc}@@ZBbHnIKS8)tB_muD#bTru;3T)?fA{QD%U#J zAUKsxPYTjasUG#;it{R9S?8*ohT*>+q#8Cht^A^J5bN&azeeq*?{?xdg6H7>l}^+= zyGZs$%TX?$anz=rK}n^af}#alTGX#zZMAuH7G7In?6_Nc`;>*XHtF}7-A#x|2?%ee zE#+5dYJ(4FBoq5HdC7@sHZFN>&DQ^b;m=bo7{@uT@9?IghhTL!Wnz*{B=)0GVBwIG zP}At=W;dI=?95L_`?{6c&NXVho<&#Zy@|IS$p`xeyT;BFbz!S1PBnCj<{Ek4UZC|We%J#w$ke~Iaui3Ppg!i<%AIu{Gf zpmrSCd*s%|OSJ!3a{ihO=1ts~>Am1J(jRwO3^IbN3*eyBjYSls&uQMK064NGVdo>x`vGOG~K{FyX zTBl*X708?%u#ue)zkBh-n8S{fIQ^NVgT;ym0~&)vl@gTE7s)U`U=zn*#8kR|T_eET?{yP=5B+IIQ6JEmU59w!M;rR=)S-l=tMSq8KadysgO|KeKc&DzDA~V_bSW6 z#!0=rv*r_@{X3(3EyAFEZYGRXC2Np57=leLJZM*k^+AO2cHC;QUa7vz4mZ)qxh5@F zTQ2TYbT{d%4Bi}ETXK>>k%r6>6d8b?~SrrA}>YnjNJMB%-SKhDy3W( zxBl!QZZ0f7g3a`bOUa^{B0OuoDx%P-%Li;;f5GTJ#hUmbg&CHe*$Hv!vhNjZ$&BG^ zD2#j@%F(^yC7CquFJzzRx@K|X+@U`6x-AZ79|&u`U_h3o<`H0*cwH;%ZJu1?3P&ut z>frYCIn`{x-yfm+EZclWQaL+7b*)(+EUmA7RgI(2Ee1N{!$jAO?H&`UpADGdvg2;c z8~a2R3B>*!UuJU$?fM5TCnDF#ZgX<`>EvhCNz_(WC-(bENy8m0w|$u=AOmQ;&}L(+ z=?8W+9_v0CB%xAnhhUJKA+D7;EF$j%Gu*BJ0yBWq@(J<^1+Z4ELg z1~pSOF=|d2=FbMVO>-e~ z6_$q=Cru>_bbmMYdjYl*m(>(Zob$yKH~zBQ2fJTbrDdFPgvHO|9oum1hn5#zz`CsE@I-jJ=sS`@z_u8KDV-4X zb`K%7U6Nt@pfysRyC>cj>*dF0)bs)d7;b?o0sa&m+mn!S>7XsRhdEO>01ZxgG=woS3Z+*%UAbd@t1<_vs+jmNJYJN^Az4&CXq zI%pCWW~s7YO-i0^A&PluX+x^p>f=p8V6niwj8DsMBDcgwnEae?Ni4P-ugK?M|7;BK z#J+OR8Q+?(YG{t>mTgLD9vRkwuielwvFsKooSiQC=GG3wH@=AzDM&WE^uTGZ4P{#n zqb^4mhZpNG=zwA4v8<0OTEM-l#lixPXF5P`Su;lac<)mb1`|$tT<#z;w6Kfy<1x zQ8C`b9lv|g{M5y9@al2cwbxOGh3h3hsm0pMDeXhh8T(=5aSzJg19N{{*fuJLeZ%v$|>$hGR^G6It^qdq^VZ(tA1)b32=>cldyP}qUT&RH*Gjj-L{ z?S%}ka8C?%&C`_hYt@tT@Vv>R$0?+OaR`|J_uqoyWMpJ9k&)a>n5&~3eGFdSU?SFn z`c`|~*HJ0yxpZrGnl^a@Fno3jqmBI07kA969-9keR@u{HllZ7DQ0gkiqouv{VLJI- z5MaParV4%!zun8U@IX_Pl}+evprX1K&%)ux3~r@lSA=1RV=4qJP;IX!T)Hdd7Xea@ zngLve0wE{DX>6K73-&g-1&s{zo0XEHV#Auvh!C1^xYMEE#!Z9ePd%@_r-3Uj2!`vH z);!a*9#+gl4dgN!^Pt*13krj)SEa`@#=Qj9yg z>#f7Ob6nRVWQ(ZX>7?br=ZvJ&Ry1A`bJw0`rs)2(-jq-4qR(?L=kL=sxxG>J5&gk+ zk{e;O6@R>et6iO>++yXm?(KW&P&^Yhe0KFZ*P_n+Yq+_YLH_Zv>vxBtk6|RStoL^R ziMe{hGQ{x7h}>m^6Ok$DiiqVDhBuQx(roUI^|Va5lGVj~yGQ0 z?$;P~-)blTUtM`WBZ0@g5yqsijvOCK^Dc^2uSF&ONY@bRM;ahoK|_U^4m?Q{j->aT zKiKBDn|DurXr7pfuoA+)j+_t1xP;?v{A~8-TU&Kx=!kG8W66AeLfIgubiG-KI)97T z0HZx+iw)TzeEhLdo#8Cqa-tuJnK#;4rdYcPtZ~@x{N1>nfyv)hWTf%M($;7v9gaUG zUoZ%ghi44tdI0p*_Y=N2@O4QAT@Yz{1#Em>QjRN)cUL+bCjd8Q7y`FCt?6mm6AJyB z-XgBZmI96xXAS%vIW?`30Vv0}qzx1y)_~PYDDwEt=R<&$7?}WprQJ&Lk@xZONgy{f zs^G=KW2HTz$aXJK`vIz~beTRPN&u+eEnt@({w3*Aa=#xFZP!qX_*G;Y(JNGnD)On_ zFLYN%ni~)sD!gswf6g38qxp8f`xEfUjY@X)w z`6U>mwcwo!kQI+n0pyc2%0xB!<&;Bsa4RRM4c**1R^>s~5hbuQf-cpumWTqU3xG(Q z8%)7NM+~g$9+6=4+PjTKu-+;YXpU!{ah9sPl*57m_KJ8bh?NXROx+B#=eyPZ2!}L9 z!}Y9&_xNfU3P_Ci3(o>5ZDb6B*KRcP2}>%(=+$?F|3D^t8K>*pQ=s#~j_|f%!5@J8 z7CPh8H3FEO^T)@?e4N|wqXi6WWtxzUAO(dKf7L+fM@x$Yfv|e;9vv%hRMjARx^4=( zGE<{k-4l3<4Fr~F5oSI3rBHI_=W2Z6yio|MG}QZ}iudOK!doWZIjwvP8LdK35Xt6m zhI_Di#7rVRq0Gr8mr)lorswkwhR4lyOTu0kSYF*1-&2Q@nO0Cf#FV!z>(c&UmvWyJ zm|lC(XqYi|VjZ2_a+{dPuNhm$`=)`sjc*Gm(H0c;i}q7o3o^~hp{=+26E2U=0SBVM z3-x+|OJ4vM*e8TTTEi>+SzoRt9S}zo!KJ=%+o{SJ6d;8Pw08?_5c>FddGg?}*CC7~ zJV_b-_YKTz`UKjq9^@?;LYZ@CPQRebXaI#sPi8fHO7tzjBn7>-FT!YQZ`17owrM0X zr+Z$Di7*HrfO_YG$In>0by>`8%X{!oz9aU!M4Z1dt3#RB zMjTspk_CH9W8tsliW5#w*&xI%32p#My@X;1K7$j+7jr4~8P~~lfB@+wby0B?yt)(G zyjJnxu|5&quO9^UV2Vy*8--Y!Nw8oFxzlm#naX=}P_5&=W!7`;^ZW#o3n~5hh$}!925#Q`9hhodU99-< zA&3*dPye`9A%2WruQ~BFTZE5#$%zw!bh91p?F$+PmN@a#Ybc1}M7h3g zT>hg0GdJ71VPD`3M-SKog^&f?p-sB9=X<4iw2@AdZ|pzW_3agLRgQ5?`doX@9K!ZC_`F9Ix8n<8f5Uo8MxmivzO>fTEw z!iZ#LbWkX_q!7gCJ*Zz}hB9#YfPOCX$t$QX%c{4E-7f^rwLSIlogi8nE{r@kE~9YWdPs+%$GE~;;Z%!ra-6`4t{j4nb&y$P z1%P=%TsDK3WVJ0DNCFUy(J{C=)GLe*>qEHmwtpZ2wu8U%KAOdM#E0$ihOM-NP%2h6~oZ?Ih6szn5pem2-wM=wjf%YQ(3 zI26FsO{MQxQn*9HCfxGfc-{aUxOOUpE8YA4;>t3wG9;-yA5{KWyeZh1 zq=DjYtc916=MMNrm|adB(!Qcqw5u_VwevdEoTzLXASTeWY?fd7% zF)VDKp`;V-xg=0$#zvWqsop6g|BK`?yObN)`5NchTkCDxF~&y${$1b+Y1$(V!Uu?X zJ1CNg!Bw0oFF(2nFaw)-oR!6^E#&N)07wvws4}Z7%*QlXv%sJesAyQD#CJ(ienvpK z5x#G-{fm$`wp4c4Oeg>s8Yn8omF1Als@NBl*7hKVn-tzl$Vxe{hmJAeYA4IX{@=1s zi>=xbAU&PzjCtT_OK)LrxZv&V217jn!#SwZPIrsJbyQq9)UNJxnxyQ{M9gtfCrLw7 zbDJ&=u)dhIL|9;?%P;=|r1(aIN?ZhFTi15vv|L8KAwMwQnOh$mQ3589Lz=)d`c<;~ z35Z69Lla0v8p8#^C|vc#V!%I1dqA58ggeXOuHW4(@?7=L%^*W2?AiigwxuQENXa^C*Gpl$hhE0yEV7ss7mE=vX+*EE)UN5LwgEJ1`u;!9-2>2#PI6 zZ7n!V&d|A16a*If)apDfY0Opl><4DZFFjxGAt-_J|0&$F#CA%{5<&(3K-!4CLkjV9 zZ*s(+Z=F+*Q0X*-GfDtsd87`tb+y-%2Ep~4Zpq+Iw7?{fWgQj)fReyS>tt&y zlOe+*H@ZmhId@D$@d+fr4{9LBX1L+de5|C17o0J`QS{Npdp)B2M>{C0E=BVnqlglX ziN91`+zD$5!u79T5yj`bp4=H>(vi3&G0)O?(HmpXE!1bvwbE%*;X;6NtM_qhq0N|T z?{I%Nrk0$(X$tKCYPH`bi`v4KDn z(Tj(|M=cn@l2!0=hkrJIRL{<8yjm-bB~2$-6&1z zSZ9e8l)G=O8y1WY~t5+j23!6ptNQGIH=dSTLIM`1k-G#obUAl=W2k1EdmEq9r6-t znUl@(&Q&n}xR4nEYLAG!rqhHt2LWJVl$=J{#f>B&M4?I#8}a-VRupM7^a8H$o`Gs# ztp7?L^}?mhHud55Yd*Mt&)xCufV?U2bmNbgMg8Lg)C&BaPCp=oL_GR!PW=tAGFiRC z!DBBXy7?a=wOwc!Y_M?-ZBCH3-nZM84W&*IK&=oSd$&qnjA}=DHhmk8M%BuVTe>_a zz{T+3oo@y9PsRbS%%m2=cZ7RoO}A;Dh?xu14rR&OVgZRea7o>HLuRzr6uw5*P8Htw zS=z{x3d)La8T4~1r$DYv;N{URmh$h)!J|*WboB@kFG@9X1u`!sUkms=q z%vJL*Ho9A*(Bw}6Y5}S7sT=2EMp>eOo+f1mlca|Cc!9BO!B|vh@kP#8Y_-s}ul_X3 z-ITZ8L_bLiw$(yR0>dOsG zi(R*PJ&9n9M({N-EkATDt#vDdl9byZws0Nff_#N?ENR?0HkMsJmY$K)1!bAFcugnI zulH-I2+cpDW5qd+Qm$&OXOsXp#q<4Qe@T{z{ss0xbb-O1Yzo$$@CF{qki5K*sY|#@8XB9!p z2c^$hfCixn+7ta-oBBDU%?40rd244-;4Bgc74@dPYX7v)^9}#-gUImDmSK|O8yc@t zl3R>DZb^_n5@sWdsoi-A%=O)ppmqH@;@sOg2~~L5D8x{r%7p^?x+fRgrC`opZois& z!EjoObGW8@S#q}xk2eZ#0cza+|ETdyK#l(fR1ZfqKUr}!ysRH8MhpuF$JvP(7C-UT zbOrlRhc7+2bLR;j9$qQQTlK4%(T&^#-M)SX*PVw+{eDVKXAU!sqH{1QeN(zh1>Xy6 zGpt8Yljiv5mF&?*Aq3-#f8}vIe-3$eHyHd%XUV{QSixw}pNuF!J`4AuJK&JZ^7p&+ zJ^~i>vEruCd82x6Tcek6Kkm4y$k8U1+PS|4xL%5Il~^U;+)`~4s10{ZLfO>BWKqdT zWCq=SUBbQClE1LKTh3+20a$g?@2-}PwiD744+-~uzF|6;AY2k_fL%Ctnz4p z#%?kZS0(~`%>fSWUzVI|@rs_U}4V#AUz1JcZ}=l`a~i%X^DfZl&K_BZUChDMsBR zNO*)mh;Yd=8K^l*~zb^iS(Zol^CQK^J&mo3gH z*s&Kg2Pwqw$ElyoNvX#rg!^NE8DJY%KVhE`c$zBz_40MGO5;w1cz9*Ks_<3%_rtz% z*!WO!F~Qg@vh_5#AIF;$gzqa&=m^VzhArY!FiOe)iXMF z29^$uJ9ygxjX(M3D*C=dO~YjYN(5X&J+Cr*^#K zlXLd+@Xk-PET;|p!=Q5(cZ;n?BSQvPfCp;0)3>8JQg_X6JFH81Y_{w^Q~7Py)$jSE zu?-e@bPXM7Q@Ho%Ij}Z_$rEfudi_Ofd#b~q(++eVqMfJUyB^h0SA~3@Jny zh$JC>n)ssWnM2{A6x#*W0=q0-22)Q-;~2OF-aWgC)h@1OR5^Vjk;sb)Bta*~oPe;i zDFQJI6Kq6+$>wnlVE@cPnt0Z^?j`!DNj??vH+>G39R>^lPv(Hw{w5XC`bn^TZZL^X z;~TS{(rJjh={{TNa_)^ILvag4u{{iK&x3cHX=_F__fPO=#vBhbvUL)`M1Df+96Rc| z7Y9%RO`ppfbf>gDne9Lo)z{2f@{r09wP3u-CcJA80OT!DQDeV>eb$ik{|+UPOgQ|R z>n6)@<^E>X#9$nw7`}EZ0ej}?6ClyJId)FgklqN z*fjPY5{)`1a{8kKbz1gzqghXh$qDgx&dg_Nnksf46lph*D33SGrX;PD*G#t6+XQGk z2nV8JUc0>(QSbUje%lR&QDPE{Qxyg@z3b;t`ji>D9_#Z&l-DAJ=sa>k4Q&#NjwNW4 z@0p_(ApVE5Lkv_bEJGR%l5Ta$T_LNA34nHZ)L=Q1Bu6Z~4_^vn^R%O3&@Mq7;D3yG z#{V+nF9Y`rg>r6gYv#>n=T6n!_P+BH4L$tk_jvNlF#bu9vE#m7?CMq4);=?x?xqrK zEn6^7?O$DBh_PpJ{%CE;I%-eTH5>RAEKJz~;kX<)4%jv+uQ|gkkt)grD67wd+V4M& z#-jrBH{ZZU0GZ}S4wr_2>1Wc`)X_!7H*&fqmJ@gMbGV%UP+r>YqK1OkX&1Z4CJ4=M`+yJ~zX>YeIr@&5+ zybra}SsJ!6X4GF4KLB*fbx`>=an3c1q44Poe8fY!ECbN~<&L-|;itZu-=l52^#(Gr z@-iRAlg5}olz7!x55A)*NzH@??Cbi3R$_niV-qxVWfo2H7K1;6kN+5Pi$9F`Icr_4 z%PKaQ1u)`cN0bHCi=WrX`pCg<_&tu}S?V2u&PRvwpc6F9;!qJLl$ad|p)Ay5@(kKi z!=ruGR*%g=?Uzsku0I9RX>jJyor5kSXufP}FAJ@(4MwBNAA70yj?~-06+*DyU#a5K zgVNpK9Tagj+{17bj956@87Zj`t_AuWjkx;(Q!(6qz`rc+Ua4pv{Ho~;>Qu}#4(IVh z;|ydQj+r?nhn)3)S#gw3qm&O!F#3DCI5#Xdmyf#(2n#2^KAg>rWP-qF{<@{2Dry zZrkY;IzVMWRCc+sEOM3_vNDeX$tg$v>HhKw7sA`kgw80j26MJ4HPR_;dos$d4t$Yi z)A3l(wP|Y*bgfvB8SCSk$^Fgj;7<7BfLJ5;|HK*uAI*eEKN&-H+4lZ*vkItStFreh zoc64(GqmM1c>BT_4c$DW%o{iviorO0j0jnB(A(NRjPo+g@FcP1 zr4~qiO9hPCyuf1M^DxO{(?1p9n2}eM;Ty&O3t9s#1xfkS1??>e2oGBxPu=vmubS1^maEQ<2~L1^HNQ_)d4>-1 zvKHUV{D<%)FzIe++W1%xG0M*PDP}X@J5R?=NQ1Yh$Z9j529pKVJRshF1vf458G}oD z{}pU7fVyqr4VZ<%_e)_>zqXOt4;Wr9sOb{!iE^0r5brFG76Cx_q=;6 z1?|&sEL%<3GdFCq;m?d`1I#_bl7It@reBcy+Phe?*_RN(l6SwrYYZhFM#b{|8)lD? zK(fb9Mthk#nf@A(KUUzVe-GO4I0DqwvrVV3w;!ue>0p7Xf`7@z{-@hGW6)SFe}ZDg z{S~176Z{_=7{0+dqQ0Dns)DWca~iBc&&5+9@hU4<56WXq(5jYYTUK(SpknXYY>t^n z_M1d$l-5q=slPdpL!sD(e$AtzUjCZ0E*KtAkD>p5qP--)tO>r^8-OLdFx#0wBwkBD z@Bh-`TjxL>WA6`6i&88MD>-J=0NS~1zsg8>Xmw#un+0TM{rD_jm#>4E5V-W<2U5=w#y(~XL%=WgeGN|{TOJ3OgdXw??hv-^ z%`*U9zxP&A?Dbc4fu5f6NLlA<&~|T@1FG!g7F~7WM46eWd<4b{s)%u{={<1V$CHSPT3PO9Maplyf;gx?^t{YSp@%!AnY8E zFE)WVP_xN!!Sc5KbC!j82&W@8G;#ZfB;Mq$k$acTpKz7qH-O;oEI0y&+!x}Qgbw2whWY&es-jAt8wyZnw>3VWBpHM0<*bEb16rAz z3DOOu@K4%6FbTfMF8aCpS=PTWDImHI69VF+l7WV-!-Gg59U!0v!u96>CxONQN7GL6 z(AE?_in}A_RM*`l-UINs5`HK>R!WfAuQLd;WY#5h0Z>JYdeIWPs>Q#u)a!X+y`cz% zNk9PU{*0Hbp|8TUx1;Qg(;*bTRE&Y}c%4&+gX-!1pRk+5OAdbw zQQ+aq0A~3Inq|1&H}*>a4P*^Mk9_oPs_h{m>udYOXpH2XYfxvGE@y)64>_KY0O0Q9 z4nU5_4^J8aMo{52`m#{?1Vgie9hJTWBMUaqJ)yDuqkM<`W!9A}*l&Ro>p~%}-4!)h zD}V#4hdC$fRR#(un3Q{;t(xWKhY{=f{%1(f8|TY4owzbedFj)JA2KXe7+>0baTlH4^9}tP@w1+Qx-7xnK z)IO&L3Z9t%v;&1Rc0&?RtJk7y0DN`R0NMe_z*rs`77^(MqYP}cQH|xMtHP(pTh!aM ztY^8_4@VRGKX`%_S)B3Tg2?eQh?xOW@yf5ev;y>h$Z`9#yJlN6Km`q;IJSs*RvX;* zp#j+hFiaAfbz$`af6w-@4*R0{Ij)KG_!F%>6Tkptyr(#?wUOVI85iCuP%xEk`UZt^0GleBnTcLpW3NP8>Wb$lEI;caXLX_csB0BxxLcy-Nz(h6JEz`6pXwqVMPG_(RvH$R#!o87x6_3y z`Z1kPYP0dV6+sC63Rl}^>mlS`z#qmk=a+`tKLGYJv-bUe-0g?lulbng|Cv z!<0KNbcNwNWhnhO&LbyDlBA1DQ>Ok|(~e({#yot(){s{zj+#<0g3PfMI?;TZozCLAW!l6q;skhf8zGACx3j{Rd@E zWCD9f5eMYK)h7u~RfWEdvM45g5r^%JMUigvZqx_xn<*1MKO*GTe^}Yv4b%9|mbdK! za{ag6__E;v!)}3no3G)mAs&!-e@5xmG~7S|)OoSXAX2=T$HTMt`$FeFBV)?GfVxNp z4=x898jg|NvnLuZeC{0f9tFV~+Zv1WKG4;S*D4$yHscfBnrtwo3p^2ACxNjZ{ZX+a zUug!-miV9Bjxag+qyJ*eCHCnGkU)dKhT}mfv_AN3d^0f*&H=*xbq+cUdSw% z-9xZd2-?GMKqMrSa2z7!SgePx{P)`d7#h;@)vNVz+L>tLB*jFTd%<%j51Cwc$}I-a zQ_HO-Q~lLaqhe`4897y0=q$|aU34onz~R3;I-*;t>B9#O67t4}_V(yIPISq4Y^*kC zjcQDESU%d^?Do#9cp&{Ko&|OiO@JNFIU7T^28Bq?pMw_GU)9^Iwe_q!C=!S-t(KQ ztAkDhqIt``@iu#l9bZFm{m5@oQK>pPeJ!n7#9#j1eQ$;rv>&XcC> zCKH<;YMGzYt5kgU*qh${iKL?EN}EmR$ZPLA6iwSixbI!;{^%$7PO=v^G_qOr<}jm6 zr7vp~XF*P=ff)|Yg_oH0G08BykY*{4bsbLYG%okc1YX`xW!ANf5Z{?%Grw4wKf<f&XTeH|Af$V*qQ#P1gei<}!D`zGdw+*Wet(%p;{UdYTKXbs)PnaNON z_U&FcIi|eDRuLZJd|RSi#YRS=T-CdNWFTK1-gwPpT_QRm;WRhmCpuSf9z1KWAzXg1 zG44zF;xnkt{BRRXDTpYKuy1^C<+yW7sEoOeoE%rljcOx5ba?K%*JrR4*kn|@~!EP3-Z*Z1wVIT^*r+SuWtG_;WzDe zBAoe=?U0Goedh7&%lhQ))G=c8?Prrr+0KvezY(dcreJ{IHzwseH^GRG*()$Wut@|%cU$!?GhUFxQx%Rh57cu=BbFd zEVJ0k-mB_45oGCg!^@Dz$tP}K$~@N^`;QUsGx|unRF4vE;JzVKD$ECjnWA9+F%=j P&O%N~`B|x?@!S6o#9NUN literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_triangulation/tripcolor1.svg b/lib/matplotlib/tests/baseline_images/test_triangulation/tripcolor1.svg new file mode 100644 index 000000000000..f9196f76c987 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_triangulation/tripcolor1.svg @@ -0,0 +1,1229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_triangulation.py b/lib/matplotlib/tests/test_triangulation.py index 52279758e074..81f922a0b225 100644 --- a/lib/matplotlib/tests/test_triangulation.py +++ b/lib/matplotlib/tests/test_triangulation.py @@ -1,8 +1,10 @@ import numpy as np +import matplotlib.pyplot as plt import matplotlib.tri as mtri import matplotlib.delaunay as mdel from nose.tools import assert_equal from numpy.testing import assert_array_equal, assert_array_almost_equal +from matplotlib.testing.decorators import image_comparison def test_delaunay(): # No duplicate points. @@ -94,3 +96,29 @@ def test_delaunay_duplicate_points(): mpl_triang.edges) assert_array_equal(del_triang.edge_db, converted_indices) +@image_comparison(baseline_images=['tripcolor1']) +def test_tripcolor(): + x = np.asarray([0, 0.5, 1, 0, 0.5, 1, 0, 0.5, 1, 0.75]) + y = np.asarray([0, 0, 0, 0.5, 0.5, 0.5, 1, 1, 1, 0.75]) + triangles = np.asarray([ + [0, 1, 3], [1, 4, 3], + [1, 2, 4], [2, 5, 4], + [3, 4, 6], [4, 7, 6], + [4, 5, 9], [7, 4, 9], [8, 7, 9], [5, 8, 9] ]) + + # Triangulation with same number of points and triangles. + triang = mtri.Triangulation(x, y, triangles) + + Cpoints = x + 0.5*y + + xmid = x[triang.triangles].mean(axis=1) + ymid = y[triang.triangles].mean(axis=1) + Cfaces = 0.5*xmid + ymid + + plt.subplot(121) + plt.tripcolor(triang, Cpoints, edgecolors='k') + plt.title('point colors') + + plt.subplot(122) + plt.tripcolor(triang, facecolors=Cfaces, edgecolors='k') + plt.title('facecolors') From cd9212d1e107973961d8d4f9ca21d49d4458eb3e Mon Sep 17 00:00:00 2001 From: Ian Thomas Date: Thu, 16 Aug 2012 19:44:17 +0100 Subject: [PATCH 6/7] Corrected tripcolor documentation. --- lib/matplotlib/tri/tripcolor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/tri/tripcolor.py b/lib/matplotlib/tri/tripcolor.py index e9925cdfea92..15d2181ba0c8 100644 --- a/lib/matplotlib/tri/tripcolor.py +++ b/lib/matplotlib/tri/tripcolor.py @@ -40,7 +40,7 @@ def tripcolor(ax, *args, **kwargs): is 'flat' and C values are defined at points, the color values used for each triangle are from the mean C of the triangle's three points. If *shading* is 'gouraud' then color values must be - defined at triangles. *shading* of 'faceted' is deprecated; + defined at points. *shading* of 'faceted' is deprecated; please use *edgecolors* instead. The remaining kwargs are the same as for From 4f5d3ced377136e5d6a677c887a947f2b0248268 Mon Sep 17 00:00:00 2001 From: Ian Thomas Date: Thu, 16 Aug 2012 19:48:34 +0100 Subject: [PATCH 7/7] Replaced backslash line continuators with parentheses. --- lib/matplotlib/tri/tripcolor.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/tri/tripcolor.py b/lib/matplotlib/tri/tripcolor.py index 15d2181ba0c8..b65290bcaa6a 100644 --- a/lib/matplotlib/tri/tripcolor.py +++ b/lib/matplotlib/tri/tripcolor.py @@ -74,13 +74,13 @@ def tripcolor(ax, *args, **kwargs): # triangulation, can omit facecolors kwarg as it is obvious from # length of C whether it refers to points or faces. # Do not do this for gouraud shading. - if facecolors is None and len(C) == len(tri.triangles) and \ - len(C) != len(tri.x) and shading != 'gouraud': + if (facecolors is None and len(C) == len(tri.triangles) and + len(C) != len(tri.x) and shading != 'gouraud'): facecolors = C # Check length of C is OK. - if (facecolors is None and len(C) != len(tri.x)) or \ - (facecolors is not None and len(C) != len(tri.triangles)): + if ( (facecolors is None and len(C) != len(tri.x)) or + (facecolors is not None and len(C) != len(tri.triangles)) ): raise ValueError('Length of color values array must be the same ' 'as either the number of triangulation points ' 'or triangles')