From e1523fd7a0790fc0466e17c839ea220308ce32f5 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Thu, 15 Dec 2022 17:58:27 +0000 Subject: [PATCH] Backport PR #24732: Use masked stack to preserve mask info --- lib/matplotlib/collections.py | 2 +- .../test_check_masked_offsets.png | Bin 0 -> 4078 bytes lib/matplotlib/tests/test_collections.py | 20 ++++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_collections/test_check_masked_offsets.png diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 26514946cb79..b5ac24dd54c7 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -323,7 +323,7 @@ def _prepare_points(self): paths.append(mpath.Path(np.column_stack([xs, ys]), path.codes)) xs = self.convert_xunits(offsets[:, 0]) ys = self.convert_yunits(offsets[:, 1]) - offsets = np.column_stack([xs, ys]) + offsets = np.ma.column_stack([xs, ys]) if not transform.is_affine: paths = [transform.transform_path_non_affine(path) diff --git a/lib/matplotlib/tests/baseline_images/test_collections/test_check_masked_offsets.png b/lib/matplotlib/tests/baseline_images/test_collections/test_check_masked_offsets.png new file mode 100644 index 0000000000000000000000000000000000000000..ebac9df75ddb4636def2c1dda3cf332210832d3a GIT binary patch literal 4078 zcmeH~Yfw{X8poe-5fBtgD^hgP)oB@5H(XpGAVj-Wk+#TM1wk%p5R4Fx1SJ>2T-+*M zYK7VDR$M?b)>*_r16kaJds0v%xWG^eQ3B>@1Xdy>5M#&%*ptreuH9*8_M^7_aORwO z-#PE~|2+TSQ}VmLF)Nn)EeC)Vv3quY2;jg2z@e_ou$Iul(Z|>;v0ztH!T!7>1x)hs zEQli)&~oz%aq6(5cd!e?eNBEmyAQ!>MX4`*eP30uSPnISHqeN3?4Ro578?C;0?`C)xhsYPVm_#y*I#JKs6Ls+t}X z<-9>%C!bx~P5vg+C2D;M;cOK?DcN<>VdXuR%L88dN2}_ed$;3svRl-~M(>n!yw}{x z0dX}!2A@uRZ;6ZY#@72b;<}3&;oX)`BC5=DQI$QpYvm$IDzZN?>4!-;|S%wlXpew9o7Tu z%HpRc`Wa)=6IX=DIPtof>BR%tUuWm~_C>R2#ibVl>P*i^rXyL+B+r?dIKq8JhPy8` zzmeV$!cw8O#@`Ku zXUgQ;OQocUGHw7U^^bc#KZGx@)9CfIsXqexUUN$m`|{+h&gP@{tEjnFlU?KQ2*N5W z^Vm>&TN<`B3dfU{n9w#|9@9nRBm$1tlcuUreBHeuuy_}#Efx#Y6w*4 zMr|v0)S>)=fGQ7|PiCtRs>Fk)yc8MrXhls$&0jFJ@=l1bqj|Zb+#ZHN8zk~ejZ$L8nO+t}24!IkmYjzZHD>6+#EP5+~K-jbDN)684HFrdGBokwNO zJ&yf#`5i?*i$%b0$foYQH0>VkDGZT1w-?uB3$iP&$pQ5+=|*ci7;VHY@%=V`v|hka z1(uyTU4RL`*;|P8O`#7t3G9-NJT{xHr>PBa8Oz59Z-3lYWPCc;dHn0K4oeYNNpd*N{UtWcar-b0+m|jDdNg1ES?{lst9|Q4nZCt-#bjfv z&gym*2lJtcplnRqB0yA%LHgLxMjX^5VWk>^(W~-N{VJJIo70jye2U1Yg#b!1vPp<) zw_1we8ZKv7wL3#pD@G2+ zDCzsloS;#BpHQk9dN=perbK8H){P%e#vHh-2XkPBiT!tE4SPxaLi_pbib!)Q~x2{(^lby zJ6U~`2Dbo5;3TR|3Ni9*LG_~hqNy)`cK99|{Ye|7?e6yhA;zoj(7eG3earAeK=>xm z67D&4?)*U@1YX@vNcZN)%L_4AJWsJb)fU;&aNsKC5)SkRClt#{wVgWYHhiz00Y!7B zuS5b2Jne4nZVkurK5%$JkZJcQ+^EHT+d}V2fbE#QzCeWfE~0g!|M}T!7tn9yxU*Ko z-92#kH`4JYow{XT(KLgdR9$6`mL(@li%I@&jzIHIguoJNN|POL6G$1l6cTA&)Tk+H z2cVleKe6Z*$syvC{IzugfzDbIfCJ93()wI!Wo^K*R?6k_gaieB?8fH++DIZ%C`Rmc zK~r!9ci_o)DhvFxCTnMdP&=j9H%=JLXE|X~zE)yR?e3fOJ0@12T)35AuhD2)>DojD z$>OZ(UyerPB8UR3G`L!6Fn?g7jQVj4r*a^4^px=75o?+@!+BY~HSz6>R>|7J3(#aM!Q!95x*`M_>gm#O~U=Q~2AD Ge*Z5pYdH`A literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_collections.py b/lib/matplotlib/tests/test_collections.py index 3647e561d2d6..3087703e9daa 100644 --- a/lib/matplotlib/tests/test_collections.py +++ b/lib/matplotlib/tests/test_collections.py @@ -1,5 +1,6 @@ import io from types import SimpleNamespace +from datetime import datetime import numpy as np from numpy.testing import assert_array_equal, assert_array_almost_equal @@ -1181,3 +1182,22 @@ def test_set_offset_units(): off0 = sc.get_offsets() sc.set_offsets(list(zip(y, d))) np.testing.assert_allclose(off0, sc.get_offsets()) + + +@image_comparison(baseline_images=["test_check_masked_offsets"], + extensions=["png"], remove_text=True, style="mpl20") +def test_check_masked_offsets(): + # Check if masked data is respected by scatter + # Ref: Issue #24545 + unmasked_x = [ + datetime(2022, 12, 15, 4, 49, 52), + datetime(2022, 12, 15, 4, 49, 53), + datetime(2022, 12, 15, 4, 49, 54), + datetime(2022, 12, 15, 4, 49, 55), + datetime(2022, 12, 15, 4, 49, 56), + ] + + masked_y = np.ma.array([1, 2, 3, 4, 5], mask=[0, 1, 1, 0, 0]) + + fig, ax = plt.subplots() + ax.scatter(unmasked_x, masked_y)