From 6103f64fede1d8a393af6384d8404704e1eaafbb Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 1 Oct 2013 17:27:06 -0400 Subject: [PATCH] Fix #2472: Draw the spines on top of twin axes --- lib/matplotlib/axes.py | 7 +++--- .../test_axes/twin_spines_on_top.png | Bin 0 -> 8211 bytes lib/matplotlib/tests/test_axes.py | 21 ++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/twin_spines_on_top.png diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 22a69ae2e3c7..e4351a4d9010 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -8036,13 +8036,13 @@ def twinx(self): For those who are 'picking' artists while using twinx, pick events are only called for the artists in the top-most axes. """ - - ax2 = self._make_twin_axes(sharex=self, frameon=False) + ax2 = self._make_twin_axes(sharex=self) ax2.yaxis.tick_right() ax2.yaxis.set_label_position('right') ax2.yaxis.set_offset_position('right') self.yaxis.tick_left() ax2.xaxis.set_visible(False) + ax2.patch.set_visible(False) return ax2 def twiny(self): @@ -8061,11 +8061,12 @@ def twiny(self): events are only called for the artists in the top-most axes. """ - ax2 = self._make_twin_axes(sharey=self, frameon=False) + ax2 = self._make_twin_axes(sharey=self) ax2.xaxis.tick_top() ax2.xaxis.set_label_position('top') self.xaxis.tick_bottom() ax2.yaxis.set_visible(False) + ax2.patch.set_visible(False) return ax2 def get_shared_x_axes(self): 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 new file mode 100644 index 0000000000000000000000000000000000000000..f0185c4c401577b6a492992c5b502af8df2c047b GIT binary patch literal 8211 zcmeHMc~Dbnw!cvnS3pHTNx-JN1zf;1B9X9&vS=gFD62@=6hVX}0wEF%5tJoBa2gew zb%c>9Yuk#6U?enzjIwn^jIsuz5WoPDE$r{R+VkE_)ztg<`KpErm7Du*XZf9Te)pc_ zpB(KrZ`ip3f}qVOj$5CCpw+t|XqCshwct)RDUJZX6vB_5a9IcbV%D8Y0>9T2j(dhf zkg^~AkGOBi42B@>suR{$F63NkkNsuj(9^&68ybz$SJ_l6p0R3+R?N?Rv`QJp`E8pZ z14m25)g9hummBor=SwN7RyWxy4QUF;;}nv-&d=;ZsOl$g#mhGwF;72=I8a+CPuvep zkF?nf4mxauPktF}2)?pVs}vyU__s$Oh<5P*_Okt#nN?(A!OG&0eAH*fRC*qQCbVMb z+Y1H^W9OP4XA(o#-`pEWp%&yf%dBcIM1`6(>Wb}gJ2FquCN?fnEtQm&nZVDYga@Oh)H6P* z<0i35AKG~sgLI4e0-5&8g5|*Qt9E-2lqalrW^u(R`Ek|OzOWc=dpqTUUrmD)4HU9G z0jOz)VIPLY@<8bVnaoyE>?ob_HSRGc8n07&@|rF(&Gk&>o8jHkKP^r-$pb&suxCfYKHlk)S_$eDw*vGnR&e5l zGU>}%;_QbW@|iL_)&8TGEs`MwByvX~Imvi;YLa%riiVf$yX-+8K!si^7UF!e}-cdp~t>Stbu#oE)|k6FI8lPmfXSlnt(d9kZ;&(MZdR z{SC@pmJKh5i!l4syRMxsW1j;O`r5vZM9rFLHO}T(HoSV_kIYPz9*MYl9B9?;8|lq| zHFI(C>QW+^{8%NigNju_orGm%Uvn!c=d(g$(|INvANokE6wOQH_a1>4sc5#b#5oysIm1g*ETp9UEzgb7||0FO1)N5-d4uWH>VmtT#T;+uQS2 z|4C=p2e4*6yk_$=i|%y%o!BIbAvLw!-@GvB?D5vB?~XuF#eEaIMA>XdY(sj@3O&su zrTD&$qA(wp?I^>EA+G6&<<*jww>yp8zTfmv_vi2;;6a)`7L_h8NFV1}<}ZJ%m7Y29 z*eqC)gk@g?sNkvsOGFjyYnb&~NxI#hNIa!gwOUZOSr?r4GZ<1nlsQn7rtLp0w?ew& zJFiK66W}fFU4)TkX5J}yVQorc;zn6vhjDHUVuz1z9 z!~r;3V6&nO^S5hC!%eLfV^rYH5Hrfk16{YZ2gW9~14_wT9RzI3_Lx=hkXE9uovi1j z<$w>?veDLzQLT}pBtHos)cj&Ncwg9lUi^g=nY`uVN7b&-2-SAnj&39v&GKZ5iDsR+ zic~@&n>m7ofO1eZEyn^IMCKxC<~$(tL0lHb;Ng&J1;e|&4Lr-R-Xd)5H*&J zn!4qe^OmGMj~*X}G|4FU}xcDt8~NLzpmtx~DjA`%);H8)XvSsY|(K zywQ;l=YY74+km+DIV*ew>Lgs{6cW%5 zSyzB<<@*%v@B_>=MHyk%xeR5_$o#+%LA~~1k@klPxgNFCBQ>!`IY2r=e5O}mbNV1q z9;!VChHHlFG->d7(eooy)>1geo(RV3FAV2z7)bae9fn{?hcW|qpwy9Kbw zaC%70Kd2P58)*1BKWK#+^5dB)59b4oN&b6BP7$C?uroJxhfqvrSG`)xulvy~rCcME z2_KpXVw1bsT^I?FkamNq>_6>moPQ_>ZQ#^-R|NgMUIk+NjZ`ykUkD+_QqXR*nE^HL zQrkbVQEKR?HU?Z(00#CTm{66M#;#ogE-~bj9&OS6;0%kr9k2*dHb~ZQ3h=z8@ zBhwfI1PpzRG>;5l}8RcqT*njT)6 z|4ylN>BS%QE3^<;;_VZc@Frtn03c2G-kM$As@O650%&6bFVuf~by^1o&#R_;9+sXd z@gp6;l{8JT?nqqb0)-eA@QoJ7gPxXA1=4%&rZtKOjseV`jRU!wh=<3>s-yf6SxGc{ z#|9zURw5d50QMn%8EaMgibvrd5U{T$r?;_9=Ygm6!4 z{2NzutDMtEgAK2>ff!@|1-R^2HdtLF6ahVnrYa$MVq zau~)HH|-}7upiBmZYxV@E&d zit=c4MpONZjnAB}g*+(1qIdQ&Do3zry@bMmwE%4uWobiQvi8BF`)bcHT4WiRlHQXE zy+t6Wym3u!^x>7yE2G_;s|0?+%YpFpRH-_ah##fylLCmr$zn$LnDR<|NO{mpjXdgh zRyGz*zal`_0|cCYG~yOR_W6g452k3Y=p? zZw9wTV7-YyNi2Pinj~WP;L&rNm!*&>RfuAO_=AQt{ei$vTvx%6ZQz<`1OeBLz1iAn?c>w1q!+$-~fbv`FqS5-h$4{<9T3XkTtyaAbK?nAz4YaCaaZX zI**=kxeV8mEI(bQuFN-FU+d$aS?et*QmkX+Sl`_)k-E0x%7IegHQ?cRdywD*|2|Ac zrg+)QM8p1O)JHqpJ|{75nf~Y=c&b}CcF^p0E}%7{wVI!CzEwHjpmF4%vKsfKe)bQx z%+QF`fjfCh#kPPwhOYz|EVsq3^hs3n;E!65#cD68f`C)qst|QcP zW*#k>D(sWmu|}*t=hrHF{@YNQKXv_=(=aaZymDEd#&#AEX|EMHD9=jw5WQnYz2#ls zwC-|!cG7PT3h9n6L)t}~b6V&4gTZ21TwqE04ZpvM_ju=%3>VNZ1$K|GnlXTw7uu(f;U#muC6IAwdu?chr}U(1 z4Lg(=GgmG&-a;hpjLxP0UeIps;-Fh{zt!Torl~7BIWO$pT1VE$sseZESj!d3R0(d% zG*mQ&U6MrA2*ziM`iAXTV*7+)aQGXNiFoSfJ+PyX`3@s;2IO!AU8bRi)Ad>dIkUdeMmQ530xmlby_; z`;sfOzeJ6o&RFM&Xv0Oisbh+%j^luwV@PkSvC!3dS$rufqE&~v?LrNf_Z`91#-!S2 zXkfR3W$g~D@e9oIs+z;n;E?z*%jmp{(Qqn%rq^-t@k14RialJzdR-PW?%FEo6k^AG ztnDf#EJZ+PZ$Z~~xT#0J=E?9rq)D5j%!_zi0%`utkQ9~2@@INQ6iq$~iHLR`?*YHZ z*(7S3W2H7{Wd3?6@Gv9( zNalE7+tVp*g{x&(%kXj|N*L`rJFqhk$5f9W8|ooS=SDM$crn#1`l+g>u9JUlXAUTj z6L(6+8W!cG?vfRicz=;6s{8mV1@?|&0>A3hM@C5A{Z4Ljl#_Q#kpDu25zgIEx7LRM zS)P8=;Th4L?1vtD@V=W2qBS6<870(FP@E`zS)3{umS*9@_Pm=EDY70#$)_8}C;w-mkx;KlRr$-377~Hxt~gOhlL2q21f~zh4?{OGl>?aw#LB~KyUxXlPizi{z zh;wtEl;F~9T6ba6RRJOtW5-xR!a*>#+0K<*s^F7dxd-wM%v0n83G@bw_Ecxw9mR-X z2J9Oc(a1?bG5n0QdnQFHnxCJyP28AcjlO1w@0EB>?LH-1TieoMS6-zgLnUzbShc}NvH>`WtW2{GF-iF zKtuJIkibm^50Kn@`q?`3;-|1Vwjz&!Wg>g9?z0-IIp+0g1w}~%R;{UqCh9#+5{Sa{yJmAtai%&-d9LUc-6}bhurEqnYDa;_xx<&P7IUPqWUy1#K<5Y2#5O66vKH_fa*QK4R?XbRHtnK;u$CgD}FUCT?a@xl%0e#XR{NEHY-{F zfOxLZ=YSBwhGx37@M2u3)~n8L=<`Noo#-Lf_VnNHLNQ7tj+7IS5rEo(ZPj92O+9hu zv8?q9fgOb0bsNwJ+mY8C4Tc^1Qs*e9+NKhYXZbd@f8eoeDdO1I=6(7O?Z_ESCLPlWT&BA{%@;4YL@GoG; zQ>qT=cl|+w0Y7c>u1C#Yte#E>Tv9EjsltB1lvO!h_mlLrC?1+syCoszX2p;AO}k7j>eiMLHN;H2qcj zdg%E9OHU}U<4dA2mOjGlu~dWD=cunHHYQRMWtQnH?ynuTO~3PTaJFkdh&E^xSfd=C z8Dke*Prt@VK9foRi)@ZX1xOaY(x`5L-uKok{N%$t|1dnYzB2$vg6fKMq@_mFqV;o3wm~ zGa!ZcE=`~7JxRJokNWnwWa5cqPg)&2EiEeU+oKV{y`U@~rJ6)gr7a@eL`Rf(u>7Yh z3$Lq+d-4t|=ggOTXHWJ~sQX*HnAP67zmrJKIl@xF?k`}Gp@b>=@;S+h5mbRdtP-Bo zG(CT7JSE3a!!+`>vkBhD{OnDK?heR0o%mqT59lC8|?e&%$+ zJ0&{+zo}XjB)kbBsIFViyExlUKe#*TY@!3IRQP%CsTRP$xF-o1vu>zk>{sz&40tH2=`v|CVvf?ZJs!7c)x16n=Ri$ULbxQ6R z?upsB)^|oetT=HaW&$P5{c#O<)1x-!ulhCf|BH9w{}J+Q?^gWBL;vy6SJ7AdN88N* zfJTErAb6aKji8^3r1D!75heKbl6VPOm^SksX~~o$QXS{M;-I+r{)n zeElslTfnoSVAFOS*Yy+Aa!LOQi^Z%?s9lociI*>fP9W$@QG3EnmgRg)$H>h-u}jk~ zD~oN;2OZi^Qns92T&P{4EDB?ngpV^35SOypRlDT1I25})1h-EQui5yOw0gk{&HugK z{G}Hx^od0+QDZxsAV_2mw?l&s`_JtC+(BIjLB5ADUyVYOD~MEa$F15|saW7Y=!A`< Kb;VKNxc>r*I7To4 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 3cfc0ec18774..97804115bf1f 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -1646,6 +1646,27 @@ def make_patch_spines_invisible(ax): host.tick_params(axis='x', **tkw) +@image_comparison(baseline_images=['twin_spines_on_top'], extensions=['png'], + remove_text=True) +def test_twin_spines_on_top(): + matplotlib.rcParams['axes.linewidth'] = 48.0 + matplotlib.rcParams['lines.linewidth'] = 48.0 + + fig = plt.figure() + ax1 = fig.add_subplot(1, 1, 1) + + data = np.array([[1000, 1100, 1200, 1250], + [310, 301, 360, 400]]) + + ax2 = ax1.twinx() + + ax1.plot(data[0], data[1]/1E3, color='#BEAED4') + ax1.fill_between(data[0], data[1]/1E3, color='#BEAED4', alpha=.8) + + ax2.plot(data[0], data[1]/1E3, color='#7FC97F') + ax2.fill_between(data[0], data[1]/1E3, color='#7FC97F', alpha=.5) + + @cleanup def test_vline_limit(): fig = plt.figure()