From 072f70272fa2c65d4ac96ff396c7fc545e42db62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20W=C3=BCrtz?= Date: Thu, 24 Oct 2013 15:55:11 +0200 Subject: [PATCH 1/3] Add capstyle and joinstyle properties to Patch. --- lib/matplotlib/patches.py | 46 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index ea0d3ef5b904..9d2cca4e7782 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -30,6 +30,7 @@ alpha float animated [True | False] antialiased or aa [True | False] + capstyle ['butt' | 'round' | 'projecting'] clip_box a matplotlib.transform.Bbox instance clip_on [True | False] edgecolor or ec any matplotlib color @@ -37,6 +38,7 @@ figure a matplotlib.figure.Figure instance fill [True | False] hatch unknown + joinstyle ['miter' | 'round' | 'bevel'] label any string linewidth or lw float lod [True | False] @@ -56,6 +58,8 @@ class Patch(artist.Artist): are *None*, they default to their rc params setting. """ zorder = 1 + validCap = ('butt', 'round', 'projecting') + validJoin = ('miter', 'round', 'bevel') def __str__(self): return str(self.__class__).split('.')[-1] @@ -69,6 +73,8 @@ def __init__(self, antialiased=None, hatch=None, fill=True, + capstyle=None, + joinstyle=None, **kwargs): """ The following kwarg properties are supported @@ -81,6 +87,10 @@ def __init__(self, linewidth = mpl.rcParams['patch.linewidth'] if linestyle is None: linestyle = "solid" + if capstyle is None: + capstyle = 'butt' + if joinstyle is None: + joinstyle = 'miter' if antialiased is None: antialiased = mpl.rcParams['patch.antialiased'] @@ -100,6 +110,8 @@ def __init__(self, self.set_antialiased(antialiased) self.set_hatch(hatch) self.set_fill(fill) + self.set_capstyle(capstyle) + self.set_joinstyle(joinstyle) self._combined_transform = transforms.IdentityTransform() if len(kwargs): @@ -355,6 +367,38 @@ def get_fill(self): # attribute. fill = property(get_fill, set_fill) + def set_capstyle(self, s): + """ + Set the patch capstyle + + ACCEPTS: ['butt' | 'round' | 'projecting'] + """ + s = s.lower() + if s not in self.validCap: + raise ValueError('set_capstyle passed "%s";\n' % (s,) + + 'valid capstyles are %s' % (self.validCap,)) + self._capstyle = s + + def get_capstyle(self): + "Return the current capstyle" + return self._capstyle + + def set_joinstyle(self, s): + """ + Set the patch joinstyle + + ACCEPTS: ['miter' | 'round' | 'bevel'] + """ + s = s.lower() + if s not in self.validJoin: + raise ValueError('set_joinstyle passed "%s";\n' % (s,) + + 'valid joinstyles are %s' % (self.validJoin,)) + self._joinstyle = s + + def get_joinstyle(self): + "Return the current joinstyle" + return self._joinstyle + def set_hatch(self, hatch): """ Set the hatching pattern @@ -403,6 +447,8 @@ def draw(self, renderer): lw = 0 gc.set_linewidth(lw) gc.set_linestyle(self._linestyle) + gc.set_capstyle(self._capstyle) + gc.set_joinstyle(self._joinstyle) gc.set_antialiased(self._antialiased) self._set_gc_clip(gc) From 3b9ef36294a13f04c1b10a78647d52b1b665b1b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20W=C3=BCrtz?= Date: Thu, 24 Oct 2013 15:58:47 +0200 Subject: [PATCH 2/3] Use projecting caps for axes spines (fixes #2542). --- lib/matplotlib/spines.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/spines.py b/lib/matplotlib/spines.py index e4f99f82654d..b71bdb244c97 100644 --- a/lib/matplotlib/spines.py +++ b/lib/matplotlib/spines.py @@ -57,6 +57,7 @@ def __init__(self, axes, spine_type, path, **kwargs): self.set_facecolor('none') self.set_edgecolor(rcParams['axes.edgecolor']) self.set_linewidth(rcParams['axes.linewidth']) + self.set_capstyle('projecting') self.axis = None self.set_zorder(2.5) From ed67aa3d97dfa4e7d5379577f4ef352b25258a6b Mon Sep 17 00:00:00 2001 From: pwuertz Date: Fri, 8 Nov 2013 19:23:13 +0100 Subject: [PATCH 3/3] Add test for new spine capstyle, workaround PDF rendering errors in low-dpi tests. --- .../test_axes/twin_spines_on_top.png | Bin 8211 -> 8044 bytes .../test_image/rasterize_10dpi.pdf | Bin 3182 -> 2616 bytes .../test_image/rasterize_10dpi.svg | 542 +----------------- .../test_spines/spines_capstyle.pdf | Bin 0 -> 1314 bytes .../test_spines/spines_capstyle.png | Bin 0 -> 3503 bytes .../test_spines/spines_capstyle.svg | 55 ++ lib/matplotlib/tests/test_image.py | 8 + lib/matplotlib/tests/test_spines.py | 9 + 8 files changed, 84 insertions(+), 530 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_spines/spines_capstyle.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_spines/spines_capstyle.png create mode 100644 lib/matplotlib/tests/baseline_images/test_spines/spines_capstyle.svg diff --git a/lib/matplotlib/tests/baseline_images/test_axes/twin_spines_on_top.png b/lib/matplotlib/tests/baseline_images/test_axes/twin_spines_on_top.png index f0185c4c401577b6a492992c5b502af8df2c047b..a9434cc36704c77160b1d1c6a4c59113037c2eb0 100644 GIT binary patch literal 8044 zcmeHMc|6o>+yALV$)ID6&?1FMk+DunIuWvrC0m(uNElwkzoTWjjIe6E65m4ETQ!?q{bU2okvg z|M3;0io7960dd*H*p84jH~eRy_}AViW2qV1#ddFAZ23%9Hau;3iOREDC+ZE1$X5%S z3Ti2KLi-gTcG|hG7@MgWT;FMGe!-B`eCUM34X^&<6b*L-da&9LSUOr<9wq=mk$)aK z2VS*y?1G@5kNjsp(n?3}%{(icxjDE(#LJ$;z3l0wMsl%PLLrWB-l#V27 z*iS^oa*VF7F7yH;RTdE)Kp=oQe9+M8f|S+eHJcwV)-cbr z)LR31YfRTIUgM^|n_46FH(H$&_M3vFkSGMHTbxkJ@ue{EvZ$7CUHM2~MD0BxKF>!G zAH*tkzRS^SaNRm2ub|E_=2j2(yUZB{7z%=E4RKy|vYfeYh4HSYW

6{Mk4J@lqrN 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 Kb;VKNxc>r*I7To4 diff --git a/lib/matplotlib/tests/baseline_images/test_image/rasterize_10dpi.pdf b/lib/matplotlib/tests/baseline_images/test_image/rasterize_10dpi.pdf index acb0572867021b3038c5efd9086403027c74caae..dcc3dc53d8cf7e156661e978120ae5c6c129f1c0 100644 GIT binary patch delta 776 zcmaDSu|s6TddB+PiQaxk40zhU+qL>XICgGzY+s8>Q*7cvMgjg_s|AOeUMDYKxy&~* zr0k8=zkl{U;t4hG?c#syCVu4c+pNu{-W%K*X;SF@qrv=zpVjBZQ;j{`(mw6|q2Zix z@#LHp^DLGxvwpjKf{bdf;_e&Yx9KKFZ)!D``__`UJGK5--O=Rw4Gel8#?>p zISJ#L2JIIEE#iI`9ep?N<2!D5iNZF!iMvaUXF7bF_=opmS8%jXqsTtV_^zvm{@>s^ zd86sN_2#Ug-=fB;*x47d->CP6>5)P5DeUrkQp1tRto|U)TZ2$M|6+6r$ zKP>E+$a+HY@Z(0WNlI%XZh5`pydd23fnAZUC1&zl7HMW9Gt1PC z^gRs~42>pVWL28{hdpSrE1T)$W)2fZ)5$wHR44Ccn}KWNg1Jj2OBh}4HR6Jn$d>$Gni6E> zxz|MU=hI0xQ*>S(yZ0w%&(FL$KePAjjF$ORWpXgRBJS2^mLCuMj`u&kT~y5dv)*B6 zw3Fez+ojyuT-9F~wY<0en64k`qHnV+CEeI2xiIr~*7l?&A<}lz^;gy3J=goQ{(k(~ z^v@}IdCsxR+H0>awVNH1b9ajI$(t)C#><^O%btJlztQ*8wxPR!rR6vsOW7UjmD7KE zx9i)*PnVwA##Z?{FMNCATBq(6uMR!lq}c!J-pTo*H=|ub^W~=Rtql2oZuMPeF2}E8 zfmdfAPtBLRx;K87zv;jGW^`csu#yl1I=LBlH5rseJE`B&K zeO6=dg&3KPb;40AWMwBEt;>$$JbSe9nbpG9TNkS)Tq)uGl5!xV%>BGta(Pg7qF`L_ zjzzy}=4=ao)Y5&D>CR?L%M@wRot?r)YTQNVpVdEkHfK)vIn5Qifd+DH8{^a=V!{I^c zW;Wle`O_bsj8`hXwYc}m=eOooJ5SjC{Jpv7YSzDrx9!q?PR}!t_qCYzC?RtGm8y(u zx0MQVX1GdP`@Ync%E$=Ch?v+*=p_{&Mjk{{;!RuHH>QU%n5zqC3ad^~jC|-Nk1<{7J5y zam7K|Y<`NLl-zxf+B`-USzLyO3I+-whJ~@wNKb@g}S0swTbDwY5M diff --git a/lib/matplotlib/tests/baseline_images/test_image/rasterize_10dpi.svg b/lib/matplotlib/tests/baseline_images/test_image/rasterize_10dpi.svg index faac432d070a..efa15965ac90 100644 --- a/lib/matplotlib/tests/baseline_images/test_image/rasterize_10dpi.svg +++ b/lib/matplotlib/tests/baseline_images/test_image/rasterize_10dpi.svg @@ -29,176 +29,14 @@ z " style="fill:#ffffff;"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/lib/matplotlib/tests/baseline_images/test_spines/spines_capstyle.pdf b/lib/matplotlib/tests/baseline_images/test_spines/spines_capstyle.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f596d08ce38d690ad5f9b22257c0df263d33c233 GIT binary patch literal 1314 zcmZ`(O=uHA6c+U$iwZpmf(M^SXiIE%X4CwY5@?gA)EZin9{j<>W;02)O?J}FL{cyH z;6bP$3W@~})|1fQ6orC#s3KMHqBjMxD58iUUc`&O*<_nEiF?`1+wZ-3@B6+N&vZO7 zKz)OXXYD<#t}7G>@XV|-JPhj0LYaXY(}iB-c~GbIJgb0)fD}Zd3bV2j7;Z^8J(Zbd zhJcWR!2}_gZ9zaD6?NL?Mw$sYho#~PEYE5J)QJ+79c{d0jrRnc2X(9_#?wL<3*zLo=qrQRNdt;xD&wnRN8~c`)A8f1~ntXI`&AVl1u6vi0;Y~QR@iwt~ z^X%6n2YS9Fd!FBj|9J9qW_Z1Db?%CHsBk~IxV8D`^-1;Giw~a{|IW=nesgQj3XoS) z>BjvH&7HpF0F;JYA4nk@Gc^a5!nuQv(7F;M7;9LosjzD3K&7kH5zU3s|HE4RC(YGy zuXIR9P`a`sDDCWa7~@sc9Iu@;vlZ0Z@ls04T;GKH0yL+iJCac#VR9=j4ciwV(g^ia zO2RZkBYw?Gv|d7b`<*SwRt;3VucV7|k&B|4fpRtn8Qqveei0IrrT9(+uBfke0t!Nu zhg7wh>f?64zlDyP&2kC>>Q~721HnMRAAlTe$0!mcAF#G#p&&ZAEfxqPyKS)`>5@x2 zaUrb>ZV)wSt4D&Jx&9EksST%*F8y`M4QnkpVe4j*+0MV&gq7pqNQP^g;#?~2tZdr6 Y$dE8eVnyh-a43v~f{Mp8HkDBR0c8hseEi1B%QlYbpRzEX7WqAsj$Z!;#Vf4nJ@F#*W;|lxbnLy2fo-U3d6?5L+a`bu=AmVy)#tN1<>`dqCQ@k9%wmNx!a(}qa zsD3TyoZBAC()TVG${Yt8Bp~s=7D#>gFQCA{;NaE(WJ@wKF)*aCa4;}T5FB=bmHWOk zrhonR&FoIz_LS^d%Mv4}rEoJm&{=o=^@iN&O{V8RfB5=!YL4x$<&Q1;s^tsaE}QWF z-go~u4+DeT0gJxKH#S!O8yFZGdKefP7>t-$7#L1)2rw`xC_B(o@XY7E{1&S-XSLPd zpS-qEroA+FvMxiz<{dG5H~-%<@jZDiUcsU6Dn%-yZ=S75nH1OZU4fHyLr>mdKI;Vst0KxDW!vFvP literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_spines/spines_capstyle.svg b/lib/matplotlib/tests/baseline_images/test_spines/spines_capstyle.svg new file mode 100644 index 000000000000..4eae0598266b --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_spines/spines_capstyle.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index 15de2a0566a1..1ba8cebd593d 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -290,6 +290,14 @@ def test_rasterize_dpi(): axes[2].plot([0,1],[0,1], linewidth=20.) axes[2].set(xlim = (0,1), ylim = (-1, 2)) + + # Low-dpi PDF rasterization errors prevent proper image comparison tests. + # Hide detailed structures like the axes spines. + for ax in axes: + ax.set_xticks([]) + ax.set_yticks([]) + for spine in ax.spines.values(): + spine.set_visible(False) rcParams['savefig.dpi'] = 10 diff --git a/lib/matplotlib/tests/test_spines.py b/lib/matplotlib/tests/test_spines.py index 977604eb95b8..bbf149d8bb4b 100644 --- a/lib/matplotlib/tests/test_spines.py +++ b/lib/matplotlib/tests/test_spines.py @@ -34,3 +34,12 @@ def test_spines_data_positions(): ax.spines['bottom'].set_position('zero') ax.set_xlim([-2,2]) ax.set_ylim([-2,2]) + +@image_comparison(baseline_images=['spines_capstyle']) +def test_spines_capstyle(): + # issue 2542 + plt.rc('axes', linewidth=20) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.set_xticks([]) + ax.set_yticks([])