From 9ecfd3b7a8cfa03ad1ff9af640730c5c9aec6140 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:02:33 +0000 Subject: [PATCH 1/3] Initial plan From 9639fb032e9d85ceddda4dd7a42ec11e7e43a941 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:06:25 +0000 Subject: [PATCH 2/3] Initial plan: add tests for plot functions Co-authored-by: jsnagai <8943000+jsnagai@users.noreply.github.com> --- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 391 bytes .../plots/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 200 bytes .../plots/__pycache__/plot.cpython-312.pyc | Bin 0 -> 37743 bytes .../Comparative_condition.cpython-312.pyc | Bin 0 -> 6384 bytes .../Single_Condition.cpython-312.pyc | Bin 0 -> 7104 bytes .../tools/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 321 bytes .../__pycache__/generate_report.cpython-312.pyc | Bin 0 -> 3124 bytes .../tools/__pycache__/lrobject.cpython-312.pyc | Bin 0 -> 2254 bytes .../tools/__pycache__/utils.cpython-312.pyc | Bin 0 -> 31628 bytes .../test_mpl.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 4284 bytes 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 pycrosstalker/__pycache__/__init__.cpython-312.pyc create mode 100644 pycrosstalker/plots/__pycache__/__init__.cpython-312.pyc create mode 100644 pycrosstalker/plots/__pycache__/plot.cpython-312.pyc create mode 100644 pycrosstalker/tools/__pycache__/Comparative_condition.cpython-312.pyc create mode 100644 pycrosstalker/tools/__pycache__/Single_Condition.cpython-312.pyc create mode 100644 pycrosstalker/tools/__pycache__/__init__.cpython-312.pyc create mode 100644 pycrosstalker/tools/__pycache__/generate_report.cpython-312.pyc create mode 100644 pycrosstalker/tools/__pycache__/lrobject.cpython-312.pyc create mode 100644 pycrosstalker/tools/__pycache__/utils.cpython-312.pyc create mode 100644 test/__pycache__/test_mpl.cpython-312-pytest-9.0.2.pyc diff --git a/pycrosstalker/__pycache__/__init__.cpython-312.pyc b/pycrosstalker/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e8dcdb89280d853761e3ec15b76f31ca970ee49 GIT binary patch literal 391 zcmZXNu}i~17{%|>Mr%vzATAD)!ND$x1xIn|P(*MjPFc>-JL%C&zT@svNvHl7uCDs8 z_z#o}F5=)ObnE07t04Np-FuH8y!RXgZG!i7^B^nK*E;;1_ia|kXzmFo3E?!M+)F&( z;7!%Ynu$-zm*2{^lNKdqv**wKesmJ`=ewiAO=fZ$UV_%CO6NxxxpmSNPK38$!U1Hu zaH*4!rz#wZ95Ok!@Ac?aZ>Q=oHWS7oWvps5mSP(i^a#dAaOo_DJzb6sSnE%VLX9M#HPq|Vd6V5(^!{-y7;;-9{o$dMq|cgE*)c$ tF4wKI40xf$x!J{Diq9V4_tBt~F1!1S&N4V$w3pq}Mdyu#FC;Vp;!poEd=>xz literal 0 HcmV?d00001 diff --git a/pycrosstalker/plots/__pycache__/__init__.cpython-312.pyc b/pycrosstalker/plots/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1507e89847ea7c1e7084504d91393e9be4d3b0ad GIT binary patch literal 200 zcmX@j%ge<81gjDjWQqXk#~=<2FhLog`GAb+3@HpLj5!QznHU)=nKYSSG6DrP8E-La z`2k6mf}H%4l?KB#f<)s$sm**E{>laiy7v&chha~1?rv_p0l0kAM zAh{xakU_=z@$s2?nI-Y@dIgogIBatBQ%ZAE?TR>nrh}|41~EP`Gcq#XWe_f619AWi C0yTgD literal 0 HcmV?d00001 diff --git a/pycrosstalker/plots/__pycache__/plot.cpython-312.pyc b/pycrosstalker/plots/__pycache__/plot.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19480064fcb7c78f6238a68c185997b1241a8010 GIT binary patch literal 37743 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 P)%oCTZC2;AzW9Ft5&Z(I literal 0 HcmV?d00001 diff --git a/pycrosstalker/tools/__pycache__/Comparative_condition.cpython-312.pyc b/pycrosstalker/tools/__pycache__/Comparative_condition.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87c16f4f2ed694260c62a83348be589afae22178 GIT binary patch literal 6384 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 DUq9fA literal 0 HcmV?d00001 diff --git a/pycrosstalker/tools/__pycache__/Single_Condition.cpython-312.pyc b/pycrosstalker/tools/__pycache__/Single_Condition.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ceede967d95fd9b3723b5be5cb21837bb362fbff GIT binary patch literal 7104 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 Pbzl+TCeyw9;eV1 literal 0 HcmV?d00001 diff --git a/pycrosstalker/tools/__pycache__/__init__.cpython-312.pyc b/pycrosstalker/tools/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bee28f8c81bb709f403121706ae6fae5cec6af6 GIT binary patch literal 321 zcmX@j%ge<81gjDjWKIOqk3k$5V1hC}n*kZq8B!Qh7;_lbGBH9}jBpkcoW%@hv4B{W zOq$Fu8G)KL8E-La`DwD=5_QhcEl4a%EXgcOjZeV?Z zDaudEN=+`g#h;#C%v?=Yy`VUWMWAby8I?kTJo`kS?s38sMzP23A`tk_uNBm4Hvz*c8 zS;jY7+2t&(4V3kBe;tWe=3tdqD;>$doRkKCWl8Yfj?u~O zWTTVcR=A{8qoZ*nS?>U+9PHGg`&@LYX~{jkfb>pfC7+xRXEbsGHfuVa@wB5Tkp2eH zbw-b-k+M)mQgR4-G?1|qd!}nV3H{N!vQkdMg>tKxHI1I*V~NC01<)z(#E1Yk&kb*o zsqSKg;O_Y&?k0zKolJri@CJeN_7a$H4E{oLu<~NE8qO;xhwEeo2py3NNROhZo@1N9lpvF`rn0D2k2w@VP_$so z1r%GDG(3VW9$2ylsKc>EaTrkkvh@yz`*m!EnAQW@vK-&HcoSQ0&M1FgQ2z_0WsF=YAx-#4z$Qx!!8e~weInz(&p39 z;Z0@*bqhOg(+b*LvH^)hthfhQ!L1cwlR}g<=?Y6p_B{q1b>$+Hw%(Fn5auCp5m_El znwUdY@rD)p0gvnjRkl=~k`!x49#v)nHQXzm42LN?w+XJh;JMXipaGC_*_xu`O^R7F z@KK5y5O$$mISs7bL=CV$vNEJ?f{|i$13#c?uUzc=vU@S`MP9j0+`@`f8eaE&oKg`R zu1*O6J@62~wCk;O9B9j-t0-8P(ItRT0=Y~Ahl9s)P-C}!8`QU3U3G!S>S0<%6#PK(n$1DX2%nWEDQdG)U%nO*eDLIt7(Rm6VSt+V8q6`FS(qomV zjN?$ztA{WV=8oqxQ4Tj;Stwi<3KjVTg3YNp@CoYAu`YY{I%Fo{p5t3f&MhAcLna!P zZx&%*TUd0Vb~lgDIlkM50`y43nwz_7EkFjt8eVSH37f1sB1#Mo;v)y5+nl_P`FcQC0o53$%K^cgXXc|OAr&^yIVb{8)oMft2rgjO_Bq?E*b&4Sy(~$q z$Hcc~%xs_94ETKvc>@8FZA273I08fnyr~Tc5~s39i%gp^kqxOwxX3{6i051dk&OT# zn=4?(>K_>wnZQIo=?fwQMK212iWa%35F-j1S5b`WPF5I|uOd;D-P55S z1FuI1CK1f3eCI)kAPa>F9>{MSCf}a2tEI-XrCKv+;Tkjs=+`wFq}rj@`#-x>w$*qL z_^g(+dOL3Q;f5&6V0jGN*B0n&pjCbdvK#OXa7TN(tZQR4TkZaItv`LXKRwf*KJ%nt zjGetR|8!K#k3abSA18X|cRzl88-Mm*@AOX|SN9f||GD^nck%r_n{*e0?xmprqgU^m z_e=Lm58mzOr?-CH&DZ*GUis$HZn2xc_#dONSDfh?FCCc0yXWs;ym#@z@4BU#?OeB1 z+c#g?{oy~%R}aQdZ_RK2YIk#g{L)?XVEok9%=V9Wn~#h8<3E%8nQe3T#G`i}uk4Ti zBDue?KMpo1>8E?f^g(6vLF1#_yEh--?p1EwnLm(f4_|b8m8JONRL}UHVtuV=od1_u z>gUJqm+zJTaO+{?!^T7ZLx1bS_IrQ3`N_>kC%dy(Kd*LYm-c>XcV|D?b6Izm?SG5+ z^6h?U{LZ^i09dVBq(6X3;0*d+xQXs+;}=Uuj>;^&wl|$*JpYF literal 0 HcmV?d00001 diff --git a/pycrosstalker/tools/__pycache__/lrobject.cpython-312.pyc b/pycrosstalker/tools/__pycache__/lrobject.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e1d21e7f6ee7c901d4cfd513a404580ec0ff2f3 GIT binary patch literal 2254 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 literal 0 HcmV?d00001 diff --git a/test/__pycache__/test_mpl.cpython-312-pytest-9.0.2.pyc b/test/__pycache__/test_mpl.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cbbe9f989c287e8dacbc294e8e6040c9b6dfdd5 GIT binary patch literal 4284 zcmc&%OKcm*8J=A(-!D}Lpg`R^2M0Yg#}vI3=tXPUFfn$}06qEU)CU(n^`BiXxmD!G z0s?fo{O5nq>^Jkz&i*|d4j{Px_{+`QuiXg!lL_|asWZ=7c!WMd5|TItr8u+Y3$6^$ zp@NWdbC$)E@|qT3$`38C1PZ}aux<;b!k}|0kwP@pV(J9oW2x4jbX$oOXQPFflT@%^t(mpIMNMIkH zD-}fb+|P#Q#zcwocxI{9ww#~7n!a>(C`0C(x~Xed>bfLPUEo1oprYYoIfFGqbWyo3 zV=5FyeeMGEC=hX8rd}+QlA@E06Ps2LT=0MPQ&`fUAiZJB*B4Ji0ZbmsVCSXVrGWCj zoiF?6x>66s5wq4Z1NE)Dz$tTyVGJl zAzQc=RDp7@@XKhKFL4#uvWtAG2Wp>-lY& zwRXwOBhv23&*p8%wT$d?!A{S8JKR8Qda4}s-yHRBzPz1PYQM!V!E9FqsYB{q7IK^^ zx%E!F2S=tZTi0xt8{3tg@mGN0B4AhHO(eNJBMA`>B)h&hBsqJ8--%?y6Oin3Jpca< zNxj=fJl|_`&9>sv`)p~MTlUynTgAKVUFS%j6qmYR8O6Bcd3RZl`fGMi4K$q*yCC%K z2tc(PaQ(h2q%m82n^&pll}F%w!rd@w%+4!g@~sHKq{o5$E;z!x)(-~X;peseq~2R@ zvzmRcT+Kc^)^6+7?5TLmD7pU~%uY`@41{{JSS-#F%w7=GlhG6n6Y4#$sXEparqHlN zE@1Y?dBR>NPuT8BeOOel=hQ5rzAIu@W>OaP>^fU#gtODh7V0+BW43uxUs2K1s#uUQ zL!SzAL0qIRMa}}z7N{_n%g)hIE~{!-PK!!$PGp8G^~$qiM%OU)&es{fn57|-5fwRI z*Z5UUlG7x&B-1dK^%7Rov$<>u%SrBqCr1*hrYE_jjzfdR^06dISegVAPbA@e55DYe z4Ms*zEJZ{@WUQMGW6Ysg9;3XtxOCZJ7*CSG4VD6!#3|Dkat|`iNRk{i6{EHfFm<2f zNisCCD3d@X8K}@ej^tE06{r~*dQtSG8xJsapvMtLjx#dK$T+|$Wb~o}hX**NFgP_m zoyp{=TV&@H>ME&(2F@1Cx=i%6h-oYh5GiRa7jZ@_6h$o45SY_5rJSNeuhgSx;6Z3t zn#^e>MKWE}Sw))>6?3MjKTX70nPs4n2@{i?rcPlDv(c8G)o?-7)AC|b5miwK3qESj zEPFis2Czv#J`4?p6D6WS*0+V=d^-6 zj7zF20MP;a1reRaC;l*!5a#rc&IaKZndK_t8 z%dO@fMiNFO@w?LR%fBt(?K1`@zDybem;QFm82I_tFWxf--hUk3w^m*)Z}b__M(FTn*$9o?Jz|7TeIXm6 z$uCnz=t`}g~?0+aU?+46kDYlzz!{eUNzdqA2+pN=ktDXy@ zZT7yXH!cL;iLeFpQ7l830zt{wa%P|$eVsKvyt3 z?Bfw82cQDkN>y?*umKR6#+nLP%jQnuvD$iZYDHP4+$?U# zWp%?76bR+6Q*ItMd*%TjIWz!euH=XeA2?Jn$I5Es4+#H+MP2~%!uM7|lS+zw8cQIu zR~`8`kf$z=bucQ67X#Y2ESJ<;M_0)&L@#?v?ORJYQVjo>znX2_2Seg3p;?0Xy z%@AIzCEsvJ8}o*6xCZrjWA(;Im46}5eP-2F<*Em2$9{a5|8wy3;1?5rid5Ze{#F0_ zu;F`sbKLM9xjk~v_X8NX`^?v&p6cY<<<-j@Q@7psLqpJ8ux0J!>dE!A5j?b+GlIuf lCZBi0D4+GVaR;C8x49RDy=4CqJJ);ur0cII-IH$be*pFemDB(L literal 0 HcmV?d00001 From d24623ec478621560a8c69b16c6ed698503702ed Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:08:19 +0000 Subject: [PATCH 3/3] Add tests for all plot functions in test/test_plots.py Co-authored-by: jsnagai <8943000+jsnagai@users.noreply.github.com> --- .gitignore | 3 + test/test_plots.py | 218 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 test/test_plots.py diff --git a/.gitignore b/.gitignore index 0137429..47d9520 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ test/test_check_with_R_data.py +__pycache__/ +**/__pycache__/ +*.pyc rawdata/snRNAseq_cellsWithSubtype.h5ad docs/source/notebooks/rawdata/snRNAseq_cellsWithSubtype.h5ad docs/source/notebooks/output/HMI_example/Human_Myocardial_Infarction_analysed.h5ad diff --git a/test/test_plots.py b/test/test_plots.py new file mode 100644 index 0000000..8d0b180 --- /dev/null +++ b/test/test_plots.py @@ -0,0 +1,218 @@ +import pandas as pd +import numpy as np +import scanpy as sc +from anndata import AnnData +import matplotlib +matplotlib.use("Agg") # headless backend +import matplotlib.pyplot as plt +from pycrosstalker import tools as cttl +from pycrosstalker import plots as ctpl + +# Load and analyse data once for all tests +with open("rawdata/humanBM.h5ad", "rb") as f: + paths = { + 'CTR': "rawdata/CTR_LR.csv", + 'EXP': "rawdata/EXP_LR.csv" + } + adata = sc.read_h5ad(f) + adata.uns['pycrosstalker'] = {} + adata.uns['pycrosstalker']['path'] = {} + for k, v in paths.items(): + adata.uns['pycrosstalker']['path'][k] = pd.read_csv(v) + adata = cttl.analise_LR(adata, save=False) + data = adata.uns['pycrosstalker']['results'] + +lrobj_tblPCA = { + 'pca': data['pca'], + 'rankings': data['rankings'], + 'tables': data['tables'], +} + + +def test_plot_cci(): + fig, ax = ctpl.plot.plot_cci( + graph=data["graphs"]["CTR"], + colors=data["colors"], + plt_name='Control', + coords=data["coords"], + emax=None, + leg=False, + low=0, + high=0, + ignore_alpha=False, + log=False, + efactor=6, + vfactor=12, + pg=data["rankings"]["CTR"]["Pagerank"], + scale_factor=2.0, + node_size=2.5, + return_figure=True + ) + assert fig is not None + assert ax is not None + assert isinstance(ax, plt.Axes) + plt.close("all") + + +def test_plot_cci_exp(): + fig, ax = ctpl.plot.plot_cci( + graph=data["graphs"]["EXP"], + colors=data["colors"], + plt_name='Experimental', + coords=data["coords"], + emax=None, + leg=False, + low=0, + high=0, + ignore_alpha=False, + log=True, + efactor=6, + vfactor=12, + pg=data["rankings"]["EXP"]["Pagerank"], + scale_factor=2.0, + node_size=2.5, + return_figure=True + ) + assert fig is not None + assert ax is not None + assert isinstance(ax, plt.Axes) + plt.close("all") + + +def test_plot_pca_LR_comparative_ggi(): + result = ctpl.plot.plot_pca_LR_comparative( + lrobj_tblPCA=lrobj_tblPCA, + pca_table='CTR_ggi', + dims=(1, 2), + ret=True, + ggi=True, + include_tf=False, + gene_types="all" + ) + assert result is not None + assert 'CTR_ggi' in result + plt.close("all") + + +def test_plot_pca_LR_comparative_no_ggi(): + result = ctpl.plot.plot_pca_LR_comparative( + lrobj_tblPCA=lrobj_tblPCA, + pca_table='CTR', + dims=(1, 2), + ret=True, + ggi=False + ) + assert result is not None + assert 'CTR' in result + plt.close("all") + + +def test_plot_bar_rankings_cci(): + ctpl.plot.plot_bar_rankings( + annData=adata, + table_name='EXP_x_CTR', + ranking='Pagerank', + type=None, + filter_sign=None, + mode='cci', + top_num=10 + ) + plt.close("all") + + +def test_plot_bar_rankings_cgi(): + ctpl.plot.plot_bar_rankings( + annData=adata, + table_name='EXP_x_CTR_ggi', + ranking='Pagerank', + type=None, + filter_sign=None, + mode='cgi', + top_num=10 + ) + plt.close("all") + + +def test_plot_bar_rankings_with_type_filter(): + result = ctpl.plot.plot_bar_rankings( + annData=adata, + table_name='EXP_x_CTR_ggi', + ranking='Pagerank', + type='LR', + filter_sign=None, + mode='cgi', + top_num=10 + ) + # May return "No entries" string if no matches, or None if plotted + assert result is None or isinstance(result, str) + plt.close("all") + + +def test_plot_sankey(): + ctpl.plot.plot_sankey( + lrobj_tbl=data['tables']['CTR'], + target=None, + ligand_cluster=None, + receptor_cluster=None, + plt_name='CTR Sankey', + threshold=50 + ) + plt.close("all") + + +def test_plot_sankey_with_target(): + # Use the first gene_B value from the CTR table as a receptor target + sample_gene = data['tables']['CTR']['gene_B'].iloc[0] + ctpl.plot.plot_sankey( + lrobj_tbl=data['tables']['CTR'], + target=sample_gene, + ligand_cluster=None, + receptor_cluster=None, + plt_name='Sankey with target', + threshold=50 + ) + plt.close("all") + + +def test_plot_volcane_fisher(): + stats_df = data['stats']['EXP_x_CTR'].copy() + ctpl.plot.plot_volcane( + df=stats_df, + method='fisher', + p_threshold=0.05, + fc_threshold=1, + figsize=(8, 6), + annot=True, + title='Volcano Plot (Fisher)' + ) + plt.close("all") + + +def test_plot_clustermap(): + ctpl.plot.plot_clustermap( + data=data['tables']['CTR'], + title='CTR Clustermap', + annot=True, + return_figure=False + ) + plt.close("all") + + +def test_plot_graph_clustermap(): + ctpl.plot.plot_graph_clustermap( + graph=data['graphs']['CTR'], + weight='LRScore', + title='CTR Graph Clustermap', + annot=True + ) + plt.close("all") + + +def test_plot_graph_clustermap_exp_x_ctr(): + ctpl.plot.plot_graph_clustermap( + graph=data['graphs']['EXP_x_CTR'], + weight='LRScore', + title='EXP_x_CTR Graph Clustermap', + annot=True + ) + plt.close("all")