From c7997bed82e43e04cc9d67a97e78bc70646004e7 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Thu, 27 Jun 2024 18:58:16 -0400 Subject: [PATCH] Backport PR #28393: Make sticky edges only apply if the sticky edge is the most extreme limit point --- lib/matplotlib/axes/_base.py | 6 ++++++ .../test_axes/sticky_tolerance.png | Bin 0 -> 3941 bytes lib/matplotlib/tests/test_axes.py | 19 ++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/sticky_tolerance.png diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 96e497a3316b..f83999436cbb 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -2969,9 +2969,15 @@ def handle_single_axis( # Index of largest element < x0 + tol, if any. i0 = stickies.searchsorted(x0 + tol) - 1 x0bound = stickies[i0] if i0 != -1 else None + # Ensure the boundary acts only if the sticky is the extreme value + if x0bound is not None and x0bound > x0: + x0bound = None # Index of smallest element > x1 - tol, if any. i1 = stickies.searchsorted(x1 - tol) x1bound = stickies[i1] if i1 != len(stickies) else None + # Ensure the boundary acts only if the sticky is the extreme value + if x1bound is not None and x1bound < x1: + x1bound = None # Add the margin in figure space and then transform back, to handle # non-linear scales. diff --git a/lib/matplotlib/tests/baseline_images/test_axes/sticky_tolerance.png b/lib/matplotlib/tests/baseline_images/test_axes/sticky_tolerance.png new file mode 100644 index 0000000000000000000000000000000000000000..a3fb13d0716aed8de5596a838828e103d7b23d5d GIT binary patch literal 3941 zcmd^?Yfw{X8pq#+G@?b&I#o(BI3jfwxf2@-0W7v44B*0c!GwDWS4kp-01-&oZNV*< z>^dwgh6R}&p=y&N8W2M+6*Wpk>Sj%(5E9BIg-8g5G$0A=LEEm~wS3W;b!R`EIWzB^ z_ni0nKhN{~Kj#leBZ4n=kKJ=Ty z#u>#SqNDuH^83N>i!9)$2)$m12&u5aVC2YA%(Uzjzs0J9c|b&lH4c8azb0#Un(9yd341y}2||J3A}M;$~s3Z}^~?6J$(nMMXtNf>JwhS?^b0)D-z;b91xA zO=yY|ENgvv7Iv|H+NXdhUQNb)yUf0`p`X~EO0aM>yl0r=`UDK%}^#muXPX1>AFqtvtzq}d8otv)aWuyh14aNRNxFx=r=z^*Fr zB1?I48UP8#u{H-B6Z8Z{toLev)_4Hm`Yqyx5B)@dVJ-@&_$+nzU41bP8y?-8 z2^s-BPC@K)j+g(HBbdcA5ua>hfS67NQG%&y%eF0-Il@N$;K-{Txa{-XPLze}#>Q8# zyPnkgU47hSkw3qw_57$e0Q9PDBCkhO-rw^TQ`5@=LkIxr+ZgE&iCqMHu@r3;r1=v7 z_a?XM-pXR1lYK+80*p$`i&x73sKQ#D4FIzvVvYgf<6pzx8;jVx9yJ{-^2&>vBz^;J za;Z1E5eZbxt&p}e)QPF7^9I{1O-Ihm)ZJ7FIwcei2(!vTf`<>eo^ zFgDj<3&4&O@Rx(>wE%P@{m+&Fe2Z$D%8M_e(Xy~emlAt?Bv`%an8a`%dZq>#WT<^P zU&wG-Y_=F+o_8D}BDZX8E;e+oA>r4PA8R(|7Js!oJ;685C&X>yS$u<=))t1rb?}Pb zmfEOLrLlT%S;2SF#+&p7h_jsK`2gh^1*|JMlQ-tVuDP>xvPG>{cPM8iW^>6g_HWtZ zqCBbhp9QlLcPql>!7C{B{^Dv0)ej{ZCI8CC#)iO8xTnl08sLp#=|a8^?W&9_5aV;< zg=Gd>Jj%fV&peUO>Yt2vWvq^8$8nri7Mj|9M>NJE`aIfo=nd%EzPky4k@S>$;~#Nl z^P{~L1!iIUJo@@j=whiJJ&#&++5&-bU5>ptHGhe~P{$0C!K|CsL<~A z6B}At_<5?_n8bsuYA5T>E;Ak%eoPL*e-Q~R-}z6Nk99H1^d*mQk-CdZ4{7k*RA-** zrudQpQ91gOu>6vI>0b&Lus6h>ezrklp-R1qj(Flcq4NB;i?hoR*k4a709_w~rk{1_ zc99kktAj;9+7IK?OTG;J*ee+78f#re#P{#)T1T3+ zd_NSET@m})sxi7)X@rcUWAM0L1hSzubAP;CVLJJ>mNC>(t2hx3VXox|hHSs}RKInP zpnuc6M52?h*Xc`hQX6(KBZI!AV|H-pS=jP;PzIUuD>=7Latt8Mb0Duly|h3((^@VC zVaZSl-P)*n3nJ~*H7&(ZqNMFff<3ZU$t*=)$Ge6+YsRMR%3BN}BKX6dBKDl+q7_#b zm7Rk{w!2d|kh5RGQ2)Y{S?qb57eKrn(7b{>$O_kZFam#xkc%#=*CAjd>Nk>3}3i5)eP-q~Y+w;enHDA!+m~%HvSC-UKpDAE$mz;v0a}PXx z=xz%pQ{4B5}UkFyCYznA7K!iRhD6lY~(SD(2^Q9r_Rg0|H*@PC@JZ7;}h{>6(&A(ss9_R;pw z=Fwf%D8W7cQi*mzGtAQeS1shF^Yb}ww+inL6?=JNOwQ0xEjaQ)#9_|+Nx%Ci*GT0M literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 0ed5a11c1398..ff4d698fbb6e 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -682,6 +682,25 @@ def test_sticky_shared_axes(fig_test, fig_ref): ax0.pcolormesh(Z) +@image_comparison(['sticky_tolerance.png'], remove_text=True, style="mpl20") +def test_sticky_tolerance(): + fig, axs = plt.subplots(2, 2) + + width = .1 + + axs.flat[0].bar(x=0, height=width, bottom=20000.6) + axs.flat[0].bar(x=1, height=width, bottom=20000.1) + + axs.flat[1].bar(x=0, height=-width, bottom=20000.6) + axs.flat[1].bar(x=1, height=-width, bottom=20000.1) + + axs.flat[2].barh(y=0, width=-width, left=-20000.6) + axs.flat[2].barh(y=1, width=-width, left=-20000.1) + + axs.flat[3].barh(y=0, width=width, left=-20000.6) + axs.flat[3].barh(y=1, width=width, left=-20000.1) + + def test_nargs_stem(): with pytest.raises(TypeError, match='0 were given'): # stem() takes 1-3 arguments.