From d3427b5e53a30a3bc532d303e76ceb29a41dd47c Mon Sep 17 00:00:00 2001 From: David Stansby Date: Wed, 31 May 2023 13:42:03 +0100 Subject: [PATCH 1/2] Add scatter figure test --- .../tests/baseline/test_scatter.png | Bin 0 -> 11829 bytes src/napari_matplotlib/tests/test_scatter.py | 25 ++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 src/napari_matplotlib/tests/baseline/test_scatter.png diff --git a/src/napari_matplotlib/tests/baseline/test_scatter.png b/src/napari_matplotlib/tests/baseline/test_scatter.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd7d9e823055096db8151d6679d344490e71f85 GIT binary patch literal 11829 zcmc&)XH=9|w|;>jMg>Jckg8Zf5s)H9x-^YcQ4wiM?<2jJs8Kp9D$)^@UPPL7NvKMd z-j&{Q=zZ=!nB?<*3CX&@Zq~|5n0aUBoPBnA%JETAk|*CozX!uG@=F(Gu3#9+5ey@~ zv3nQ166SFC4*W;hPWFbK8qUbh@wSa2rg+=#js?!n!c^~wgQ1PBDb9+IOOT7_%n=hi zyF0e$xw$R>e1HpQW6a&XXZJ(+k{|C})Ud^{{kPG-M2Qj!rWnQs#C;tuk+KZ zi=h%*2_}jhN5Z{KEyL$E@ zZG@NR$+#w|BTZ7QN(z!xGFPwO`At=o{*mm<$@Pa-Td$k1(ga+Kj!)6euob$woS(O5 z+8}lkC$YTRqaYAo2RoD`P75m_!mya(1Cki#W$?oR3_Eg|=m!kDD2Ku8PbmLSFL$OV zF|h9?;HSMEX>qwNo)cr`b&WmRo|}zyf-{-%R`+-ZOJX~E)TqNRkdE!QiP;9 zTZt^E`TISzIx5;>4@}zP6*W6rI8`3>sKc-L>e(viFkY9u#lYuY;7O$BHp2m5CYza` zaFgOMyWICOPn&9att2v?xh6}xtw*$9xM@ZM!}vKl{`Ov+AORU=S zpB4OdVcKtQKDtn-Wr$1tpz%@bX(8-a^TQ6Gc+i*>jBDJepNfshp$rv20m1RIF(Cc> zRFNLDcnrY_QLNTpe<-T!BDHvZnFN!Z-|6}7v#8{{;pRa#KV`IdF^cIehM8EW?hwk| zk)O_sFMGKxO(#d>)LP}6Lm+jpOa5&J^W0Yot`RheazF3LX?t;o9>cl?b_n9PGjk}@ z3xDdEkn%ItoUUj_L1Hn6sfh0U<@0JL)f+9M(i6>F+zr13=O#ngb0c<48a0pjVdg6m zC%XBJr%M!mbRoiGnEz!tv9kHxS^SRpw?F2aQ`yd@l49?lXYG(`N9|S=N~GrH=k_JC z;3S!_TbDJ6{{vZ|{`(mgn74 zdogy29fLyg+D__csX4XzeM!n3RvZv=;=k-sf7h$s>7^bfEiD#_juu_nzwo%P{d#f& z()AO)co8nb#jM|@sw*$U;*QSA@H!*4bJx<>mZKT>9x7^Xu~e~gsN;*7;T*>#`5H5H z^Ik}J+7;_FmqDTJ)UqHe72I_F(2$5^?}zM{Y^4*w;PfAkBoJsf8Z#CZyNji=u#JRDde#`w*5_~LI} zed;c$o7JjA0sYg>pX$4MYSmCpcRb%YVN|ZH?y8&LpU4tCs+l4oFONy8?Hs|Fnjr=i zi4*G%^etA%1L`{KCjF23{&B3iEEe@5$0u- zCWSc<_^?g5M~OIExy^_7`|EBD&{~g#8do}WySvm>1~3c;ip+S=dJ@*HMuQ z7zC~SU1y60(W_7R$uR6`$lah@?z67_emwe>3aMUm$ zws<=&1PV{ES@pc*iEAH<9gBCG`27wY90Y_2N@lJ4y@oe=P{Z2Wbq zB_gLJw3*6*7#m-lZ08(lV9}oKIF#^kI=7o^7X>372^qy17k${i)q>ZEcMNLwRUXP8H8^td6CS2g11EBEm~bSYlUcWvGn4luEeAyA8+rjuC5zz4K77^tc~;F`ikfTt+Z+wNC6X- z-sL-z5b1F9jArhc^rE>B?*@E1SXl=;^n(H{1Q^n8=J>K~j>%g?nm#X3hOggefe&xg z_1s)^`dUV&U-RUIs-`AGvFmbRu+sTcknGncnDd93^$mt~eJPDgC1GJ?# zmRDasWcHQ1x2po>xX5(2T7-4wVSJBm!?Wy5D8kfkKcq-Mq`=pUM9+N9w(2c#nyX=( z%pDBy?yxGH)|>9ic|Ca`=0rivdE6>XLq@GexaO1&7UK&&~)@x&>N+R&3^ux+Gw||4<=--;|*CT8$2YGudh6_|| zF88xkF}qrr76NAbaG?x)+pgnU;m2J<=XZ$HcWJs?z9C9%(#*U)Js_H}F>3vui0tWG zd04u_5cv`GYO|6E=L2$vL;b7uj`S^#U8V^xLHf|fhJppXU_ji|J+Ka9 zK?8xIRK?o#T8+Xp%`aE#Fv(-oJr5ikW28_jQ3I&L4AXC6tE&y3%*x`c23pR;&+t$` z@ndjy>}sSW)kI{B2XG~;MhX!^JT41kl+T_$Yf9HHbn)!U!$rrc!@@#2-tBEedkwC6 zHTJr*U~BEAs+tdK5ki>FfG}0gkQz%u&w?zb z<1bUXdmei$i6kq8wnn$vJhblgo-HXf371*_p z?f~=(p8y6yIT@MJ`bhnmo_u_hJWIvXQ))l;ox!liBB;Us^}gj;lqCzz%JL_JePF+B zDJ-5Fc#qVuxU3)B=h&r8}gK2qvr!U!}PIT%W@fE1A zG|jwv4Nv%7?Ay0rmTqDet^jF_akbjtkbZ#b9nx2xge`pau^@}wTS6k8_;u@ZD;{HYg?P~{{P0W_9Sg_B*`rc`WEPI`BrVYZIfe!3faT6Rsc_=gf3M`a}-Du-dJP>4*uSsCW` zJp7Q^#l&v5PYlh#73l6SVg(_xwbc8LG{-CYIrh5?#w$lNld-tn>2aA%PU6Do)g87av{nR1x4bZpUXHlknOli+6xXDeZ{QR%LI3K>|N%m}(iah`pt z*RlV~GHOUabM86fnF6H<*_g2Xpu}p8a;#-{E`IJKcgVLjSTqR~MQao~Sc)z*N?Z54 zFIV^<=F|J_0eMrQ<1C$sgGJIB$t{LE8u8NgUA0r6i`pq_7`2D2Fq3+S5$X%af zf?(-tU59Oh*yUahtUKm{^ml_wB?{Io*zd-N4#sIPKu`}Lk8gz^ZB^Jg zb5_<^wFD&|=eeO9xfU8d@b(GZA(;7n@EQDIRnQ~wOe8%dQoBlv1M1MOap;5z>0pn-BKQq@AwryM=?buzou~({h zXj54>K9k`;UFNPBPl#r=9jy<@>vQ3N!Fq3(CuG4MXfSV~;mOOC$IAK*sF$u?tDhIJ z?7CW%4h;P5)w5n&_N~{9B;k)(b~?%Ad=Zahu!17xF9Bl^|(CUMN}Jrpl-fHE|F zGqwlz6C_!A)ls5f`zBw7#_oSfBAFCWy-=eO9?BG)C2%~DOI8Hqzxy32kH3WhqEbS? zEIc_|O7N%+ab=|r4 z@^kH4&7X^)5yCH^!uUP4!pV;$MA-baFx@Tqw$mcQ=EEs8is(e0?iAbdhAL#6HlL(` z{?q~8{0TpZX#6<%#QJoe?o?jC2PJ;otQvYUJwo=MDj|w(Ht9k9pNa%s>uk%?CfN1!Rwv^jq4 z)9cId^YO4vU^{Uz?z^X*2yM_X4+gU-2QpZ_J38yP2YQLP8dPh(Md{{}^_O30D<2(| z9{6=H_ZcGqkCLHX6WClR35C$DEbdb zM~BE5??@_y@}7{*fZg*!YDkIWme4_ODb5va;&IIRpL+lGqYrWd-2GG8$p4 z)MN9J^MnN@WGF2RvGt{C#N8+<5xOz~+E9eAWUyb1bm%$-5F_%F{kJ-h9&=w`3Vi>PVXugh05QO`H977-7Prm`V!+t!twiY zTbiH!WZSb?S_Ek2H@F$(HMe_`j^&qMf3a>+m9KamqC-zujV5TkJ&A_13X}o*(+8%rz-|^w zN|ajwC(lMX4ftGHfZaR|g?I)li~9hi}0*JBb z(?SMY8~4-J2R2jkX3l%b!Pp8EovU_QXp-08SivI&;GNF&dy@VBNoom|l=6(K-$2G= zK`%F;ad>D}+vIHTp)=l&ea;Cp#Vi0Fyn*GNFx}QroQ);XkSAlZQ`uN+FAelY?^Spa zk?6hmBKj3{l139}l8cbzFcppoSadu}W`S+^)AW!|f?Q$8TQVOeb_xK7CmVv7ba9t8S-gkWhM z_fa@W1w-ugO|?2j!d9?;*ezvTQWv^y$;z5WpIQ7Y!y^OTatq%7AzF_zkOE=nd;cQbX@(>1H$HTj%Y~ z_OXbI+V`X8nB6J=1~Gmi=n}`m>nb_(dJa}G+A5&4UaSYPtqB$&G!}Dj;8n2FPoK7F zmZg9fBcdri)>X1H z+hX7*sA2vyy@gd=g;NKib(%Nfq~Kg~wP0>syGGL>wyXuq1qlK1Rx|?{JyyQpv!XZ8 zc&s%?KmSt?nEZuS#~V6gt9umeD%-rBD+;m+wP3*fCue}|ufSB*{Un!X*sd$VZ)PUY zA_6$;SHPUNsqA4Cnv%2h2`Y)@;EMI9yVV7RGGM}v#RbIz*Rqc`24w^BeMHS!S+~Zc zw@%IEk480g1u_jnA52Uk0JXRJ8h8Mz zaj5s`&~Hp$De2qQd*yL)f5Q~0>eG^Ua%DE%aEkr+p-9P%JZWQK`^Eh)6&w^ z8w_}P3_m=5@&`yW=zMEvT}~-q4#yG)OdH|$$n*BT&p6a8Ay;Cd$u;F#c2gG<16u)< z^9>to+PQCW_m#R#(i7*J0{ozt@NjEsX(>m#5_j>!6@#qKZ4I<8?40#QY+uNJ+m|S_e57i(vb$>LyA^DJ4g)~(Y58wgS8X_lL)%(n6 zIc&J!=e`8a2gqqK)HuqAoIyaw(9m$32`_cysz~;WBDjkO+9i?>(-VaatAjfD1d`oY zU$JZND6HhD6%3MhAkzS}QD27jC51UZ`>q6L%IXf0~*q*8iG=k~KrU;}aub z`_c~eY50vOVyEs-X0XtoJI64=1jGBbLUhR+pYz0+SN4PbvkVDQU3q<(OVb<-5g|23 zS)ErEpQUVVvQ@#A3VwSAs7pVZM{nEzbW67h`tLVB_~7vQ1Kff%#G*&>-#p%UXE$?A zqn%3%^u(nGiHpdAGq$YGj`Qm!m;E<;AAUqcnm6C^KbGTblZSF|cJ%n58~y}t_Ea;f zacP@&_J2y~n2KsalP#U41YvWy{_r#={CUm47_o5IWp38)+_xR%Mb~b=Zcdg^zHGSD z=N`k2Mrxokzi|ZO^qJDn|7Hfjg&sGj{&=gOd58YIQ8aw^K1KHnHRWlB<^*nw2?2J# zKX3bl{R{zU7^PF`fBEI;U-pi!A}sah*{bD99yaYS;ayvtY=b)nMt@!*I%gXmy6ElQ zvAmZ&$PhquZgwvQ$NS;fjeqEw-`)NBzLoyJzufqW*?plYF*(_6LcrImDOOe$Fe_-m zmJ`>p+*7bT#R>2w0)V2&Tg8nX;=D=S+S*FI`+YyOZW953j&xv1SgYj`y&pZ|1-u1W zn)3}35=)@Qc34+2>4W|s2+S?N%yXIm6fU-);QSJpa2?=`>Y?|LNd`(Eh!f@Bl-Bcg zg7PvlCxesLsVFn;#y^4Bg>R1D;>+&OhjU(9vMA5ak}vXPE`hmoKU5(~gY`_gtQWznWY&w6awq%htJ%3>7Z zpoA!w(+~EuFcZG+Cmev-1%Rb^jzVJN>y2y^)os8nPL5HrDf!#h3$r1DawEs=+QzuD zr|;_gXcbQtBNdRSK#<==jOxN@KH)3gF>6Ug$WSTre8p5})*x^ZKQMb` zuU)&As+q@SRWKgEGNE2dk5F!um}}d5pqi5Ki6t;!UkF+2fqx}|;1=?ckuGgNiY$yw zkZY^9m3Z(P2fjRH2}CCbUd!O!y<8?O64BE8#rP`&nHVJ2I~xYTjR*p?#?2Z#lYw#G zJcQAkLKw*d>%s-O87Mp9E<)i<2iS9u#I{xj=RMj%%zD(@Ltq5s*u2xbIu|hOIuMAq z6eg$7KX*dRjnq?bs5(vo`}mk^)_U5t^009WQ~2527X(<}8b{h+FP=nVfN&xBOtc%3 zV6}%$gKJ%^Px&|!9=d1ix-j-wY`&InQoJAhR`>~V_+j#TQj;3dyQGqF(-0ziPXg!z z<-Rl=dceQ@DVWZeZ>-KwnxR|(+%1mo8l-J$fRWsp?wav&vLpG7MD539}2gMFu8;Y*VVHb>o-(z$cz@LTJ%RmkHcbVO_4ZqsxpX$1%6VO zelZIjo=bEHr{*C_N?4QfJ==j-~6p??%GR2cD`a`M^qWp_ z8hoa%$*h{HFmbwBe-yQZp|**OTB0ob14SqM!e#tndr95k6; z$i?hD^!UX&^XvW$f?TYzeX~zL0(%m7jK(;BK5B>2PybBD?9JC8%D1)IPbi-0fR?Hc zfgrD+hFJfu@Eta9OZ7pC2U6@ngl)Z#cVhRV+2uu0K;Q@6@D;mqzzdQGvosD&vw*dF zkoJT?8#%CFY(b^C^+^?rXHi)`6L?}@T|GANRhe$9b1qf%>#juE)G)D3vOz&8Xua2f z&vlVj;CmoOHGS>@UQ-nzY&*eJ2)9P)H)aAhi?N$~V65n}}pA}!iwGyvAg>@xQ9g|MxWMaP??$fH-+b+`9t zktmsoKsP%|)_Z5chi@K?a-H!3%jT>XBTOE+2ju?(${LwOnUHnc)r1ys@8u$AW`p>8 zIf{t7j4T$-Ul|PAdqmPNq-JZA{ydCqpBH~m<-TW_+gG7O31n4f)w>!K S{iR{xW0z!=WYRC(y8A!;L`FaW literal 0 HcmV?d00001 diff --git a/src/napari_matplotlib/tests/test_scatter.py b/src/napari_matplotlib/tests/test_scatter.py index 88e0584c..d1101909 100644 --- a/src/napari_matplotlib/tests/test_scatter.py +++ b/src/napari_matplotlib/tests/test_scatter.py @@ -1,17 +1,32 @@ +from copy import deepcopy from typing import Any, Dict, Tuple import numpy as np import numpy.typing as npt +import pytest from napari_matplotlib import FeaturesScatterWidget, ScatterWidget -def test_scatter(make_napari_viewer): - # Smoke test adding a scatter widget +@pytest.mark.mpl_image_compare +def test_scatter(make_napari_viewer, astronaut_data): viewer = make_napari_viewer() - viewer.add_image(np.random.random((100, 100))) - viewer.add_image(np.random.random((100, 100))) - ScatterWidget(viewer) + widget = ScatterWidget(viewer) + fig = widget.figure + + viewer.add_image(astronaut_data[0], **astronaut_data[1], name="astronaut") + + viewer.add_image( + astronaut_data[0] * -1, **astronaut_data[1], name="astronaut_reversed" + ) + # De-select existing selection + viewer.layers.selection.clear() + + # Select images + viewer.layers.selection.add(viewer.layers[0]) + viewer.layers.selection.add(viewer.layers[1]) + + return deepcopy(fig) def test_features_scatter_widget(make_napari_viewer): From ae06a7abc32cd6745415a895443d0af889057273 Mon Sep 17 00:00:00 2001 From: David Stansby Date: Wed, 31 May 2023 14:14:48 +0100 Subject: [PATCH 2/2] Sort layers by their name when storing them --- src/napari_matplotlib/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/napari_matplotlib/base.py b/src/napari_matplotlib/base.py index daf7bac9..25b10ee7 100644 --- a/src/napari_matplotlib/base.py +++ b/src/napari_matplotlib/base.py @@ -183,6 +183,7 @@ def _update_layers(self, event: napari.utils.events.Event) -> None: Update the ``layers`` attribute with currently selected layers and re-draw. """ self.layers = list(self.viewer.layers.selection) + self.layers = sorted(self.layers, key=lambda layer: layer.name) self.on_update_layers() self._draw()