From 56e9b41dbc04feb64651e990410f5e7467a9e6d9 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 23 May 2020 01:12:27 -0400 Subject: [PATCH 1/2] Don't composite images that are no clipped. Otherwise, they may end up clipped accidentally. --- lib/matplotlib/image.py | 3 +- .../test_image/bbox_image_inverted.pdf | Bin 5007 -> 3933 bytes .../test_image/bbox_image_inverted.svg | 43 ++++++++---------- 3 files changed, 21 insertions(+), 25 deletions(-) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 1608db9f5090..39c9cb1b5e27 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -149,7 +149,8 @@ def flush_images(): del image_group[:] for a in artists: - if isinstance(a, _ImageBase) and a.can_composite(): + if (isinstance(a, _ImageBase) and a.can_composite() and + a.get_clip_on()): image_group.append(a) else: flush_images() diff --git a/lib/matplotlib/tests/baseline_images/test_image/bbox_image_inverted.pdf b/lib/matplotlib/tests/baseline_images/test_image/bbox_image_inverted.pdf index f1cc042d6606a358693a5f185b315459618aede8..df07fd91a9c63f06e446a2a3f65d0b8df71b36b8 100644 GIT binary patch literal 3933 zcmc&%eN+=y77wCZi6C?lX|--gTcpQUCzEdkr4T+!wM!uK(Mr`J8Df;o#K~YIkwOu~ z<2iz2UA9t0i=L)HTgs=Uf?vC&99^ipEEPeJ^%QmsDB2@m5!mc07@r(t*Iwn-c;0%HAEsH`Zl0kTuxfEv@f+i6Gd}X6jnv%;12H6hm z1ciY82_1u=VQOGA&^k)2V;J&2g35N|3KgkDgqG#8;qiM2IfIDIn@_ugae%;ffB=%D z7%eaX)=PjZ1PR`JEE|NF)*k`s}kz%+QCrZU{-!c}5o$xx1H|Qit_$l>-%dV)(3r8{ywUXSFqP(Na?z+9W*xjWnyZF1nyn)wF zwGxf;L!aO1+40a=7qfTA*QwbC2IGVVaBXVXudB_V0?dv%b|L5I2qE)r&V*qI zX3f(uE`nJyZrX42e>UAf6{D3Bw1iS?C=yat43i^~qGcLf4!Aaz3T!Zi^aG4mYb~dM zYFd!ca6yuq)FONzA)q`BGD6N!Gy<{@9(rC5zeT8&yTR8$1n{!)+4`A~CB-x5&x<+z z*;Y7hDUQad6oCBD6xe)<`2(#O$v3_jd}|Nw+<2TvUHOPR;4eGdQc~u=MYt=J9W=qa zJ8U%;&f59Pzgf?xFLhgOhoNTYMC>>Jp?W{4@b=UDPV)8FGR;ml zcV>IICiznp-f^*mMYUfK2Oq;ae>53dpEkvm`mlB)cJS2-QB7g$q-yB!l7~hJ>F_T} zLm5lDT76qg^&RK2hVi&Zmv5vu4~t*=S=Q>;ax|YcvLN8OBW_IEVmk~M$H!As^Xs~= zrKA>Y>TbIq`^ZRLjWQ*lYB~vyMTFH@=x+ zhoNKQQQ_sLPEB`5O`H3f0wWE)?5*z%e~js`TzFD%z#7DP+pE4jU`QECbFKC|RJLO& zYvlKKK-C(|i^sa^3jwzK6Cruql<39sRTZ8G%kBXhRHJ~gUR2d+lfUw6*mZv<&DoBQ zj*oV|E==)FKu31912_LAEvy{q1=;V{<-J~K$n$coivOE~eR(?Ahv~0ps_P<9Q~#ov z>ieGpy7ov5haSh0r+Q82)pa#1C(b!4>_kmq_AdkILnZd;NW{@|Dru3}$ z$iK%v8Er`K8vO?5zplT+)33cXpZ`?y-1m0MdSLcQ`v;RxANIS%`~krEa(~}DEAGb) zN^^_=+vO?sKaokL2Mi`UYlZP>)??RINZ=0+YZlsPm~dq+Do>fGcCpnYm`KdE6))xj z;5WJNF)pYU{;&I<%b&jP&80u6u>Y6q9$I?ly1#wZDU-8oQG`c{M(wcw(cbDMB|ofN zSo3b@n)2|P`!VS;*)bN<*YxiWaVE^a`8ST zFIG5|Ri;Vl+VR4?H&{KtyRstZY=$T&chQx!1%U+_@eXCf%iYG3Ut7-7I_@fbIpExn z^~AfZ(!2$Mlc_h%8)+9t?bZKM#=7lT_Rlr)d17KK;xK{077|#U*&-sLl0ex7>cK54 z1?*1DJxe5P9xP3krSF1ZN>%|S2`n=|zwLVVj%yXG4nE(N>@D!&R Rb4Yjs40O|8!Qmn7{{phI92@`u literal 5007 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 X%!gN*f-x-#Umy~(-Q7bYrR;wK%R}^D diff --git a/lib/matplotlib/tests/baseline_images/test_image/bbox_image_inverted.svg b/lib/matplotlib/tests/baseline_images/test_image/bbox_image_inverted.svg index c3942247a542..406a278f2f3f 100644 --- a/lib/matplotlib/tests/baseline_images/test_image/bbox_image_inverted.svg +++ b/lib/matplotlib/tests/baseline_images/test_image/bbox_image_inverted.svg @@ -1,7 +1,7 @@ - + From 28756a20796fe814b6c90d936dcda220f0f209b9 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sat, 23 May 2020 01:13:46 -0400 Subject: [PATCH 2/2] Fix clipping of images with clipping disabled. Co-authored-by: Antony Lee --- lib/matplotlib/image.py | 8 ++++---- lib/matplotlib/tests/test_image.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 39c9cb1b5e27..b225766d22d9 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -887,10 +887,10 @@ def make_image(self, renderer, magnification=1.0, unsampled=False): x1, x2, y1, y2 = self.get_extent() bbox = Bbox(np.array([[x1, y1], [x2, y2]])) transformed_bbox = TransformedBbox(bbox, trans) - return self._make_image( - self._A, bbox, transformed_bbox, - self.get_clip_box() or self.axes.bbox, - magnification, unsampled=unsampled) + clip = ((self.get_clip_box() or self.axes.bbox) if self.get_clip_on() + else self.figure.bbox) + return self._make_image(self._A, bbox, transformed_bbox, clip, + magnification, unsampled=unsampled) def _check_unsampled_image(self): """Return whether the image would be better drawn unsampled.""" diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index 18609f1b5069..fea5f8a1ac13 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -1031,6 +1031,18 @@ def test_relim(): assert ax.get_xlim() == ax.get_ylim() == (0, 1) +def test_unclipped(): + fig, ax = plt.subplots() + ax.set_axis_off() + im = ax.imshow([[0, 0], [0, 0]], aspect="auto", extent=(-10, 10, -10, 10), + cmap='gray', clip_on=False) + ax.set(xlim=(0, 1), ylim=(0, 1)) + fig.canvas.draw() + # The unclipped image should fill the *entire* figure and be black. + # Ignore alpha for this comparison. + assert (np.array(fig.canvas.buffer_rgba())[..., :3] == 0).all() + + def test_respects_bbox(): fig, axs = plt.subplots(2) for ax in axs: