From 1bc4cd45591dcce92c60b190c985f6b04a3d30b0 Mon Sep 17 00:00:00 2001 From: Zaf4 Date: Thu, 5 Mar 2026 13:20:20 +0300 Subject: [PATCH] restructure docs for deployment --- docs/{_build => }/.buildinfo | 2 +- docs/.doctrees/API.doctree | Bin 0 -> 35220 bytes .../_templates/autoapi/python/module.doctree | Bin 3813 -> 3815 bytes .../_templates/autosummary/table.doctree | Bin 2963 -> 2965 bytes .../{_build => }/.doctrees/environment.pickle | Bin 68197 -> 68196 bytes .../generated/cellestial.bar.doctree | Bin 42702 -> 42704 bytes .../generated/cellestial.boxplot.doctree | Bin 93592 -> 93594 bytes .../generated/cellestial.boxplots.doctree | Bin 149755 -> 149757 bytes .../generated/cellestial.build_frame.doctree | Bin 20046 -> 20048 bytes .../cellestial.cluster_outlines.doctree | Bin 21158 -> 21160 bytes .../generated/cellestial.dimensional.doctree | Bin 122770 -> 122772 bytes .../generated/cellestial.dimensionals.doctree | Bin 182241 -> 182243 bytes .../generated/cellestial.dotplot.doctree | Bin 60125 -> 60127 bytes .../generated/cellestial.expression.doctree | Bin 120963 -> 120965 bytes .../generated/cellestial.expressions.doctree | Bin 181764 -> 181766 bytes .../generated/cellestial.get_mapping.doctree | Bin 3932 -> 3934 bytes .../generated/cellestial.heatmap.doctree | Bin 27765 -> 27767 bytes .../generated/cellestial.pca.doctree | Bin 117719 -> 117721 bytes .../generated/cellestial.pcas.doctree | Bin 177128 -> 177130 bytes .../generated/cellestial.plot.doctree | Bin 177133 -> 177135 bytes .../generated/cellestial.retrieve.doctree | Bin 10212 -> 10214 bytes .../generated/cellestial.scatter.doctree | Bin 28230 -> 28232 bytes .../generated/cellestial.show_colors.doctree | Bin 3789 -> 3791 bytes .../generated/cellestial.slice.doctree | Bin 8694 -> 8696 bytes .../generated/cellestial.tsne.doctree | Bin 117742 -> 117744 bytes .../generated/cellestial.tsnes.doctree | Bin 177149 -> 177151 bytes .../generated/cellestial.umap.doctree | Bin 117742 -> 117744 bytes .../generated/cellestial.umaps.doctree | Bin 177149 -> 177151 bytes .../generated/cellestial.violin.doctree | Bin 93697 -> 93699 bytes .../generated/cellestial.violins.doctree | Bin 151969 -> 151971 bytes .../generated/cellestial.xyplot.doctree | Bin 44426 -> 44428 bytes .../generated/cellestial.xyplots.doctree | Bin 96885 -> 96887 bytes docs/{_build => }/.doctrees/index.doctree | Bin 7342526 -> 7342530 bytes .../.doctrees/performance.doctree | Bin 6181 -> 6183 bytes .../{_build => }/.doctrees/philosophy.doctree | Bin 12529 -> 12531 bytes docs/{_build => }/API.html | 2 +- docs/_build/.doctrees/API.doctree | Bin 35110 -> 0 bytes ...stial.single.basic.heatmap.heatmap.doctree | Bin 28155 -> 0 bytes ...stial.single.basic.scatter.scatter.doctree | Bin 28620 -> 0 bytes ...estial.single.common.xyplot.xyplot.doctree | Bin 44816 -> 0 bytes ...tial.single.common.xyplots.xyplots.doctree | Bin 97286 -> 0 bytes ...ingle.core.dimensional.dimensional.doctree | Bin 123193 -> 0 bytes ...l.single.core.distribution.boxplot.doctree | Bin 94026 -> 0 bytes ...al.single.core.distribution.violin.doctree | Bin 94131 -> 0 bytes ...single.core.distributions.boxplots.doctree | Bin 150200 -> 0 bytes ....single.core.distributions.violins.doctree | Bin 152414 -> 0 bytes ...gle.core.subdimensional.expression.doctree | Bin 121419 -> 0 bytes ...ial.single.core.subdimensional.pca.doctree | Bin 118175 -> 0 bytes ...al.single.core.subdimensional.tsne.doctree | Bin 118198 -> 0 bytes ...al.single.core.subdimensional.umap.doctree | Bin 118198 -> 0 bytes ....core.subdimensionals.dimensionals.doctree | Bin 182708 -> 0 bytes ...e.core.subdimensionals.expressions.doctree | Bin 182231 -> 0 bytes ...l.single.core.subdimensionals.pcas.doctree | Bin 177595 -> 0 bytes ....single.core.subdimensionals.tsnes.doctree | Bin 177616 -> 0 bytes ....single.core.subdimensionals.umaps.doctree | Bin 177616 -> 0 bytes ...ial.single.special.dotplot.dotplot.doctree | Bin 60537 -> 0 bytes ...cellestial.util.colors.show_colors.doctree | Bin 4095 -> 0 bytes .../cellestial.util.get_mapping.doctree | Bin 3972 -> 0 bytes ...lestial.util.utilities.get_mapping.doctree | Bin 4052 -> 0 bytes ...cellestial.util.utilities.retrieve.doctree | Bin 9929 -> 0 bytes .../cellestial.util.utilities.slice.doctree | Bin 8997 -> 0 bytes .../_modules/cellestial/frames/build.html | 679 ------- .../_modules/cellestial/layers/outline.html | 633 ------ .../_modules/cellestial/single/base/base.html | 546 ----- .../_modules/cellestial/single/basic/bar.html | 554 ----- .../cellestial/single/basic/heatmap.html | 516 ----- .../cellestial/single/basic/scatter.html | 519 ----- .../cellestial/single/common/xyplot.html | 579 ------ .../cellestial/single/common/xyplots.html | 610 ------ .../cellestial/single/core/dimensional.html | 744 ------- .../cellestial/single/core/distribution.html | 882 -------- .../cellestial/single/core/distributions.html | 885 -------- .../single/core/subdimensional.html | 1137 ----------- .../single/core/subdimensionals.html | 1789 ----------------- .../cellestial/single/special/dotplot.html | 613 ------ .../_modules/cellestial/util/colors.html | 517 ----- .../_modules/cellestial/util/utilities.html | 1079 ---------- docs/_build/_modules/index.html | 458 ----- ...stial.single.basic.heatmap.heatmap.rst.txt | 6 - ...stial.single.basic.scatter.scatter.rst.txt | 6 - ...estial.single.common.xyplot.xyplot.rst.txt | 6 - ...tial.single.common.xyplots.xyplots.rst.txt | 6 - ...ingle.core.dimensional.dimensional.rst.txt | 6 - ...l.single.core.distribution.boxplot.rst.txt | 6 - ...al.single.core.distribution.violin.rst.txt | 6 - ...single.core.distributions.boxplots.rst.txt | 6 - ....single.core.distributions.violins.rst.txt | 6 - ...gle.core.subdimensional.expression.rst.txt | 6 - ...ial.single.core.subdimensional.pca.rst.txt | 6 - ...al.single.core.subdimensional.tsne.rst.txt | 6 - ...al.single.core.subdimensional.umap.rst.txt | 6 - ....core.subdimensionals.dimensionals.rst.txt | 6 - ...e.core.subdimensionals.expressions.rst.txt | 6 - ...l.single.core.subdimensionals.pcas.rst.txt | 6 - ....single.core.subdimensionals.tsnes.rst.txt | 6 - ....single.core.subdimensionals.umaps.rst.txt | 6 - ...ial.single.special.dotplot.dotplot.rst.txt | 6 - ...cellestial.util.colors.show_colors.rst.txt | 6 - .../cellestial.util.get_mapping.rst.txt | 6 - ...lestial.util.utilities.get_mapping.rst.txt | 6 - ...cellestial.util.utilities.retrieve.rst.txt | 6 - .../cellestial.util.utilities.slice.rst.txt | 6 - ...llestial.single.basic.heatmap.heatmap.html | 494 ----- ...llestial.single.basic.scatter.scatter.html | 495 ----- ...ellestial.single.common.xyplot.xyplot.html | 498 ----- ...lestial.single.common.xyplots.xyplots.html | 534 ----- ...l.single.core.dimensional.dimensional.html | 575 ------ ...tial.single.core.distribution.boxplot.html | 540 ----- ...stial.single.core.distribution.violin.html | 540 ----- ...al.single.core.distributions.boxplots.html | 580 ------ ...ial.single.core.distributions.violins.html | 581 ------ ...single.core.subdimensional.expression.html | 574 ------ ...estial.single.core.subdimensional.pca.html | 573 ------ ...stial.single.core.subdimensional.tsne.html | 573 ------ ...stial.single.core.subdimensional.umap.html | 573 ------ ...gle.core.subdimensionals.dimensionals.html | 616 ------ ...ngle.core.subdimensionals.expressions.html | 615 ------ ...tial.single.core.subdimensionals.pcas.html | 614 ------ ...ial.single.core.subdimensionals.tsnes.html | 614 ------ ...ial.single.core.subdimensionals.umaps.html | 614 ------ ...estial.single.special.dotplot.dotplot.html | 501 ----- .../cellestial.util.colors.show_colors.html | 473 ----- .../cellestial.util.get_mapping.html | 473 ----- ...cellestial.util.utilities.get_mapping.html | 473 ----- .../cellestial.util.utilities.retrieve.html | 487 ----- .../cellestial.util.utilities.slice.html | 490 ----- docs/_build/searchindex.js | 1 - .../_images/breast_cancer_atlas_umap.png | Bin docs/{_build => }/_sources/API.rst.txt | 0 .../_templates/autoapi/python/module.rst.txt | 0 .../_templates/autosummary/table.rst.txt | 0 .../_sources/generated/cellestial.bar.rst.txt | 0 .../generated/cellestial.boxplot.rst.txt | 0 .../generated/cellestial.boxplots.rst.txt | 0 .../generated/cellestial.build_frame.rst.txt | 0 .../cellestial.cluster_outlines.rst.txt | 0 .../generated/cellestial.dimensional.rst.txt | 0 .../generated/cellestial.dimensionals.rst.txt | 0 .../generated/cellestial.dotplot.rst.txt | 0 .../generated/cellestial.expression.rst.txt | 0 .../generated/cellestial.expressions.rst.txt | 0 .../generated/cellestial.get_mapping.rst.txt | 0 .../generated/cellestial.heatmap.rst.txt | 0 .../_sources/generated/cellestial.pca.rst.txt | 0 .../generated/cellestial.pcas.rst.txt | 0 .../generated/cellestial.plot.rst.txt | 0 .../generated/cellestial.retrieve.rst.txt | 0 .../generated/cellestial.scatter.rst.txt | 0 .../generated/cellestial.show_colors.rst.txt | 0 .../generated/cellestial.slice.rst.txt | 0 .../generated/cellestial.tsne.rst.txt | 0 .../generated/cellestial.tsnes.rst.txt | 0 .../generated/cellestial.umap.rst.txt | 0 .../generated/cellestial.umaps.rst.txt | 0 .../generated/cellestial.violin.rst.txt | 0 .../generated/cellestial.violins.rst.txt | 0 .../generated/cellestial.xyplot.rst.txt | 0 .../generated/cellestial.xyplots.rst.txt | 0 docs/{_build => }/_sources/index.rst.txt | 0 .../{_build => }/_sources/performance.rst.txt | 0 docs/{_build => }/_sources/philosophy.rst.txt | 0 docs/{_build => }/_static/base-stemmer.js | 0 docs/{_build => }/_static/basic.css | 0 docs/{_build => }/_static/doctools.js | 0 .../_static/documentation_options.js | 0 docs/{_build => }/_static/english-stemmer.js | 0 docs/{_build => }/_static/file.png | Bin docs/{_build => }/_static/jupyter-sphinx.css | 0 docs/{_build => }/_static/language_data.js | 0 docs/{_build => }/_static/minus.png | Bin docs/{_build => }/_static/plus.png | Bin docs/{_build => }/_static/pygments.css | 0 .../{_build => }/_static/scripts/bootstrap.js | 0 .../_static/scripts/bootstrap.js.LICENSE.txt | 0 .../_static/scripts/bootstrap.js.map | 0 .../_static/scripts/fontawesome.js | 0 .../scripts/fontawesome.js.LICENSE.txt | 0 .../_static/scripts/fontawesome.js.map | 0 .../_static/scripts/pydata-sphinx-theme.js | 0 .../scripts/pydata-sphinx-theme.js.map | 0 docs/{_build => }/_static/searchtools.js | 0 docs/{_build => }/_static/sphinx_highlight.js | 0 .../_static/styles/pydata-sphinx-theme.css | 0 .../styles/pydata-sphinx-theme.css.map | 0 docs/{_build => }/_static/styles/theme.css | 0 .../fontawesome/webfonts/fa-brands-400.ttf | Bin .../fontawesome/webfonts/fa-brands-400.woff2 | Bin .../fontawesome/webfonts/fa-regular-400.ttf | Bin .../fontawesome/webfonts/fa-regular-400.woff2 | Bin .../fontawesome/webfonts/fa-solid-900.ttf | Bin .../fontawesome/webfonts/fa-solid-900.woff2 | Bin docs/{_build => }/_static/webpack-macros.html | 0 .../_templates/autoapi/python/module.html | 2 +- .../_templates/autosummary/table.html | 2 +- .../generated/cellestial.bar.html | 22 +- .../generated/cellestial.boxplot.html | 2 +- .../generated/cellestial.boxplots.html | 2 +- .../generated/cellestial.build_frame.html | 2 +- .../cellestial.cluster_outlines.html | 2 +- .../generated/cellestial.dimensional.html | 2 +- .../generated/cellestial.dimensionals.html | 2 +- .../generated/cellestial.dotplot.html | 2 +- .../generated/cellestial.expression.html | 2 +- .../generated/cellestial.expressions.html | 2 +- .../generated/cellestial.get_mapping.html | 2 +- .../generated/cellestial.heatmap.html | 2 +- .../generated/cellestial.pca.html | 2 +- .../generated/cellestial.pcas.html | 2 +- .../generated/cellestial.plot.html | 22 +- .../generated/cellestial.retrieve.html | 2 +- .../generated/cellestial.scatter.html | 2 +- .../generated/cellestial.show_colors.html | 2 +- .../generated/cellestial.slice.html | 2 +- .../generated/cellestial.tsne.html | 2 +- .../generated/cellestial.tsnes.html | 2 +- .../generated/cellestial.umap.html | 2 +- .../generated/cellestial.umaps.html | 2 +- .../generated/cellestial.violin.html | 2 +- .../generated/cellestial.violins.html | 2 +- .../generated/cellestial.xyplot.html | 2 +- .../generated/cellestial.xyplots.html | 2 +- docs/{_build => }/genindex.html | 2 +- docs/{_build => }/index.html | 2 +- docs/{_build => }/objects.inv | Bin docs/{_build => }/performance.html | 2 +- docs/{_build => }/philosophy.html | 2 +- docs/{_build => }/search.html | 2 +- docs/searchindex.js | 1 + .../generated/cellestial.bar.ipynb | 554 +++++ .../generated/cellestial.bar.py | 0 .../generated/cellestial.plot.ipynb | 574 ++++++ .../generated/cellestial.plot.py | 0 {docs => sphinx}/API.rst | 0 .../_static/breast_cancer_atlas_umap.png | Bin {docs/_build => sphinx}/_static/custom.css | 0 {docs/_build => sphinx}/_static/custom.js | 0 .../_static/overall.ggtb.html | 0 {docs/_build => sphinx}/_static/pypi.svg | 0 .../_templates/autoapi/python/module.rst | 0 .../_templates/autosummary/table.rst | 0 {docs => sphinx}/conf.py | 0 {docs => sphinx}/generated/cellestial.bar.rst | 0 .../generated/cellestial.boxplot.rst | 0 .../generated/cellestial.boxplots.rst | 0 .../generated/cellestial.build_frame.rst | 0 .../generated/cellestial.cluster_outlines.rst | 0 .../generated/cellestial.dimensional.rst | 0 .../generated/cellestial.dimensionals.rst | 0 .../generated/cellestial.dotplot.rst | 0 .../generated/cellestial.expression.rst | 0 .../generated/cellestial.expressions.rst | 0 .../generated/cellestial.get_mapping.rst | 0 .../generated/cellestial.heatmap.rst | 0 {docs => sphinx}/generated/cellestial.pca.rst | 0 .../generated/cellestial.pcas.rst | 0 .../generated/cellestial.plot.rst | 0 .../generated/cellestial.retrieve.rst | 0 .../generated/cellestial.scatter.rst | 0 .../generated/cellestial.show_colors.rst | 0 .../generated/cellestial.slice.rst | 0 .../generated/cellestial.tsne.rst | 0 .../generated/cellestial.tsnes.rst | 0 .../generated/cellestial.umap.rst | 0 .../generated/cellestial.umaps.rst | 0 .../generated/cellestial.violin.rst | 0 .../generated/cellestial.violins.rst | 0 .../generated/cellestial.xyplot.rst | 0 .../generated/cellestial.xyplots.rst | 0 {docs => sphinx}/index.rst | 0 .../jupyter_execute/generated/bar.ipynb | 0 .../jupyter_execute/generated/bar.py | 0 .../generated/cellestial.bar.ipynb | 0 .../generated/cellestial.bar.py | 38 + .../generated/cellestial.plot.ipynb | 0 .../generated/cellestial.plot.py | 39 + .../cellestial.single.basic.bar.bar.ipynb | 0 .../cellestial.single.basic.bar.bar.py | 0 .../jupyter_execute/generated/plot.ipynb | 0 .../jupyter_execute/generated/plot.py | 0 {docs => sphinx}/performance.rst | 0 {docs => sphinx}/philosophy.rst | 0 {docs => sphinx}/requirements.txt | 0 282 files changed, 1262 insertions(+), 26041 deletions(-) rename docs/{_build => }/.buildinfo (82%) create mode 100644 docs/.doctrees/API.doctree rename docs/{_build => }/.doctrees/_templates/autoapi/python/module.doctree (95%) rename docs/{_build => }/.doctrees/_templates/autosummary/table.doctree (94%) rename docs/{_build => }/.doctrees/environment.pickle (73%) rename docs/{_build => }/.doctrees/generated/cellestial.bar.doctree (94%) rename docs/{_build => }/.doctrees/generated/cellestial.boxplot.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.boxplots.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.build_frame.doctree (91%) rename docs/{_build => }/.doctrees/generated/cellestial.cluster_outlines.doctree (96%) rename docs/{_build => }/.doctrees/generated/cellestial.dimensional.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.dimensionals.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.dotplot.doctree (96%) rename docs/{_build => }/.doctrees/generated/cellestial.expression.doctree (98%) rename docs/{_build => }/.doctrees/generated/cellestial.expressions.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.get_mapping.doctree (79%) rename docs/{_build => }/.doctrees/generated/cellestial.heatmap.doctree (93%) rename docs/{_build => }/.doctrees/generated/cellestial.pca.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.pcas.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.plot.doctree (98%) rename docs/{_build => }/.doctrees/generated/cellestial.retrieve.doctree (87%) rename docs/{_build => }/.doctrees/generated/cellestial.scatter.doctree (93%) rename docs/{_build => }/.doctrees/generated/cellestial.show_colors.doctree (78%) rename docs/{_build => }/.doctrees/generated/cellestial.slice.doctree (92%) rename docs/{_build => }/.doctrees/generated/cellestial.tsne.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.tsnes.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.umap.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.umaps.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.violin.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.violins.doctree (97%) rename docs/{_build => }/.doctrees/generated/cellestial.xyplot.doctree (95%) rename docs/{_build => }/.doctrees/generated/cellestial.xyplots.doctree (97%) rename docs/{_build => }/.doctrees/index.doctree (99%) rename docs/{_build => }/.doctrees/performance.doctree (94%) rename docs/{_build => }/.doctrees/philosophy.doctree (96%) rename docs/{_build => }/API.html (99%) delete mode 100644 docs/_build/.doctrees/API.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.basic.heatmap.heatmap.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.basic.scatter.scatter.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.common.xyplot.xyplot.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.common.xyplots.xyplots.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.dimensional.dimensional.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.distribution.boxplot.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.distribution.violin.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.distributions.boxplots.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.distributions.violins.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.subdimensional.expression.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.subdimensional.pca.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.subdimensional.tsne.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.subdimensional.umap.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.dimensionals.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.expressions.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.pcas.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.tsnes.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.umaps.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.single.special.dotplot.dotplot.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.util.colors.show_colors.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.util.get_mapping.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.util.utilities.get_mapping.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.util.utilities.retrieve.doctree delete mode 100644 docs/_build/.doctrees/generated/cellestial.util.utilities.slice.doctree delete mode 100644 docs/_build/_modules/cellestial/frames/build.html delete mode 100644 docs/_build/_modules/cellestial/layers/outline.html delete mode 100644 docs/_build/_modules/cellestial/single/base/base.html delete mode 100644 docs/_build/_modules/cellestial/single/basic/bar.html delete mode 100644 docs/_build/_modules/cellestial/single/basic/heatmap.html delete mode 100644 docs/_build/_modules/cellestial/single/basic/scatter.html delete mode 100644 docs/_build/_modules/cellestial/single/common/xyplot.html delete mode 100644 docs/_build/_modules/cellestial/single/common/xyplots.html delete mode 100644 docs/_build/_modules/cellestial/single/core/dimensional.html delete mode 100644 docs/_build/_modules/cellestial/single/core/distribution.html delete mode 100644 docs/_build/_modules/cellestial/single/core/distributions.html delete mode 100644 docs/_build/_modules/cellestial/single/core/subdimensional.html delete mode 100644 docs/_build/_modules/cellestial/single/core/subdimensionals.html delete mode 100644 docs/_build/_modules/cellestial/single/special/dotplot.html delete mode 100644 docs/_build/_modules/cellestial/util/colors.html delete mode 100644 docs/_build/_modules/cellestial/util/utilities.html delete mode 100644 docs/_build/_modules/index.html delete mode 100644 docs/_build/_sources/generated/cellestial.single.basic.heatmap.heatmap.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.basic.scatter.scatter.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.common.xyplot.xyplot.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.common.xyplots.xyplots.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.dimensional.dimensional.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.distribution.boxplot.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.distribution.violin.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.distributions.boxplots.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.distributions.violins.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.subdimensional.expression.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.subdimensional.pca.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.subdimensional.tsne.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.subdimensional.umap.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.subdimensionals.dimensionals.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.subdimensionals.expressions.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.subdimensionals.pcas.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.subdimensionals.tsnes.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.core.subdimensionals.umaps.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.single.special.dotplot.dotplot.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.util.colors.show_colors.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.util.get_mapping.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.util.utilities.get_mapping.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.util.utilities.retrieve.rst.txt delete mode 100644 docs/_build/_sources/generated/cellestial.util.utilities.slice.rst.txt delete mode 100644 docs/_build/generated/cellestial.single.basic.heatmap.heatmap.html delete mode 100644 docs/_build/generated/cellestial.single.basic.scatter.scatter.html delete mode 100644 docs/_build/generated/cellestial.single.common.xyplot.xyplot.html delete mode 100644 docs/_build/generated/cellestial.single.common.xyplots.xyplots.html delete mode 100644 docs/_build/generated/cellestial.single.core.dimensional.dimensional.html delete mode 100644 docs/_build/generated/cellestial.single.core.distribution.boxplot.html delete mode 100644 docs/_build/generated/cellestial.single.core.distribution.violin.html delete mode 100644 docs/_build/generated/cellestial.single.core.distributions.boxplots.html delete mode 100644 docs/_build/generated/cellestial.single.core.distributions.violins.html delete mode 100644 docs/_build/generated/cellestial.single.core.subdimensional.expression.html delete mode 100644 docs/_build/generated/cellestial.single.core.subdimensional.pca.html delete mode 100644 docs/_build/generated/cellestial.single.core.subdimensional.tsne.html delete mode 100644 docs/_build/generated/cellestial.single.core.subdimensional.umap.html delete mode 100644 docs/_build/generated/cellestial.single.core.subdimensionals.dimensionals.html delete mode 100644 docs/_build/generated/cellestial.single.core.subdimensionals.expressions.html delete mode 100644 docs/_build/generated/cellestial.single.core.subdimensionals.pcas.html delete mode 100644 docs/_build/generated/cellestial.single.core.subdimensionals.tsnes.html delete mode 100644 docs/_build/generated/cellestial.single.core.subdimensionals.umaps.html delete mode 100644 docs/_build/generated/cellestial.single.special.dotplot.dotplot.html delete mode 100644 docs/_build/generated/cellestial.util.colors.show_colors.html delete mode 100644 docs/_build/generated/cellestial.util.get_mapping.html delete mode 100644 docs/_build/generated/cellestial.util.utilities.get_mapping.html delete mode 100644 docs/_build/generated/cellestial.util.utilities.retrieve.html delete mode 100644 docs/_build/generated/cellestial.util.utilities.slice.html delete mode 100644 docs/_build/searchindex.js rename docs/{_build => }/_images/breast_cancer_atlas_umap.png (100%) rename docs/{_build => }/_sources/API.rst.txt (100%) rename docs/{_build => }/_sources/_templates/autoapi/python/module.rst.txt (100%) rename docs/{_build => }/_sources/_templates/autosummary/table.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.bar.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.boxplot.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.boxplots.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.build_frame.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.cluster_outlines.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.dimensional.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.dimensionals.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.dotplot.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.expression.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.expressions.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.get_mapping.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.heatmap.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.pca.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.pcas.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.plot.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.retrieve.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.scatter.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.show_colors.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.slice.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.tsne.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.tsnes.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.umap.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.umaps.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.violin.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.violins.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.xyplot.rst.txt (100%) rename docs/{_build => }/_sources/generated/cellestial.xyplots.rst.txt (100%) rename docs/{_build => }/_sources/index.rst.txt (100%) rename docs/{_build => }/_sources/performance.rst.txt (100%) rename docs/{_build => }/_sources/philosophy.rst.txt (100%) rename docs/{_build => }/_static/base-stemmer.js (100%) rename docs/{_build => }/_static/basic.css (100%) rename docs/{_build => }/_static/doctools.js (100%) rename docs/{_build => }/_static/documentation_options.js (100%) rename docs/{_build => }/_static/english-stemmer.js (100%) rename docs/{_build => }/_static/file.png (100%) rename docs/{_build => }/_static/jupyter-sphinx.css (100%) rename docs/{_build => }/_static/language_data.js (100%) rename docs/{_build => }/_static/minus.png (100%) rename docs/{_build => }/_static/plus.png (100%) rename docs/{_build => }/_static/pygments.css (100%) rename docs/{_build => }/_static/scripts/bootstrap.js (100%) rename docs/{_build => }/_static/scripts/bootstrap.js.LICENSE.txt (100%) rename docs/{_build => }/_static/scripts/bootstrap.js.map (100%) rename docs/{_build => }/_static/scripts/fontawesome.js (100%) rename docs/{_build => }/_static/scripts/fontawesome.js.LICENSE.txt (100%) rename docs/{_build => }/_static/scripts/fontawesome.js.map (100%) rename docs/{_build => }/_static/scripts/pydata-sphinx-theme.js (100%) rename docs/{_build => }/_static/scripts/pydata-sphinx-theme.js.map (100%) rename docs/{_build => }/_static/searchtools.js (100%) rename docs/{_build => }/_static/sphinx_highlight.js (100%) rename docs/{_build => }/_static/styles/pydata-sphinx-theme.css (100%) rename docs/{_build => }/_static/styles/pydata-sphinx-theme.css.map (100%) rename docs/{_build => }/_static/styles/theme.css (100%) rename docs/{_build => }/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf (100%) rename docs/{_build => }/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2 (100%) rename docs/{_build => }/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf (100%) rename docs/{_build => }/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2 (100%) rename docs/{_build => }/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf (100%) rename docs/{_build => }/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2 (100%) rename docs/{_build => }/_static/webpack-macros.html (100%) rename docs/{_build => }/_templates/autoapi/python/module.html (99%) rename docs/{_build => }/_templates/autosummary/table.html (99%) rename docs/{_build => }/generated/cellestial.bar.html (98%) rename docs/{_build => }/generated/cellestial.boxplot.html (99%) rename docs/{_build => }/generated/cellestial.boxplots.html (99%) rename docs/{_build => }/generated/cellestial.build_frame.html (99%) rename docs/{_build => }/generated/cellestial.cluster_outlines.html (99%) rename docs/{_build => }/generated/cellestial.dimensional.html (99%) rename docs/{_build => }/generated/cellestial.dimensionals.html (99%) rename docs/{_build => }/generated/cellestial.dotplot.html (99%) rename docs/{_build => }/generated/cellestial.expression.html (99%) rename docs/{_build => }/generated/cellestial.expressions.html (99%) rename docs/{_build => }/generated/cellestial.get_mapping.html (99%) rename docs/{_build => }/generated/cellestial.heatmap.html (99%) rename docs/{_build => }/generated/cellestial.pca.html (99%) rename docs/{_build => }/generated/cellestial.pcas.html (99%) rename docs/{_build => }/generated/cellestial.plot.html (99%) rename docs/{_build => }/generated/cellestial.retrieve.html (99%) rename docs/{_build => }/generated/cellestial.scatter.html (99%) rename docs/{_build => }/generated/cellestial.show_colors.html (99%) rename docs/{_build => }/generated/cellestial.slice.html (99%) rename docs/{_build => }/generated/cellestial.tsne.html (99%) rename docs/{_build => }/generated/cellestial.tsnes.html (99%) rename docs/{_build => }/generated/cellestial.umap.html (99%) rename docs/{_build => }/generated/cellestial.umaps.html (99%) rename docs/{_build => }/generated/cellestial.violin.html (99%) rename docs/{_build => }/generated/cellestial.violins.html (99%) rename docs/{_build => }/generated/cellestial.xyplot.html (99%) rename docs/{_build => }/generated/cellestial.xyplots.html (99%) rename docs/{_build => }/genindex.html (99%) rename docs/{_build => }/index.html (99%) rename docs/{_build => }/objects.inv (100%) rename docs/{_build => }/performance.html (99%) rename docs/{_build => }/philosophy.html (99%) rename docs/{_build => }/search.html (99%) create mode 100644 docs/searchindex.js create mode 100644 jupyter_execute/generated/cellestial.bar.ipynb rename {docs/jupyter_execute => jupyter_execute}/generated/cellestial.bar.py (100%) create mode 100644 jupyter_execute/generated/cellestial.plot.ipynb rename {docs/jupyter_execute => jupyter_execute}/generated/cellestial.plot.py (100%) rename {docs => sphinx}/API.rst (100%) rename {docs/_build => sphinx}/_static/breast_cancer_atlas_umap.png (100%) rename {docs/_build => sphinx}/_static/custom.css (100%) rename {docs/_build => sphinx}/_static/custom.js (100%) rename {docs/_build => sphinx}/_static/overall.ggtb.html (100%) rename {docs/_build => sphinx}/_static/pypi.svg (100%) rename {docs => sphinx}/_templates/autoapi/python/module.rst (100%) rename {docs => sphinx}/_templates/autosummary/table.rst (100%) rename {docs => sphinx}/conf.py (100%) rename {docs => sphinx}/generated/cellestial.bar.rst (100%) rename {docs => sphinx}/generated/cellestial.boxplot.rst (100%) rename {docs => sphinx}/generated/cellestial.boxplots.rst (100%) rename {docs => sphinx}/generated/cellestial.build_frame.rst (100%) rename {docs => sphinx}/generated/cellestial.cluster_outlines.rst (100%) rename {docs => sphinx}/generated/cellestial.dimensional.rst (100%) rename {docs => sphinx}/generated/cellestial.dimensionals.rst (100%) rename {docs => sphinx}/generated/cellestial.dotplot.rst (100%) rename {docs => sphinx}/generated/cellestial.expression.rst (100%) rename {docs => sphinx}/generated/cellestial.expressions.rst (100%) rename {docs => sphinx}/generated/cellestial.get_mapping.rst (100%) rename {docs => sphinx}/generated/cellestial.heatmap.rst (100%) rename {docs => sphinx}/generated/cellestial.pca.rst (100%) rename {docs => sphinx}/generated/cellestial.pcas.rst (100%) rename {docs => sphinx}/generated/cellestial.plot.rst (100%) rename {docs => sphinx}/generated/cellestial.retrieve.rst (100%) rename {docs => sphinx}/generated/cellestial.scatter.rst (100%) rename {docs => sphinx}/generated/cellestial.show_colors.rst (100%) rename {docs => sphinx}/generated/cellestial.slice.rst (100%) rename {docs => sphinx}/generated/cellestial.tsne.rst (100%) rename {docs => sphinx}/generated/cellestial.tsnes.rst (100%) rename {docs => sphinx}/generated/cellestial.umap.rst (100%) rename {docs => sphinx}/generated/cellestial.umaps.rst (100%) rename {docs => sphinx}/generated/cellestial.violin.rst (100%) rename {docs => sphinx}/generated/cellestial.violins.rst (100%) rename {docs => sphinx}/generated/cellestial.xyplot.rst (100%) rename {docs => sphinx}/generated/cellestial.xyplots.rst (100%) rename {docs => sphinx}/index.rst (100%) rename {docs => sphinx}/jupyter_execute/generated/bar.ipynb (100%) rename {docs => sphinx}/jupyter_execute/generated/bar.py (100%) rename {docs => sphinx}/jupyter_execute/generated/cellestial.bar.ipynb (100%) create mode 100644 sphinx/jupyter_execute/generated/cellestial.bar.py rename {docs => sphinx}/jupyter_execute/generated/cellestial.plot.ipynb (100%) create mode 100644 sphinx/jupyter_execute/generated/cellestial.plot.py rename {docs => sphinx}/jupyter_execute/generated/cellestial.single.basic.bar.bar.ipynb (100%) rename {docs => sphinx}/jupyter_execute/generated/cellestial.single.basic.bar.bar.py (100%) rename {docs => sphinx}/jupyter_execute/generated/plot.ipynb (100%) rename {docs => sphinx}/jupyter_execute/generated/plot.py (100%) rename {docs => sphinx}/performance.rst (100%) rename {docs => sphinx}/philosophy.rst (100%) rename {docs => sphinx}/requirements.txt (100%) diff --git a/docs/_build/.buildinfo b/docs/.buildinfo similarity index 82% rename from docs/_build/.buildinfo rename to docs/.buildinfo index 2ee6bc0..6156fea 100644 --- a/docs/_build/.buildinfo +++ b/docs/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file records the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 4792b90aaabe1bc12f6c363042ea2904 +config: eccfebbc014599d7fc95e4d18dc2318f tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/.doctrees/API.doctree b/docs/.doctrees/API.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a0e4d1b1bee670ee16e31b8cc65b335df99e5203 GIT binary patch literal 35220 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 literal 0 HcmV?d00001 diff --git a/docs/_build/.doctrees/_templates/autoapi/python/module.doctree b/docs/.doctrees/_templates/autoapi/python/module.doctree similarity index 95% rename from docs/_build/.doctrees/_templates/autoapi/python/module.doctree rename to docs/.doctrees/_templates/autoapi/python/module.doctree index d81f6ccd4b31b45f67e2998a1ef05d2cee2cf74a..e67b1f2fad3e310b0bfffb08d37918c4966992bb 100644 GIT binary patch delta 31 ncmaDV`&^c#fpzMgjVzUnjBbmxbh0> delta 29 lcmaDZ`&5>tfpzMwjVzUnj4qSw7^PWK@{@}<&u8@D1puL*3H1N~ diff --git a/docs/_build/.doctrees/_templates/autosummary/table.doctree b/docs/.doctrees/_templates/autosummary/table.doctree similarity index 94% rename from docs/_build/.doctrees/_templates/autosummary/table.doctree rename to docs/.doctrees/_templates/autosummary/table.doctree index 852fd4923d0bf3f3286014d8924dd565f16f66e6..a600845d3808168f8b06e9a98e60b1f43585c4ba 100644 GIT binary patch delta 31 ncmbO%K2@Bhfpu!vMwTB;j82pPGD)))7i47SRcw}FF6RIMtd$Cn delta 29 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 W=2SAK*+1Wn^>AV4{fi}b-{t={VE)|z delta 4601 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 diff --git a/docs/_build/.doctrees/generated/cellestial.bar.doctree b/docs/.doctrees/generated/cellestial.bar.doctree similarity index 94% rename from docs/_build/.doctrees/generated/cellestial.bar.doctree rename to docs/.doctrees/generated/cellestial.bar.doctree index ef021c6f8b42ef56f353ee0d994c13b6d41f49b1..7cf0f324db5d51069c9507bc177b8ba9bb3db935 100644 GIT binary patch delta 218 zcmX?img&M-CYA=)sYf@m7&0o^>4z4l78UDPC8n9^r=*tYC#UA*q!yQCCg$iD7i47S zRcsDroS)8Clw6hK6R`PL#$RSAd-C5LPnfVzt~4WyNlH@U32SHAqdHoS$dF3}jCJ W-_^wCQskfOZv-(F%6`-PL;?UhFH#Ty diff --git a/docs/_build/.doctrees/generated/cellestial.boxplot.doctree b/docs/.doctrees/generated/cellestial.boxplot.doctree similarity index 97% rename from docs/_build/.doctrees/generated/cellestial.boxplot.doctree rename to docs/.doctrees/generated/cellestial.boxplot.doctree index 3d16e8aa51a9074241034d898486231050ec1765..3259262e421614e69dd86cc38b17cf89aff7de90 100644 GIT binary patch delta 37 tcmbPnn|0Q0R+a|Vsg)a9EEyS{COb4svlSO)Wad>g$1-k@Wn{F@0Ra2<3~K-Y delta 35 rcmbPrn{~!*R+a|VspT74EEyRcCfhMev!vuF7dOWANsSF!gtQi@dCp$1ovlSO)Wad?Dj%Qr;k8>&`10w?nOm`4r)Shm~ n#VEAZpYh0l&Z+l3z~T(k4X-dtOx0!*p5AbsQF&_?(?kydeySOk delta 83 zcmex6k@NRNPL>ANshS&EtQi>{Cp$1ov!vuF7jI5vT=j4IZ(&Al&Z&$Hj0_;K)t>R% l|LFzi86~EgF$uFz-Qocfovyf#QGWXT>x^t$bC@Q2003!58b|;D diff --git a/docs/_build/.doctrees/generated/cellestial.build_frame.doctree b/docs/.doctrees/generated/cellestial.build_frame.doctree similarity index 91% rename from docs/_build/.doctrees/generated/cellestial.build_frame.doctree rename to docs/.doctrees/generated/cellestial.build_frame.doctree index c01707153b3b1ed2f879e018188730978cb69ba5..96fb6841552859e76e29a63c561400d27a7e085a 100644 GIT binary patch delta 55 zcmX>%hw;K3MwSNFsjeGYoEeqe^h1kNi;DHD64OldQ&P+HlT&kYQj1G66La*73oc&oEa5d^h1kNi;DHD64OldQ&P+HlT&kYQj1G66La)a@{@}< JXEHwb0RZ^&6Jr1X diff --git a/docs/_build/.doctrees/generated/cellestial.cluster_outlines.doctree b/docs/.doctrees/generated/cellestial.cluster_outlines.doctree similarity index 96% rename from docs/_build/.doctrees/generated/cellestial.cluster_outlines.doctree rename to docs/.doctrees/generated/cellestial.cluster_outlines.doctree index 764a98c9850ff552dc47f95fb26c2f971c756dd5..48e12ab6b24bdefc80f9e4e876788689152c305d 100644 GIT binary patch delta 55 zcmZ3slySvUMwSNFsdG27_%bSa>xUMn78UDPC8n9^r=*tYC#UA*q!yQCCg$iD7i47S LRctO~Gz|m*CJ+W3Dm78UDPC8n9^r=*tYC#UA*q!yQCCg$j;Ewn7A2OXrsz*j@RHs9W=+XYF4mtMvsj_IgK>KYBO}i}0378F-2eap diff --git a/docs/_build/.doctrees/generated/cellestial.dimensionals.doctree b/docs/.doctrees/generated/cellestial.dimensionals.doctree similarity index 97% rename from docs/_build/.doctrees/generated/cellestial.dimensionals.doctree rename to docs/.doctrees/generated/cellestial.dimensionals.doctree index 26b04351dd5b39a9cf0da403923877409361909a..c04425f0f699a32a0734a1fb717c94256bc0561f 100644 GIT binary patch delta 55 zcmaFZ&;7Wco27wuD&s~LXGTW%=?n51rP+!LGBWcjHm5T#{>L*_nt_o41hR5uTg4c+ JiZPu&4gmUC5h4Hp delta 53 zcmaFd&;78Uo27wuD$7O|XGTWX>4pxB(kvb%-H@eS22&3T*0M#iJumAu6 diff --git a/docs/_build/.doctrees/generated/cellestial.expressions.doctree b/docs/.doctrees/generated/cellestial.expressions.doctree similarity index 97% rename from docs/_build/.doctrees/generated/cellestial.expressions.doctree rename to docs/.doctrees/generated/cellestial.expressions.doctree index 4a0b17b086efce786083ea59c8094071434b7677..b5045d81d748360acee11cfcb6b135a5e20594b7 100644 GIT binary patch delta 47 zcmZqa;cn~UW@%uZ%CV8fk&)4D`bHl{Y4+lRjLf_W{mERP6`I=^+uIl!x3@7e)g1u< DVnz>W delta 45 zcmZqc;cn^SW@%uZ%C?ckk&)45`aB0lY1Wkdg{iCi}mZW-l(t$jqzIpR6}qVsjqj?0-B{kDg`#gRFR= Kt)h&FP6GflV-tJ; delta 53 zcmcaPo&EZBc9sU#smvQ$3>g`1CI`NjW=+XYF4muHFk51C0psj{lN~OyvQIs5ngIy5 JiZdQM4FCbs6IK8K diff --git a/docs/_build/.doctrees/generated/cellestial.pcas.doctree b/docs/.doctrees/generated/cellestial.pcas.doctree similarity index 97% rename from docs/_build/.doctrees/generated/cellestial.pcas.doctree rename to docs/.doctrees/generated/cellestial.pcas.doctree index ce3121a951a53d149762c582cdfe1fa7af75fab0..ec488894c869282220ecc36a0c8be0815afc1d5e 100644 GIT binary patch delta 64 zcmaFyoa@zdt_|jljP{copG&h97i47SRcsDt-29JoDkB3U0|-n%$jNB1)tT|)f9|QL QH-m*3GFZ3DGo9QF02X`}CjbBd delta 70 zcmaF$oa@DNt_|jljJDGY6B(shQ}UCG^(WtXCAqnnapphn*eO#P85kKrVEV>7M!l`B Wj2HiNXRuB^xfv|TuvL-iiCT delta 205 zcmaF=oa^m#E|vz?snr`*f7P`As$tyz JtA^>T834O>OdkLM diff --git a/docs/_build/.doctrees/generated/cellestial.retrieve.doctree b/docs/.doctrees/generated/cellestial.retrieve.doctree similarity index 87% rename from docs/_build/.doctrees/generated/cellestial.retrieve.doctree rename to docs/.doctrees/generated/cellestial.retrieve.doctree index d687a605aa76b716cd644d39e83d6ef1d838e1d0..34fed38ae929be733fc85cee9a2fe18e49f5681e 100644 GIT binary patch delta 31 ncmaFj|IDAIfpzNbjV#uTjLwrC7^T^Y3ordtR2MfpzMUjV#WLjBbvdsddEfpzMkjV#WLj4qQMnWR}#@{@}SEiU0rr delta 34 qcmez2{LPuAfpzNZjVz{&jCPYBvPiS0)s%7fX#j5J71RI# diff --git a/docs/_build/.doctrees/generated/cellestial.tsnes.doctree b/docs/.doctrees/generated/cellestial.tsnes.doctree similarity index 97% rename from docs/_build/.doctrees/generated/cellestial.tsnes.doctree rename to docs/.doctrees/generated/cellestial.tsnes.doctree index bd352b94536046184b6d19d72e3f04c3981c9ce4..0fa84da153e71707923b2542218832e741291984 100644 GIT binary patch delta 74 zcmezSoa_H{E|vz?sf-(0Oc@y+rZ*-sO0yLgWMt-5Y>s5y_>Xfc0|O%i2uwf7$!NXR akMZb#zNrs4gM}C}ShJ4FY*l2svl#%lFc@|K delta 75 zcmezWoa^s%E|vz?smvQ$Oc@#NrVAJ{O0%ToCl_yyX59FX*RM1waVj$dBLfIbR{UhX cHGuKxf4&UXtYb0^3{!7y28nM~X1cQ(0K9P+t^fc4 diff --git a/docs/_build/.doctrees/generated/cellestial.umap.doctree b/docs/.doctrees/generated/cellestial.umap.doctree similarity index 97% rename from docs/_build/.doctrees/generated/cellestial.umap.doctree rename to docs/.doctrees/generated/cellestial.umap.doctree index 22e2f4ddf277afaa0c888caf195d3208833969c5..f06d0d04dab2008047ac4195f4273e2a58342819 100644 GIT binary patch delta 53 zcmaDio&Cdfc9sU#sSF!gj2Rj2CqK9(%~o8Hk(pPqIh=9RKhCLlPBVbPbVW%<#jVDS HyH5iE6I~L- delta 57 zcmew`o&DW(c9sU#smvQ$j2RhiC)d7_W=+XYF4muHGh1?VG2@JXlh@y6WuJQeGy@P! N7F;2>)s%7fX#j5J71RI# diff --git a/docs/_build/.doctrees/generated/cellestial.umaps.doctree b/docs/.doctrees/generated/cellestial.umaps.doctree similarity index 97% rename from docs/_build/.doctrees/generated/cellestial.umaps.doctree rename to docs/.doctrees/generated/cellestial.umaps.doctree index 04b600cf9b612b8dd4c9ae67e68fabc6afd24c2c..dd3e992ae36c26ae245911a9a18c57cab9013e56 100644 GIT binary patch delta 74 zcmezSoa_H{E|vz?sf-(0Oc@y+rZ*-sO0yLgWMt-5Y>s5y_>Xfc0|O%i2uwf7$!NXR akMZb#zNrs4gM}C}ShJ4FY*l2svl#%lFc@|K delta 75 zcmezWoa^s%E|vz?smvQ$Oc@#NrVAJ{O0%ToCl_yyX59FX*RM1waVj$dBLfIbR{UhX cHGuKxf4&UXtYb0^3{!7y28nM~X1cQ(0K9P+t^fc4 diff --git a/docs/_build/.doctrees/generated/cellestial.violin.doctree b/docs/.doctrees/generated/cellestial.violin.doctree similarity index 97% rename from docs/_build/.doctrees/generated/cellestial.violin.doctree rename to docs/.doctrees/generated/cellestial.violin.doctree index 48e51fe68d8f3ba482f81e1cebe3960228ce771b..0f485428137ee9b9b9914d1b74c14dd76f36a4b6 100644 GIT binary patch delta 37 tcmZp?!`gg@m8F4o>bi|A=8TMvlRqAoW-Bhp$jqx~j%M5*&B(Yc2LKJ44aooi delta 35 rcmZp^!`gUY9x#=8TN?lO3C-SyJ+oi<@H^x5qLvF3SM`-@gmy diff --git a/docs/_build/.doctrees/generated/cellestial.violins.doctree b/docs/.doctrees/generated/cellestial.violins.doctree similarity index 97% rename from docs/_build/.doctrees/generated/cellestial.violins.doctree rename to docs/.doctrees/generated/cellestial.violins.doctree index 14edfb41a5eed914baf144f6b869688cb6bcde31..10beb73de88c48d06342b3ff6e5590779d90681f 100644 GIT binary patch delta 71 zcmZ3um~-)BPL>ANsf-(0EEyS{CfhMevlSO)Wad?Dj%8f?k8>&u10w?nOc!8e6y2)9 W`2Iip)W$%t2;&Y$k*!8d`GElG$`jxK delta 73 zcmZ3ym~-J`PL>ANscairEEyRcCfhMev!vuF7jKSdT>DQTt45ZAp)_eKBLgD?2yB&M Y{QH0U16M{C&Z)J5U?GOBYD~3(03vo2Z~y=R diff --git a/docs/_build/.doctrees/generated/cellestial.xyplot.doctree b/docs/.doctrees/generated/cellestial.xyplot.doctree similarity index 95% rename from docs/_build/.doctrees/generated/cellestial.xyplot.doctree rename to docs/.doctrees/generated/cellestial.xyplot.doctree index ad4de673135c392e1c150f29ee44a4d2747ba93e..1170aa45094ee2a72387bdda58a04812a4ebce59 100644 GIT binary patch delta 38 ucmeCW&D3+7iKT&cYU4&0b4EtT$u^AA?8OBcnRylZlg~RyZ!TvPUIPICCJg}q delta 36 scmeCV&D3?9iKT&cYW+qQb4Et{$u^AAtSR})#rl&kI!JG>WE5Tl0OLap4gdfE diff --git a/docs/_build/.doctrees/generated/cellestial.xyplots.doctree b/docs/.doctrees/generated/cellestial.xyplots.doctree similarity index 97% rename from docs/_build/.doctrees/generated/cellestial.xyplots.doctree rename to docs/.doctrees/generated/cellestial.xyplots.doctree index 2583739a2b5a2f5aa37f710963230934abbbec0a..97d9ede7f099c63c3f13f6d6c2b8934db8c2e952 100644 GIT binary patch delta 37 tcmezRh4uRvR+a|VslppsEEyS{CfhMevlSO)Wad>g$1-k@Wn`471ONy~3|9aE delta 35 rcmezVh4t$fR+a|Vse&6>EEyRcCfhMev!vuF7dOW<0^E diff --git a/docs/_build/.doctrees/index.doctree b/docs/.doctrees/index.doctree similarity index 99% rename from docs/_build/.doctrees/index.doctree rename to docs/.doctrees/index.doctree index f5e0cc92808528ba03558dbdb72c9de6f4ea8524..f8952211d122d4bb918ef9ced130921053c958ac 100644 GIT binary patch delta 500 zcmXBR$u67$007|pHOA7~73~y*qW033R&BKxgW78CW}Bfk5|Yw9>{)+UejG zuX#f!UA*NT-MpuVUi#=~fDa5Z#4sa_GR8O`nP8GBVoWo`ET5QTo&^?J;xo&vu*w?i xZ19DzeB(Pm*kp@scGx9Of<5;6$uADhV?pxzCOAEb-X@1LqW7QYiQD92&VOYRiZB2G delta 496 zcmWmBM>3rO007|mc~9>|?yQDty=fFBA!a$Zc~_5;}!#mRM$mRn}N%gCG3l7n^Lc%?`Wl@tb`P nIOK?9PB`Tce>vlvi-%|sdwvP-@2g*9W8w1m&4=^X*lPM4P<)9f diff --git a/docs/_build/.doctrees/performance.doctree b/docs/.doctrees/performance.doctree similarity index 94% rename from docs/_build/.doctrees/performance.doctree rename to docs/.doctrees/performance.doctree index 27b52fe610f53a3bdea780230bae94639ce9906d..639026f7eeac206008c73f97b8e56effd3e13177 100644 GIT binary patch delta 31 ncmZ2#u-t&9fpx0PMizHQM#ITIjM8ky1sR!n6`QjecZmT2l - + diff --git a/docs/_build/.doctrees/API.doctree b/docs/_build/.doctrees/API.doctree deleted file mode 100644 index ccc006d5647a3b254b873424f7dc2eccfe933b86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35110 zcmc&-3y>T~d6snVJ>BW$Gs2S1`pJn{C(9T=6!VZRV;k9r?6VceiCN9<&fV;4cW0TI zmF}_f7ubUV}2f6xE_{eS=ecTdms8^_+cXJZrp$7V}zu^E)B{zBa?*?x;nQbEnG z2dzh2`+lo+rZvx|JnOXYHocIW@nJDVzm96BRx zTr#%EMyutz-CAreTP$Y(rDj8&G}%O8 zt`h_jcy@W8#k?fC~@XRTawpk$vqP_(O6+YicC^#IuM4?wB~&j*7S z9vx{eJ2{~`t%_}`fQ{Z{`BLsVc_O96{q~FdEjkyHAkIbL-pNBlm*D?p_g>ZUCz{J_o8NHC^|b}7RFYk}J+PLWRm&?B-D<&a*hQlsL>I;0fQ|CHZ2NEC z_u#=Z4_Z>q~)qM-f*v8sh zl*-t|#)DPQZ8kdeM5a6eE%u5~xF$myzu_RMKm9^?w4aXp4`9qEML+*0r&C8?~t~P{GSi2t6KR zTN`%01kD!KJbT4x!Fi)Z^+dHC*q&AGyavmswp!ZqHH=m^ip$6O<3b1o5TrsCpe}C1It^rgBIJ?rY;VeH^GGr0+yqjA>ZqhW0Z%{`*GZLWl~1Em09#yZv&A#&obB%eSaZEn>CXRTa_5`9OhVo&h5STDA?;Wn zM=JB61vgDiHB)km3ciyK&qf$JWpkst9ds%PKr3*l&TVX)amzvgn^#d>g(Bw=LY!L+JlhP* zY0hYCxn8U`OZG|`5syOW^H=RUU>(>cBMfri(6ZPBd7Cn?xaj=!ttgqSS!*S`0Z;g< zU*aDdU9GyyK+QzaYVgEik>!wKXgbp9_aWTVNlI~^a=uNKzSE%r-B)aMnc}RaLT7j` zL+BJ}Wpq~|G%ae60TAV)@O*Pjo`nWn*|vGprffEhtfI0ttj%w|4Lx_Gf?i5bIJY>j zB(V{KjV7`?maDIci^9&U)UDY|DX=bE9>rBJe+&+KA(wM(E2vqGT<$h;fFi$$1j|OX zC2=6C3gsMAtw}-djh@f<8~|1HtXv7L4G=&TeZ8F_zr7&YEnXCcMrbK-Mn;^g!1!j> zUgZwzXG(A%=`5OKBcRa%uyR*u6mi+#yz^*!_^T{(^~C3lVFYyEYev7yZ-6Fy0CYaM z=sdpY{1KZqVjKxUM%hz{i?KwCT$NX)$Urwi0H~ZKJ@G(Sxs?vP$GXZ9-fT*^o4QHa zyF$28qEWss@8|4|>muc{C8Go3l568sPvU9Ur(B*IEg;ZU4ht3ZVCz?ewk|zD#NK6D zr_KL9F&(w}uxO4=NIJvr-PlG-wMN0DcKLO2vmahaEn&m&0B8Rg4u`QwHe@m(@NpvE?2&eK* z-fW8H&n$JOFLSJ|RAXQlvB0N;GI;;WWyGa`>UK$(jo~cToLmQE7MbY8*J&TNRQAOv zf8P1J^Nsc~O6BsHnkwe0j2vSUBQ=#uppnUURR$!}!XLDq$IWy(Kfxp-+Z{XFptOVS zjlHBibHZh1zP9r-G{0Cmir#r^Yq4^N{JoR^+RiWdXvKME(fPkc=UFlDhEYl7<+z^I zlS&O3n8d0<_X!)r@B{-2Jw6Ew5(X$VN=TVj9KYGE)i4XoJv&fd7>4cs7l9@nUey^5qC zWL$Dtn5zlZL;{v5>Wo)^NL?I_S78whNRS!f>Vu(4#QDGO;p+WdPrW5-e+-&F!qpBV zQIm4?9IawZk!R)aNfARutIv|Eg!BIcI?Rx#y^A+HylC|$dEX&tY)M-AVozdfKNvSw zX$e*IHC7S5?Z*JX??k{4i0LQ-!XjjBvMmDw|COrL?hyD9m#jAk`~oz6K)@WUC_#pX zf$ycrp)fE#5@O)HQf*0LlSn9Idx|%kf`M5xV^f}ejydGC)c5zO$34XIvqLNLow=)&)L>uYR2Vk1(KZWsUnmxSkAU5HZhZ)I3X`nMym3% zyU+uam)*^Olk>4#a6PG)%zP|PM6GW&UKIJ0PRMjgLPkbOQA$QOv4lsictEUDvhZA+ z=Zdtl?oOI=vSL`9=VX`lk(22rvgc&i#6G+=rj6$)Co8#uNXm|ggR`D?y_xrW|7n+` zZ%ezJzM_s4J`#0gS!dMw0Ci(D>V!pzI+D(aI!}cC-e2PNIM-BfQRh!VGhozFg7h49 zVhoOFUhhwlLq(m>ldgmde=i+o$h;oo&89@1$s-Yyo@2T|L;3IJ-MT}WCb1vXZ2oOe zY-*1cmpQ$gixS_{q#=ql!tUeS>4-FMjA<}F(mWJXGcM8;rMRII28lEYp+s4pMMM0> z%H$|T5-V{;|4atfX+$5#y4E9R_@uwrA;c(3h#};}Q)0;OBW0|`^0B+docasVsZlgoSWJbWzQt!kra<#NYvKHRlp;MeV3E?8Q;rE68JBf%4U>b@?l=G~RN zuFO|1f%}pc6|)+*dgT(;GfK%MqB8qZ=w9kW@?NTw{JqrIa%HCyIn&vjv$-Bd4#Vzu zF;+#=w~b8OmZ)5s(q2(jH?CUHMkTYP*; zdg8DOnm#g#^NlGSQ<$E!i5SPivx(y=vZ!q0H0euZ6H9cMA)7eHn@!0kE;^#SwG+QG zZJuM@s%iKBu;eUL<}r{%=6ZWmPm0j-F)m-ZQz)y4oLetWB-b8+3l((YX!-z%xzLbHF*Ia+AVmm;j4zO)1Tx-7hZ&IZ9^PyU zGA_*!r`2FOQ(cXbuSg!x5k|h;lS+n-5xq(Ykv#$toOdGRzlqr>Lc$`fQUZ+uke{Y1 zvO7S24Em(mnxqJ_d8{vhn5&dXh@s)*KT~8-_}BrSB|d&ARhA?+k}iVzARuOUT=2y%!HGenTuJ#Rfv)En=!!@)G<^M2iZBXaKO=<+e0`M;GvMnVc(W<^dSS--JB6yu^);5p#|5wF z2umaKc1fl|+N8u*sAkw$x+KIBjeesb;w7Evxq=vuq9-iEOFf**fX%O@sW%SF7|=N2zZlGk&Dmt#GtX4rVq z;~or#qi~^uPPF*MZWJwH5xu_)A_FXIsk-bAmL}+X1J*j5cSkbYC#>G*v@RClne2y57q9rUsY~fS} zT>dguo!#N`dC>O?moI~+54f1IMTjvpynHrA3Wb+{B~1yue1;A);N?@i+2nFSHa zb!c6cSP~Flr(<2!OJW`&#ILJ57*kV8t(LdaTUWbDat;TnghAF-&9i*$3SMJGp7a?A z8hx}9UfM#kl|)8?rNv$ldshva7P~mMhQSv;VRb=l9Wg9Q`gjE;vk8PE<|SxE^XB7= zG~$gi50*zOmwovg$ls>?Jtcon%ilHmyDooUCx0L0zsW0~S8zSagDKOXb!%~^q3x9I zHnfKY3H!qZMaIi%ZFTgbBh*P)*+vV;QdYLj94Y(aBVAY><*P}Lwo*N{@h-@k?CljG z$k)*twpLi1uVH(6A8Xij6WJelUDs`;^nJ8|ZP~@wh4{y-!~s@pohrNdL{%<#od2pX zZ^(*RHFcAyNsGHgRg@WZ)teA!Z@tu$+|>GCFD2;*Sudr(MLrjNYBe8)!#(sND`W3+so&sS39P&vi_ zkgi0y{W2Y9$SJPr_;68n@=@i$VcC zta;LJcM9-F3||y=+Wp0(p{U)5MR>bYkQruwMXE--oBgGrPYOm!lbu(ArVq0>-|m!h z49)6akRpb%`d5&ugw^k*!wgpceBNw|)o(p+xPE2%(L!zgi}J3Sa^k_Q|7cG_4%_>7LBZ5bD$!98FiN!jKPK;Yj_m*4J&8AL``3Ao@O4r1mt~#S z{~2OBYW-mm@*YWN82{%|mD=6-{|xlK8voybrVryc^ByJ0&}{$HDRL;=|7X&bu>DWc zVFug(1aCIQ_Ggak2%r*re2persxk1iyl*B9R6a@xj9~cNJu#fcnv?6$yogBs5#o}Ll7B<>q7sgIZ zgzh`xZ8l}$YI-3*C8ifHmcN(C-%I&#@^ry@xSj-1r7@Z=h|`$vJ~mT|4BYk0ZXFjA zCI)CUo-#2oeS|*S{7R31o|}6xOaYr^8Ur^#BGI>TLp5a$1X`LDxHhcKCk61y)txl4L5eIYD87^QC1T8L=`cf3tn+45 zg5uRTNhq9X$HIwJFw8s1@D;7mryr1vsi=wXrf=h06cp&I-(pJw{l#Rqv-7qpG2PzI zka3rfwcRD&2B5dfN2uln6=DnSXpZepluCQOb{Vv9Zl7+TH_aF64x(4yC)r900@RVT zUQ6^!a502p+$~TE}h| z%GA}VHo?s~fo}z)WILe1`)t?|Jn-JrN8r^>WDmSIbPK%qP~gR<&3$~!x_}KMXaf;U ztlw=1O|R}F{&F?Y%I8(vtrZ$p;N%0x3i7Hh&g}eZ`IKGH%Vt#Ke)eYKFM{f!z`oyH zmh=O};_Jf+nReYp0&@Gs&Zzt{vZ82I4vXg4_Vxx02YYj>{dEt`ui#3Ix7wu8d?#r7 z2+ezpiJA_HdXCRAHqGPnjVS`D`1}AVO+qHNl@r}A1;Asa?Bep@r~CSXKnx-XB+mt>GdJIHo+wd0P9 z(dQFaqGue*V7C}8dM3G9iqS9TyeEptW3+Gw@$GcP=shtF#>eRA#ng<8(b}(9gc1gd z(U-@LuRBmD1ND>OF)dI(kwFFu)NwLsg|hLg2&Q_VtVXoI3 z=i2`M8oXy88Gj+H%>(pn`Uudv33fx~U7@b(_PqR;6rp{`JxyC!xgLV^5>61ASLL@* z9IIa1-zXPP+NHdxf=A@oho^v5C=F~)q@y{7YFS7TolfZ~d>%`oEqqc1qv%}DvuW#+ zQy7868Sx{ZSEN*nr&KaK=MU)V>u!1MIknVm9797sKX3ZDDW@sdOZFPt^s$i;8eF0u zVw`h6ZxZdxi($OjxJu>|f?V|Q*-Iv#;wIjIG9l^Pl8HV)gJSe^B#|)6J9CK9X&8Dm zhX{)>vNvdrC@@7td`_^xk^MO6lN@wX`mhT$eWVZO$ler2Wex*@ji(MtS(#UV3Y|y$F7c@=pBRMa)O>6BYqK2Cadg(N^X`i8)g&N)7BqbT*Z3z^Am<}_b_(Qze6cpcf_mDD81;ODps3Yn(q_oNh#CNz<(-83Y zwVt#)Z2ak$zj*E*0Us~vMBX#Ra1?oA5nle{R0ixeZxz-Pug~tVdzM>Od@m%yZW{OO z19s-iUqX!GVeWrZ#88;qL#h&(`)Nk2_%Uxb1#{Of4KNs+WBrnAJnc*E|F#UZ@(s$k zg$k~agxvy@P(c=8B-f#}8)AGHU#DYs=vzE@jap^=?9ji&)KpTNPjK|4f>gpFvqMSm zw3wr+gr_`a;+U|ABMeCiFOdlBs3ja0`jOrcS(d*=`CH<@$xAry#r34VSBj%4sW`>y zUSt!r<2y|t={YH*C}C0xvqDA_GghOFH$~JlQ{50vrQ)}!pecY-xv5T#G7|f>e(5KN1_*0

!GSF{Vb^+{aL$G)U)*dOan7xHGCpE@X^#B zQDRqZUQ(cq&!>O0I@e+;_vK(F1@a<;FEntIb)Y^_W*<9Z)n3UYYib3I2*)Ip&%(oS= z`pa6bk`g4B6AEL%>sBbj2dX$=(ddk$F$*i|hY-^rMbn{oJ=4oP?Aam087Rq+8!tVin9B_hK6*rs0cHuyA343QB zon#jR6SYF<96~2s5Zi-qu^+N}G(pV!cz^YM;tWf%Q<2Ue9C z8%-xqEfB-bH0RcNkzkcJ78k72Za0Ee+O z8XDKxOtB1eC8a};qJ(^sswX}GAw(M3z+vQcyYby+EPeodsQg`J$8-j=+A^Z*{S=r+k8w%9bD5mklp!A(!xEXyB7k38JE8^~>7y`^2K!BS!6 zbVDoYFK#x|VKMhB)8#sz3YW-_t)i1zu0&y6 KMlCU~v+(~tYs<0# diff --git a/docs/_build/.doctrees/generated/cellestial.single.basic.heatmap.heatmap.doctree b/docs/_build/.doctrees/generated/cellestial.single.basic.heatmap.heatmap.doctree deleted file mode 100644 index 90d10c9f29d9f238f318d3c5cd249712afa0ee47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28155 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 AH2?qr diff --git a/docs/_build/.doctrees/generated/cellestial.single.basic.scatter.scatter.doctree b/docs/_build/.doctrees/generated/cellestial.single.basic.scatter.scatter.doctree deleted file mode 100644 index 75a887d7faf0de76b0656ce91a6082a1d5010dfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28620 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 yg6(m~hRH@|FWw~*O4OI}q!=8PH5&h+j~Yj$Ql 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 diff --git a/docs/_build/.doctrees/generated/cellestial.single.core.dimensional.dimensional.doctree b/docs/_build/.doctrees/generated/cellestial.single.core.dimensional.dimensional.doctree deleted file mode 100644 index 27e09a31a405ffddaedec1fafe1807fd50359c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123193 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�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 diff --git a/docs/_build/.doctrees/generated/cellestial.single.core.distributions.boxplots.doctree b/docs/_build/.doctrees/generated/cellestial.single.core.distributions.boxplots.doctree deleted file mode 100644 index 6ecad37cbfb49e6064dbaa12d08662d5afdca5a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150200 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 diff --git a/docs/_build/.doctrees/generated/cellestial.single.core.distributions.violins.doctree b/docs/_build/.doctrees/generated/cellestial.single.core.distributions.violins.doctree deleted file mode 100644 index 2b0e50ea44bba286a6ee9db1da8557331926dd4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152414 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 L4G!^{=G6ZW@$Q~S diff --git a/docs/_build/.doctrees/generated/cellestial.single.core.subdimensional.pca.doctree b/docs/_build/.doctrees/generated/cellestial.single.core.subdimensional.pca.doctree deleted file mode 100644 index 31ca93aaf0300097db7b3aa7bec2f1e2e8abe98e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118175 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 SVSK8s*=Dh*f0!po6aPOXsjQ&@ diff --git a/docs/_build/.doctrees/generated/cellestial.single.core.subdimensional.umap.doctree b/docs/_build/.doctrees/generated/cellestial.single.core.subdimensional.umap.doctree deleted file mode 100644 index 0786faf555b3ad2d71ab83fce94bda543d662dcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118198 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 Tei)x>YqnV|>L2C_(!~D{=<=(; diff --git a/docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.dimensionals.doctree b/docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.dimensionals.doctree deleted file mode 100644 index b01e8694dbd70ab60d28912009820b04ed857403..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182708 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 z 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 GIsXAp>V(t) diff --git a/docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.tsnes.doctree b/docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.tsnes.doctree deleted file mode 100644 index 1497def9c051dd4a84cc34f051b4809fd5f3f952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177616 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 BkNf}t diff --git a/docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.umaps.doctree b/docs/_build/.doctrees/generated/cellestial.single.core.subdimensionals.umaps.doctree deleted file mode 100644 index 8b0cc41af54ff1bb398482e0decf9cca568eb3b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177616 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 j&|7opQ<+Cc5woH`;fI}`+v4et$!04MBMxh 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 IXRXnH0L*F>>;M1& diff --git a/docs/_build/.doctrees/generated/cellestial.util.utilities.get_mapping.doctree b/docs/_build/.doctrees/generated/cellestial.util.utilities.get_mapping.doctree deleted file mode 100644 index 73fc256bc4608384c4f063394b9beee755b453ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4052 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 diff --git a/docs/_build/.doctrees/generated/cellestial.util.utilities.slice.doctree b/docs/_build/.doctrees/generated/cellestial.util.utilities.slice.doctree deleted file mode 100644 index 87f37dceac4cea476824af97f892798539602078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8997 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 Gv++Ly5+nTp diff --git a/docs/_build/_modules/cellestial/frames/build.html b/docs/_build/_modules/cellestial/frames/build.html deleted file mode 100644 index 283e546..0000000 --- a/docs/_build/_modules/cellestial/frames/build.html +++ /dev/null @@ -1,679 +0,0 @@ - - - - - - - - - - cellestial.frames.build - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.frames.build

-from __future__ import annotations
-
-from typing import TYPE_CHECKING, Literal
-
-import pandas as pd
-import polars as pl
-from anndata import AnnData
-
-from cellestial.util.errors import KeyNotFoundError
-
-if TYPE_CHECKING:
-    from collections.abc import Sequence
-
-
-def _anndata_variable_columns(
-    data: AnnData, column_names: list[str], keys: str | Sequence[str]
-) -> list[pl.Series]:
-    """Return a list of variable columns as Polars `Series`."""
-    columns = []
-    if isinstance(keys, str):
-        keys = [keys]
-    for key in keys:
-        if key in column_names:  # check for repeats
-            continue
-        elif key in data.var_names:
-            values = data.obs_vector(key)
-            # add the variable column to the list of columns
-            columns.append(pl.Series(key, values).cast(pl.Float32))
-            column_names.append(key)
-        else:
-            msg = f"Key `{key}` not found in data."
-            raise KeyNotFoundError(msg)
-
-    return columns
-
-
-def anndata_observations_frame(
-    data: AnnData,
-    /,
-    variable_keys: str | Sequence[str] | None = None,
-    *,
-    observations_name="barcode",
-    include_dimensions: bool | int = False,
-) -> pl.DataFrame:
-    """
-    Build an Observations DataFrame from an AnnData object.
-
-    Parameters
-    ----------
-    data : AnnData
-        The AnnData object containing the observations.
-    variable_keys : str | Sequence[str] | None
-        Variable keys to add to the DataFrame. If None, no additional keys are added.
-    observations_name : str, optional
-        The name of the observations column, default is 'barcode'.
-    include_dimensions : bool | int
-        Whether to include dimensions from `obsm` in the DataFrame, default is False.
-        Providing an integer will limit the number of dimensions to given number.
-
-    Returns
-    -------
-    DataFrame
-        A DataFrame containing the observations, with optional variable keys and dimensions.
-    """
-    # Check if data is an AnnData object
-    if not isinstance(data, AnnData):
-        msg = "data must be an `AnnData` object"
-        raise TypeError(msg)
-    if not isinstance(data.obs, pd.DataFrame):  # in case of Dataset2D
-        part = data.obs.to_memory()
-    else:
-        part = data.obs
-    partm = data.obsm
-    # PART 1: INITIALIZE
-    columns = [pl.Series(observations_name, data.obs_names)]
-    # PART 2: ADD AnnData.obs
-    for key in part.columns:
-        # handle categorical integer data
-        if part.dtypes[key] == "category" and part[key].cat.categories.dtype.kind in "iuf":
-            # Check if the categories are numeric (integer 'i','u' or float 'f' kinds)
-            # Only convert if the category dtype is numeric ('i', 'u', 'f')
-            # Convert to string (str) and then back to categorical
-            columns.append(pl.Series(part[key].astype(str)).cast(pl.Categorical))
-        else:
-            columns.append(pl.Series(part[key]))
-
-    # PART 3: ADD dimensions if needed
-    if include_dimensions:
-        for X in partm:
-            total_cols = partm[X].shape[1]  # Number of dimensions (columns)
-            if isinstance(include_dimensions, int) and not isinstance(include_dimensions, bool):
-                if include_dimensions >= 0:
-                    col_count = min(include_dimensions, total_cols)
-                else:
-                    msg = "Number of dimensions cannot be a negative number."
-                    raise ValueError(msg)
-            elif isinstance(include_dimensions, bool):
-                col_count = total_cols
-            else:
-                msg = "Argument for `include_dimensions` MUST be either a `bool` or an `int` type."
-                msg += f" You provided type {type(include_dimensions)}"
-                raise TypeError(msg)
-
-            for col in range(col_count):
-                columns.append(pl.Series(f"{X.upper()}{col + 1}", partm[X][:, col]))
-
-    # PART 4: ADD keys if provided
-    if variable_keys is not None:
-        column_names = [column.name for column in columns]
-        columns.extend(
-            _anndata_variable_columns(data=data, column_names=column_names, keys=variable_keys)
-        )
-
-    return pl.DataFrame(columns)
-
-
-def anndata_variables_frame(
-    data: AnnData,
-    *,
-    variables_name: str = "variable",
-    include_dimensions: bool | int = False,
-) -> pl.DataFrame:
-    """
-    Build a Variables DataFrame from an AnnData object.
-
-    Parameters
-    ----------
-    data : AnnData
-        The AnnData object containing the variables.
-    variables_name : str
-        Name for the variables index column, default is 'variable'
-    include_dimensions : bool | int
-        Whether to include dimensions from `varm` in the DataFrame, default is False.
-        Providing an integer will limit the number of dimensions to given number.
-
-    Returns
-    -------
-    DataFrame
-        A DataFrame containing the variables.
-    """
-    # PART 1: INITIALIZE
-    if not isinstance(data, AnnData):
-        msg = "data must be an `AnnData` object"
-        raise TypeError(msg)
-    if not isinstance(data.var, pd.DataFrame):  # in case of Dataset2D
-        part = data.var.to_memory()
-    else:
-        part = data.var
-    partm = data.varm
-    # PART1: initalize columns
-    columns = [pl.Series(variables_name, data.var_names)]
-    # PART 3: ADD AnnData.var
-    for key in part.columns:
-        # handle categorical integer data
-        if part.dtypes[key] == "category" and part[key].cat.categories.dtype.kind in "iuf":
-            # Check if the categories are numeric (integer 'i','u' or float 'f' kinds)
-            # Only convert if the category dtype is numeric ('i', 'u', 'f')
-            # Convert to string (str) and then back to categorical
-            columns.append(pl.Series(part[key].astype(str)).cast(pl.Categorical))
-        else:
-            columns.append(pl.Series(part[key]))
-
-    # PART 4: ADD dimensions if needed
-    if include_dimensions:
-        for X in partm:
-            total_cols = partm[X].shape[1]  # Number of dimensions (columns)
-            if isinstance(include_dimensions, int) and not isinstance(include_dimensions, bool):
-                if include_dimensions >= 0:
-                    col_count = min(include_dimensions, total_cols)
-                else:
-                    msg = "Number of dimensions cannot be a negative number."
-                    raise ValueError(msg)
-            elif isinstance(include_dimensions, bool):
-                col_count = total_cols
-            else:
-                msg = "Argument for `include_dimensions` MUST be either a `bool` or an `int` type."
-                msg += f" You provided type {type(include_dimensions)}"
-                raise TypeError(msg)
-
-            for col in range(col_count):
-                columns.append(pl.Series(f"{X.upper()}{col + 1}", partm[X][:, col]))
-
-    return pl.DataFrame(columns)
-
-
-
-[docs] -def build_frame( - data: AnnData, - *, - variable_keys: str | Sequence[str] | None = None, - axis: Literal[0, 1] | None = None, - observations_name: str = "barcode", - variables_name: str = "variable", - include_dimensions: bool | int = False, -) -> pl.DataFrame: - """ - Build a `polars.DataFrame` from an AnnData object. - - Parameters - ---------- - data : AnnData - The AnnData object containing the variables. - variable_keys : str | Sequence[str] | None - Variable keys to add to the DataFrame. If None, no additional keys are added. - axis : Literal[0,1] | None - The axis to build the frame for. 0 for observations, 1 for variables. - observations_name : str - The name of the observations column, default is 'barcode'. - variables_name : str - Name for the variables index column, default is 'variable' - include_dimensions : bool | int - Whether to include dimensions in the DataFrame, default is False. - Providing an integer will limit the number of dimensions to given number. - - - Returns - ------- - DataFrame - A polars DataFrame containing the variables. - """ - if isinstance(data, AnnData): - # infer the axis if not provided - if axis is None and variable_keys is not None: - axis = 0 - - if axis == 0: - frame = anndata_observations_frame( - data, - variable_keys=variable_keys, - observations_name=observations_name, - include_dimensions=include_dimensions, - ) - elif axis == 1: - frame = anndata_variables_frame( - data, - variables_name=variables_name, - include_dimensions=include_dimensions, - ) - elif axis is None: - msg = "`axis` parameter must be specified, 0 for observations, 1 for variables." - raise ValueError(msg) - else: - msg = f"Unsupported data type: `{type(data)}`" - raise TypeError(msg) - - return frame
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/layers/outline.html b/docs/_build/_modules/cellestial/layers/outline.html deleted file mode 100644 index 6a93e94..0000000 --- a/docs/_build/_modules/cellestial/layers/outline.html +++ /dev/null @@ -1,633 +0,0 @@ - - - - - - - - - - cellestial.layers.outline - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.layers.outline

-from collections.abc import Sequence
-from typing import Literal
-
-import numpy as np
-import polars as pl
-from lets_plot import aes, geom_path
-from lets_plot.plot.core import FeatureSpec, LayerSpec, PlotSpec
-from polars import DataFrame
-
-from cellestial.util import get_mapping
-
-
-def _get_density_boundaries(
-    frame: DataFrame,
-    x: str,
-    y: str,
-    group_by: str,
-    groups: str | Sequence[str | Sequence[str]],
-    padding: float = 1,
-    level: float = 0.1,
-    grid_size: int = 200,
-) -> pl.DataFrame:
-    """Creates and Returns a DataFrame to encircle the cluster via `geom_path`."""
-    from scipy.stats import gaussian_kde
-    from skimage import measure
-
-    # 1. Normalize input to a Sequence of Sequences: List[List[str]]
-    if isinstance(groups, str):
-        groups = [[groups]]
-    else:
-        groups = [
-            [g] if isinstance(g, str) else list(g)
-            for g in groups
-        ]
-
-    boundaries = []
-    for group in groups:
-        group_label = "+".join(group) if len(group) > 1 else group[0]
-        points = frame.filter(pl.col(group_by).is_in(group)).select([x, y]).to_numpy()
-        if len(points) < 5:
-            continue
-
-        # 2. KDE Calculation
-        kde = gaussian_kde(points.T)
-
-        # 3. Create Grid
-        x_min, y_min = points.min(axis=0) - padding
-        x_max, y_max = points.max(axis=0) + padding
-
-        x_range = np.linspace(x_min, x_max, grid_size)
-        y_range = np.linspace(y_min, y_max, grid_size)
-        xi, yi = np.meshgrid(x_range, y_range)
-
-        # 4. Evaluate Density
-        zi = kde(np.vstack([xi.flatten(), yi.flatten()])).reshape(xi.shape)
-
-        # 5. Extract Contours (The skimage magic)
-        threshold = zi.max() * level
-        # find_contours returns a list of [row, col] arrays
-        contours = measure.find_contours(zi, threshold)
-
-        for i, contour in enumerate(contours):
-            # Map grid indices back to DIM coordinates
-            # Note: skimage returns (row, col) which maps to (y_index, x_index)
-            actual_x = np.interp(contour[:, 1], np.arange(grid_size), x_range)
-            actual_y = np.interp(contour[:, 0], np.arange(grid_size), y_range)
-
-            boundaries.append(
-                pl.DataFrame(
-                    {
-                        x: actual_x,
-                        y: actual_y,
-                        group_by: [group_label] * len(actual_x),
-                        "path": [f"{group_label}_{i}"] * len(actual_x),
-                    }
-                )
-            )
-
-    return pl.concat(boundaries)
-
-
-
-[docs] -def cluster_outlines( - plot: PlotSpec, - groups: str | Sequence[str | Sequence[str]], - *, - padding: float = 1.5, - level: float = 0.04, - grid_size: int = 200, - color: str = "#1f1f1f", - linetype: Literal[ - "blank", "solid", "dashed", "dotted", "dotdash", "longdash", "twodash" - ] = "dashed", - mapping: FeatureSpec | None = None, - size: float = 1, - group_by: str | None = None, - x: str | None = None, - y: str | None = None, - **geom_kwargs, -) -> LayerSpec: - """ - Returns a Layer of `geom_path` that outlines the given clusters. - - Parameters - ---------- - plot : PlotSpec - The plot to which the layer will be added. Used to extract data and aesthetics. - groups : str | Sequence[str | Sequence[str]] - The group(s) to outline. Can be a single group name or a list of group - Providing string(s) will outline clusters with those group names. - Providing nested sequences of strings combines each sequence into a their own group. - E.g `groups=[['A', 'B']]` will outline groups A and B as if they were one cluster. - padding : float, default=1.5 - The spatial buffer added to the cluster's bounding box before calculating density. - Increasing this value allows the density 'cloud' to expand further from the outermost - points, ensuring the resulting curve is smooth and not truncated at the data edges. - level : float, default=0.04 - The density threshold for the outline, expressed as a fraction of the peak density - (0.0 to 1.0). A lower value creates a larger, more inclusive 'bubble' that captures - outliers, while a higher value creates a tighter boundary around the cluster's core. - grid_size : int, default=200 - The resolution of the internal sampling grid used for the Marching Squares algorithm. - A higher value produces a smoother, more 'curvy' path by increasing the number of - interpolation points, while a lower value improves calculation speed but may - result in a more jagged or 'pixelated' appearance. - color : str, default='#1f1f1f' - The color of the outline. - linetype : str, default='dashed' - The linetype of the outline. E.g 'dashed', 'dotted', - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - size : float, default=1 - The size of the outline. - group_by : str | None, default=None - The column name in the data used to group clusters by. e.g 'cell_type'. - If None, it will be inferred from the plot aesthetics. - x : str | None, default=None - The column name in the data used for x-axis coordinates. e.g 'X_UMAP1'. - If None, it will be inferred from the plot aesthetics. - y : str | None, default=None - The column name in the data used for y-axis coordinates. e.g 'X_UMAP2'. - If None, it will be inferred from the plot aesthetics. - **geom_kwargs - Additional parameters for the `geom_path` layer. - For more information on geom_path parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_path.html - - """ - # get mapping - _mapping = get_mapping(plot, index=0) - x = _mapping.get("x") if x is None else x - y = _mapping.get("y") if y is None else y - group_by = _mapping.get("color") if group_by is None else group_by - if x is None: - msg = "`x` is present neither as argument nor in the plot aesthetics." - raise ValueError(msg) - if y is None: - msg = "`y` is present neither as argument nor in the plot aesthetics." - raise ValueError(msg) - if group_by is None: - msg = "`group_by` is present neither as argument nor in the plot aesthetics." - raise ValueError(msg) - # get data - frame = plot.get_plot_shared_data() - # get boundaries - frame = _get_density_boundaries( - frame, - x=x, - y=y, - group_by=group_by, - groups=groups, - padding=padding, - level=level, - grid_size=grid_size, - ) - # create and return the plot - if mapping is None: - mapping = aes() - return geom_path( - data=frame, - mapping=aes(x=x, y=y, group="path", **mapping.as_dict()), - color=color, - linetype=linetype, - size=size, - **geom_kwargs, - )
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/base/base.html b/docs/_build/_modules/cellestial/single/base/base.html deleted file mode 100644 index 896074a..0000000 --- a/docs/_build/_modules/cellestial/single/base/base.html +++ /dev/null @@ -1,546 +0,0 @@ - - - - - - - - - - cellestial.single.base.base - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.base.base

-from __future__ import annotations
-
-from typing import TYPE_CHECKING, Literal
-
-from anndata import AnnData
-from lets_plot import ggplot
-
-from cellestial.frames import build_frame
-from cellestial.util import _determine_axis
-
-if TYPE_CHECKING:
-    from collections.abc import Sequence
-
-    from lets_plot.plot.core import FeatureSpec, PlotSpec
-
-
-
-[docs] -def plot( - data: AnnData, - mapping: FeatureSpec | None = None, - *, - axis: Literal[0, 1] | None = None, - variable_keys: Sequence[str] | None = None, - observations_name: str = "Barcode", - variables_name: str = "Variable", - include_dimensions: bool | int = False, -) -> PlotSpec: - """ - Base plot (for plots without data wrangling). - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - mapping : FeatureSpec | None, default=None - Aesthetic mappings for the plot, the result of `aes()`. - axis : Literal[0,1] | None, default=None - axis of the data, 0 for observations and 1 for variables. - variable_keys : str | Sequence[str] | None - Variable keys to add to the DataFrame. If None, no additional keys are added. - observations_name : str - The name of the observations column, default is 'barcode'. - variables_name : str - Name for the variables index column, default is 'variable' - include_dimensions : bool | int, default=False - Whether to include dimensions in the DataFrame. - Providing an integer will limit the number of dimensions to given number. - - Returns - ------- - PlotSpec - Base ggplot object. - - Examples - -------- - .. jupyter-execute:: - :linenos: - :emphasize-lines: 10 - - from lets_plot import * - LetsPlot.setup_html() - - import cellestial as cl - import scanpy as sc - - data = sc.read_h5ad('data/pbmc3k_pped.h5ad') - - p1 = ( - cl.plot(data, aes(x='cell_type_lvl1', y='n_genes')) - ) - p1 # plot object without layers - - - .. jupyter-execute:: - :linenos: - :emphasize-lines: 10-13 - - from lets_plot import * - LetsPlot.setup_html() - - import cellestial as cl - import scanpy as sc - - data = sc.read_h5ad('data/pbmc3k_pped.h5ad') - - p2 = ( - cl.plot(data, aes(x='cell_type_lvl1', y='n_genes')) - + geom_violin(aes(fill='cell_type_lvl1'), scale='width') - + geom_boxplot(width=0.2,outlier_size=0) - + scale_fill_viridis() - ) - p2 - - """ - # Handling Data types - if not isinstance(data, AnnData): - msg = "data must be an `AnnData` object" - raise TypeError(msg) - - # BUILD: the dataframe - if mapping is not None: - keys = [v for v in mapping.as_dict().values() if v is not None] - axis = _determine_axis(data=data, keys=keys) if axis is None else axis - frame = build_frame( - data=data, - variable_keys=variable_keys, - axis=axis, - observations_name=observations_name, - variables_name=variables_name, - include_dimensions=include_dimensions, - ) - - return ggplot(data=frame, mapping=mapping)
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/basic/bar.html b/docs/_build/_modules/cellestial/single/basic/bar.html deleted file mode 100644 index ef37ee6..0000000 --- a/docs/_build/_modules/cellestial/single/basic/bar.html +++ /dev/null @@ -1,554 +0,0 @@ - - - - - - - - - - cellestial.single.basic.bar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.basic.bar

-from __future__ import annotations
-
-from typing import TYPE_CHECKING, Literal
-
-from lets_plot import geom_bar, ggtb
-
-from cellestial.single.base import plot as baseplot
-from cellestial.util import _determine_axis
-
-if TYPE_CHECKING:
-    from collections.abc import Sequence
-
-    from anndata import AnnData
-    from lets_plot.plot.core import FeatureSpec, PlotSpec
-
-
-
-[docs] -def bar( - data: AnnData, - mapping: FeatureSpec | None = None, - *, - axis: Literal[0, 1] | None = None, - variable_keys: Sequence[str] | None = None, - observations_name: str = "Barcode", - variables_name: str = "Variable", - include_dimensions: bool | int = False, - interactive: bool = False, - **geom_kwargs, -) -> PlotSpec: - """ - Bar Plot. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - mapping : FeatureSpec | None, default=None - Aesthetic mappings for the plot, the result of `aes()`. - axis : Literal[0,1] | None, default=None - axis of the data, 0 for observations and 1 for variables. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - axis : Literal[0,1] | None, default=None - The axis to build the frame for. 0 for observations, 1 for variables. - observations_name : str, default='Barcode' - The name of the observations column. - variables_name : str, default='Variable' - Name for the variables index column. - include_dimensions : bool | int, default=False - Whether to include dimensions in the DataFrame. - Providing an integer will limit the number of dimensions to given number. - interactive : bool, default=False - Whether to make the plot interactive. - **geom_kwargs - Additional parameters for the `geom_bar` layer. - For more information on geom_bar parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_bar.html - - Returns - ------- - PlotSpec - Bar plot. - - Examples - -------- - .. jupyter-execute:: - :linenos: - :emphasize-lines: 10-11 - - from lets_plot import * - LetsPlot.setup_html() - - import cellestial as cl - import scanpy as sc - - data = sc.read_h5ad('data/pbmc3k_pped.h5ad') - - p1 = ( - cl.bar(data, mapping=aes('leiden', fill='predicted_doublet')) - + scale_fill_brewer(palette='Set2', direction=-1) - ) - p1 - - Example 2 - - .. jupyter-execute:: - :linenos: - :emphasize-lines: 10-11 - - from lets_plot import * - LetsPlot.setup_html() - - import cellestial as cl - import scanpy as sc - - data = sc.read_h5ad('data/pbmc3k_pped.h5ad') - - p2 = ( - cl.bar(data, mapping=aes('cell_type_lvl1', fill='leiden')) - + scale_fill_brewer(palette='Set2') - ) - p2 - - """ - if mapping is not None: - keys = [v for v in mapping.as_dict().values() if v is not None] - axis = _determine_axis(data=data, keys=keys) if axis is None else axis - br = baseplot( - data=data, - mapping=None, - axis=axis, - variable_keys=variable_keys, - observations_name=observations_name, - variables_name=variables_name, - include_dimensions=include_dimensions, - ) + geom_bar(mapping=mapping, **geom_kwargs) - - if interactive: - br += ggtb(size_zoomin=-1) - - return br
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/basic/heatmap.html b/docs/_build/_modules/cellestial/single/basic/heatmap.html deleted file mode 100644 index 6115ae3..0000000 --- a/docs/_build/_modules/cellestial/single/basic/heatmap.html +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - - - cellestial.single.basic.heatmap - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.basic.heatmap

-from __future__ import annotations
-
-from typing import TYPE_CHECKING, Literal
-
-from lets_plot import geom_tile, ggtb
-
-from cellestial.single.base import plot as baseplot
-from cellestial.themes import _THEME_HEATMAP
-from cellestial.util import _determine_axis
-
-if TYPE_CHECKING:
-    from collections.abc import Sequence
-
-    from anndata import AnnData
-    from lets_plot.plot.core import FeatureSpec, PlotSpec
-
-
-
-[docs] -def heatmap( - data: AnnData, - mapping: FeatureSpec | None = None, - *, - axis: Literal[0, 1] | None = None, - variable_keys: Sequence[str] | None = None, - observations_name: str = "Barcode", - variables_name: str = "Variable", - include_dimensions: bool | int = False, - interactive: bool = False, - **geom_kwargs, -) -> PlotSpec: - """ - Heatmap. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - mapping : FeatureSpec | None, default=None - Aesthetic mappings for the plot, the result of `aes()`. - axis : Literal[0,1] | None, default=None - axis of the data, 0 for observations and 1 for variables. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - observations_name : str, default='Barcode' - The name of the observations column. - variables_name : str, default='Variable' - Name for the variables index column. - include_dimensions : bool | int, default=False - Whether to include dimensions in the DataFrame. - Providing an integer will limit the number of dimensions to given number. - interactive : bool, default=False - Whether to make the plot interactive. - **geom_kwargs - Additional parameters for the `geom_bar` layer. - For more information on geom_bar parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_bar.html - - Returns - ------- - PlotSpec - Heatmap. - """ - if mapping is not None: - keys = [v for v in mapping.as_dict().values() if v is not None] - axis = _determine_axis(data=data, keys=keys) if axis is None else axis - htmp = ( - baseplot( - data=data, - mapping=None, - axis=axis, - variable_keys=variable_keys, - observations_name=observations_name, - variables_name=variables_name, - include_dimensions=include_dimensions, - ) - + geom_tile(mapping=mapping, **geom_kwargs) - + _THEME_HEATMAP - ) - - if interactive: - htmp += ggtb(size_zoomin=-1) - - return htmp
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/basic/scatter.html b/docs/_build/_modules/cellestial/single/basic/scatter.html deleted file mode 100644 index 37812b8..0000000 --- a/docs/_build/_modules/cellestial/single/basic/scatter.html +++ /dev/null @@ -1,519 +0,0 @@ - - - - - - - - - - cellestial.single.basic.scatter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.basic.scatter

-from __future__ import annotations
-
-from typing import TYPE_CHECKING, Literal
-
-# Data retrieval
-from lets_plot import (
-    geom_point,
-    ggtb,
-)
-
-from cellestial.single.base import plot as baseplot
-from cellestial.util import _determine_axis
-
-if TYPE_CHECKING:
-    from collections.abc import Sequence
-
-    from anndata import AnnData
-    from lets_plot.plot.core import FeatureSpec, PlotSpec
-
-
-
-[docs] -def scatter( - data: AnnData, - mapping: FeatureSpec | None = None, - *, - axis: Literal[0, 1] | None = None, - variable_keys: Sequence[str] | None = None, - observations_name: str = "Barcode", - variables_name: str = "Variable", - include_dimensions: bool | int = False, - interactive: bool = False, - **geom_kwargs, -) -> PlotSpec: - """ - Scatter Plot. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - mapping : FeatureSpec | None, default=None - Aesthetic mappings for the plot, the result of `aes()`. - axis : Literal[0,1] | None, default=None - axis of the data, 0 for observations and 1 for variables. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - axis : Literal[0,1] | None, default=None - The axis to build the frame for. 0 for observations, 1 for variables. - observations_name : str, default='Barcode' - The name of the observations column. - variables_name : str, default='Variable' - Name for the variables index column. - include_dimensions : bool | int, default=False - Whether to include dimensions in the DataFrame. - Providing an integer will limit the number of dimensions to given number. - interactive : bool, default=False - Whether to make the plot interactive. - **geom_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - PlotSpec - Scatter plot. - - """ - if mapping is not None: - keys = [v for v in mapping.as_dict().values() if v is not None] - axis = _determine_axis(data=data, keys=keys) if axis is None else axis - # BUILD: the scatter plot - scttr = baseplot( - data=data, - mapping=None, - axis=axis, - variable_keys=variable_keys, - observations_name=observations_name, - variables_name=variables_name, - include_dimensions=include_dimensions, - ) + geom_point(mapping=mapping, **geom_kwargs) - - if interactive: - scttr += ggtb(size_zoomin=-1) - - return scttr
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/common/xyplot.html b/docs/_build/_modules/cellestial/single/common/xyplot.html deleted file mode 100644 index 0917399..0000000 --- a/docs/_build/_modules/cellestial/single/common/xyplot.html +++ /dev/null @@ -1,579 +0,0 @@ - - - - - - - - - - cellestial.single.common.xyplot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.common.xyplot

-from __future__ import annotations
-
-from collections.abc import Sequence
-from typing import TYPE_CHECKING, Literal
-
-from anndata import AnnData
-from lets_plot import (
-    aes,
-    geom_point,
-    ggplot,
-    ggtb,
-    labs,
-    layer_tooltips,
-)
-from lets_plot.plot.core import FeatureSpec
-
-from cellestial.frames import build_frame
-from cellestial.themes import _THEME_SCATTER
-from cellestial.util import (
-    _determine_axis,
-    _select_variable_keys,
-)
-
-if TYPE_CHECKING:
-    from lets_plot.plot.core import PlotSpec
-
-
-
-[docs] -def xyplot( - data: AnnData, - x: str, - y: str, - *, - mapping: FeatureSpec | None = None, - axis: Literal[0, 1] | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - variables_name: str = "Variable", - include_dimensions: bool | int = False, - **point_kwargs, -) -> PlotSpec: - """ - Scatter Plot. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - x : str - The key for the x-axis. - y : str - The key for the y-axis. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - axis : Literal[0,1] | None, default=None - axis of the data, 0 for observations and 1 for variables. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - variables_name : str, default='Variable' - The name to give to variable index column in the dataframe. - include_dimensions : bool | int, default=False - Whether to include dimensions in the DataFrame. - Providing an integer will limit the number of dimensions to given number. - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - PlotSpec - Scatter plot. - - """ - # Handling Data types - if not isinstance(data, AnnData): - msg = "data must be an `AnnData` object" - raise TypeError(msg) - - # HANDLE: mapping - _mapping = aes(x=x, y=y) - if mapping is None: - mapping = _mapping - elif isinstance(mapping, FeatureSpec): - merged = _mapping.as_dict() | mapping.as_dict() - mapping = aes(**merged) - - # Determine variable keys - keys = [key for key in mapping.as_dict().values() if key is not None] - variable_keys = _select_variable_keys(data=data, keys=keys) - # include dimensions if a dimensional key provided - if not include_dimensions: - _keys = keys.copy() - for key in keys: - if key.startswith("X_"): - include_dimensions = True - _keys.remove(key) - - # HANDLE: tooltips - if tooltips is None: - tooltips = keys - tooltips_spec = layer_tooltips(tooltips) - elif tooltips == "none" or isinstance(tooltips, str): - tooltips_spec = tooltips - elif isinstance(tooltips, Sequence): - tooltips = list(tooltips) - tooltips_spec = layer_tooltips(tooltips) - tooltips_variables = _select_variable_keys(data, tooltips) - if not set(tooltips_variables).issubset(variable_keys): - variable_keys.extend(tooltips_variables) - elif isinstance(tooltips, FeatureSpec): - tooltips_spec = tooltips - - # BUILD: the dataframe - axis = _determine_axis(data=data, keys=_keys) if axis is None else axis - frame = build_frame( - data=data, - variable_keys=variable_keys, - axis=axis, - observations_name=observations_name, - variables_name=variables_name, - include_dimensions=include_dimensions, - ) - - # BUILD: the scatterplot - scttr = ( - ggplot(data=frame) - + geom_point( - mapping=mapping, - tooltips=tooltips_spec, - **point_kwargs, - ) - + labs(x=x, y=y) - + _THEME_SCATTER - ) - if interactive: - scttr += ggtb(size_zoomin=-1) - - return scttr
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/common/xyplots.html b/docs/_build/_modules/cellestial/single/common/xyplots.html deleted file mode 100644 index 2b4d0aa..0000000 --- a/docs/_build/_modules/cellestial/single/common/xyplots.html +++ /dev/null @@ -1,610 +0,0 @@ - - - - - - - - - - cellestial.single.common.xyplots - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.common.xyplots

-from __future__ import annotations
-
-from typing import TYPE_CHECKING, Literal
-
-from lets_plot import gggrid
-from lets_plot.plot.core import FeatureSpec, LayerSpec
-
-from cellestial.single.common.xyplot import xyplot
-from cellestial.util.errors import ConfilictingLengthError
-
-if TYPE_CHECKING:
-    from collections.abc import Sequence
-
-    from anndata import AnnData
-    from lets_plot.plot.subplots import SupPlotsSpec
-
-
-
-[docs] -def xyplots( - data: AnnData, - x: str | Sequence[str], - y: str | Sequence[str], - *, - mapping: FeatureSpec | None = None, - axis: Literal[0, 1] | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - variables_name: str = "Variable", - include_dimensions: bool | int = False, - # multi plot args - layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, - # grid args - ncol: int | None = None, - sharex: str | None = None, - sharey: str | None = None, - widths: list[float] | None = None, - heights: list[float] | None = None, - hspace: float | None = None, - vspace: float | None = None, - fit: bool | None = None, - align: bool | None = None, - guides: str = "auto", - **point_kwargs, -) -> SupPlotsSpec: - """ - Scatter Plots. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - x : str - The key(s) for the x-axis. - y : str - The key(s) for the y-axis. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - axis : Literal[0,1] | None, default=None - axis of the data, 0 for observations and 1 for variables. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - variables_name : str, default='Variable' - The name to give to variable index column in the dataframe. - include_dimensions : bool | int, default=False - Whether to include dimensions in the DataFrame. - Providing an integer will limit the number of dimensions to given number. - layers : Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default=None - Layers to add to all the plots in the grid. - ncol : int, default=None - Number of columns in grid. If not specified, shows plots horizontally, in one row. - sharex, sharey : bool, default=None - Controls sharing of axis limits between subplots in the grid. - `all`/True - share limits between all subplots. - `none`/False - do not share limits between subplots. - `row` - share limits between subplots in the same row. - `col` - share limits between subplots in the same column. - widths : list[float], default=None - Relative width of each column of grid, left to right. - heights : list[float], default=None - Relative height of each row of grid, top-down. - hspace : float | None = None - Cell horizontal spacing in px. - vspace : float | None = None - Cell vertical spacing in px. - fit : bool, default=True - Whether to stretch each plot to match the aspect ratio of its cell (fit=True), - or to preserve the original aspect ratio of plots (fit=False). - align : bool, default=False - If True, align inner areas (i.e. “geom” bounds) of plots. - However, cells containing other (sub)grids are not participating - in the plot “inner areas” layouting. - guides : str, default='auto' - Specifies how guides (legends and colorbars) should be treated in the layout. - - 'collect' collect guides from all subplots, removing duplicates. - - 'keep' keep guides in their original subplots; do not collect at this level. - - 'auto' allow guides to be collected if an upper-level layout uses guides='collect'; - - otherwise, keep them in subplots. - Duplicates are identified by comparing visual properties: - For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). - For colorbars: title, domain limits, breaks, and color gradient. - - For more information on gggrid parameters: - https://lets-plot.org/python/pages/api/lets_plot.gggrid.html - - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - PlotSpec - Scatter plot. - """ - # str to list for x and y - if isinstance(x, str): - x = [x] - if isinstance(y, str): - y = [y] - - # check for broadcasting - if len(x) != len(y): - if len(x) == 1: - x = list(x) * len(y) - elif len(y) == 1: - y = list(y) * len(x) - else: - msg = f"Length of x ({len(x)}) and y ({len(y)}) must be the same, or one of them must be of length 1." - raise ConfilictingLengthError(msg) - - # build plots - plots = [] - for xi, yi in zip(x, y, strict=True): - plot = xyplot( - data, - x=xi, - y=yi, - mapping=mapping, - axis=axis, - tooltips=tooltips, - interactive=interactive, - observations_name=observations_name, - variables_name=variables_name, - include_dimensions=include_dimensions, - **point_kwargs, - ) - # handle the layers - if layers is not None: - if isinstance(layers, (FeatureSpec, LayerSpec)): - layers = [layers] - for layer in layers: - plot += layer - plots.append(plot) - - scttrs = gggrid( - plots, - ncol=ncol, - sharex=sharex, - sharey=sharey, - widths=widths, - heights=heights, - hspace=hspace, - vspace=vspace, - fit=fit, - align=align, - guides=guides, - ) - - return scttrs
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/core/dimensional.html b/docs/_build/_modules/cellestial/single/core/dimensional.html deleted file mode 100644 index b3e57ab..0000000 --- a/docs/_build/_modules/cellestial/single/core/dimensional.html +++ /dev/null @@ -1,744 +0,0 @@ - - - - - - - - - - cellestial.single.core.dimensional - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.core.dimensional

-from __future__ import annotations
-
-import warnings
-from collections.abc import Sequence
-from typing import TYPE_CHECKING, Literal
-
-# Core scverse libraries
-import polars as pl
-from anndata import AnnData
-
-# Data retrieval
-from lets_plot import (
-    aes,
-    geom_point,
-    ggplot,
-    ggtb,
-    labs,
-    layer_tooltips,
-    scale_color_brewer,
-)
-from lets_plot.plot.core import FeatureSpec, PlotSpec
-
-from cellestial.frames import build_frame
-from cellestial.themes import _THEME_DIMENSION
-from cellestial.util import (
-    _add_arrow_axis,
-    _color_gradient,
-    _is_variable_key,
-    _legend_ondata,
-    _select_variable_keys,
-)
-
-if TYPE_CHECKING:
-    from lets_plot.plot.core import PlotSpec
-
-
-
-[docs] -def dimensional( - data: AnnData, - key: str | None = None, - *, - mapping : FeatureSpec | None = None, - dimensions: Literal["umap", "pca", "tsne"] = "umap", - use_key: str | None = None, - xy: tuple[int, int] | Sequence[int] = (1, 2), - size: float = 0.8, - variable_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - color_low: str = "#e6e6e6", - color_mid: str | None = None, - color_high: str = "#377eb8", - mid_point: Literal["mean", "median", "mid"] | float = "median", - axis_type: Literal["axis", "arrow"] | None = None, - arrow_length: float = 0.25, - arrow_size: float = 1, - arrow_color: str = "#3f3f3f", - arrow_angle: float = 10, - legend_ondata: bool = False, - ondata_size: float = 12, - ondata_color: str = "#3f3f3f", - ondata_fontface: str = "bold", - ondata_family: str = "sans", - ondata_alpha: float = 1, - ondata_weighted: bool = True, - **point_kwargs, -) -> PlotSpec: - """ - Dimensionality reduction plot. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - key : str, default=None - The key (cell feature) to color the points by. - e.g., 'leiden' or 'louvain' to color by clusters or gene name for expression. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - dimensions : Literal['umap', 'pca', 'tsne'], default='umap' - The dimensional reduction method to use. - e.g., 'umap' or 'pca' or 'tsne'. - xy : tuple[int, int] | Sequence[int], default=(1, 2) - The x and y axes to use for the plot. - e.g., (1, 2) for UMAP1 and UMAP2. - use_key : str, default=None - The specific key to use for the desired dimensions. - e.g., 'X_umap_2d' or 'X_pca_2d'. - Otherwise, the function will decide on the key based on the dimensions. - size : float, default=0.8 - The size of the points. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - color_low : str, default='#e6e6e6' - The color to use for the low end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_mid : str, default=None - The color to use for the middle part of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_high : str, default='#377EB8' - The color to use for the high end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - mid_point : Literal['mean', 'median', 'mid'] | float, default='median' - The midpoint (in data value) of the color gradient. - Can be 'mean', 'median' and 'mid' or a number (float or int). - - If 'mean', the midpoint is the mean of the data. - - If 'median', the midpoint is the median of the data. - - If 'mid', the midpoint is the mean of 'min' and 'max' of the data. - - axis_type : Literal['axis', 'arrow'] | None - Whether to use regular axis or arrows as the axis. - arrow_length : float, default=0.25 - Length of the arrow head (px). - arrow_size : float, default=1 - Size of the arrow. - arrow_color : str, default='#3f3f3f' - Color of the arrows. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - arrow_angle : float, default=10 - Angle of the arrow head in degrees. - legend_ondata: bool, default=False - whether to show legend on data - ondata_size: float, default=12 - size of the legend (text) on data. - ondata_color: str, default='#3f3f3f' - color of the legend (text) on data - ondata_fontface: str, default='bold' - fontface of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-face - ondata_family: str, default='sans' - family of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-family - ondata_alpha: float, default=1 - alpha (transparency) of the legend on data. - ondata_weighted: bool, default=True - whether to use weighted mean for the legend on data. - If True, the weighted mean of the group means is used. - If False, the arithmetic mean of the group means is used. - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - PlotSpec - Dimensional reduction plot. - - """ - # HANDLE: Data types - if not isinstance(data, AnnData): - msg = "data must be an `AnnData` object" - raise TypeError(msg) - - # HANDLE: mapping - if mapping is None: - mapping = aes() - - # HANDLE: XY - if len(xy) != 2: - msg = f"xy MUST be of length 2, (len(xy)=={len(xy)})" - raise KeyError(msg) - if use_key is None: - x = f"X_{dimensions.upper()}{xy[0]}" # e.g. X_UMAP1 - y = f"X_{dimensions.upper()}{xy[1]}" # e.g. X_UMAP2 - else: - x = f"{use_key}{xy[0]}" # e.g. X_UMAP1 - y = f"{use_key}{xy[1]}" # e.g. X_UMAP2 - - # HANDLE: variable_keys - if variable_keys is None: - variable_keys = [] - elif isinstance(variable_keys, str): - variable_keys = [variable_keys] - elif isinstance(variable_keys, Sequence): - variable_keys = list(variable_keys) - - # Append the key if it is a variable key - if _is_variable_key(data, key): - variable_keys.append(key) # ty:ignore[invalid-argument-type] - - # HANDLE: tooltips - if tooltips is None: - tooltips = [observations_name] - if key is not None: - tooltips.append(key) - tooltips_spec = layer_tooltips(tooltips) - elif tooltips == "none" or isinstance(tooltips, str): - tooltips_spec = tooltips - elif isinstance(tooltips, Sequence): - tooltips = list(tooltips) - tooltips_spec = layer_tooltips(tooltips) - tooltips_variables = _select_variable_keys(data, tooltips) - if not set(tooltips_variables).issubset(variable_keys): - variable_keys.extend(tooltips_variables) - elif isinstance(tooltips, FeatureSpec): - tooltips_spec = tooltips - - # BUILD: dataframe - frame = build_frame( - data=data, - variable_keys=variable_keys, - axis=0, - observations_name=observations_name, - include_dimensions=max(xy), - ) - - # BUILD: scatter plot - scttr = ( - ggplot(data=frame) - + geom_point( - mapping=aes(x=x, y=y, color=key,**mapping.as_dict()), - size=size, - tooltips=tooltips_spec, - **point_kwargs, - ) - + _THEME_DIMENSION - ) - - if key is not None: - # CASE1 ---------------------- CATEGORICAL DATA ---------------------- - if frame[key].dtype == pl.Categorical: - scttr += scale_color_brewer(palette="Set2") - - # CASE2 ---------------------- CONTINUOUS DATA ---------------------- - elif frame[key].dtype.is_numeric(): - scttr += _color_gradient( - frame[key], - color_low=color_low, - color_mid=color_mid, - color_high=color_high, - mid_point=mid_point, - ) - # else: let letsplot handle it - - # HANDLE: tSNE label, a special case for labels - if dimensions == "tsne": - x_label = f"tSNE{xy[0]}" - y_label = f"tSNE{xy[1]}" - scttr += labs(x=x_label, y=y_label) - else: - # UMAP1 and UMAP2 rather than X_UMAP1 and X_UMAP2 etc., - scttr += labs( - x=x.replace("X_", ""), - y=y.replace("X_", ""), - ) - - # HANDLE: arrow axis - scttr += _add_arrow_axis( - frame=frame, - x=x, - y=y, - axis_type=axis_type, - arrow_size=arrow_size, - arrow_color=arrow_color, - arrow_angle=arrow_angle, - arrow_length=arrow_length, - ) - # HANDLE: interactive - if interactive: - scttr += ggtb(size_zoomin=-1) - - # HANDLE: legend on data - if key is not None and legend_ondata: - if frame[key].dtype == pl.Categorical: - scttr += _legend_ondata( - frame=frame, - x=x, - y=y, - group_by=key, - size=ondata_size, - color=ondata_color, - fontface=ondata_fontface, - family=ondata_family, - alpha=ondata_alpha, - weighted=ondata_weighted, - ) - elif frame[key].dtype != pl.Categorical: - msg = f"key `{key}` is not categorical, legend on data will not be added" - warnings.warn(msg, stacklevel=1) - - return scttr
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/core/distribution.html b/docs/_build/_modules/cellestial/single/core/distribution.html deleted file mode 100644 index a4c14d1..0000000 --- a/docs/_build/_modules/cellestial/single/core/distribution.html +++ /dev/null @@ -1,882 +0,0 @@ - - - - - - - - - - cellestial.single.core.distribution - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.core.distribution

-from __future__ import annotations
-
-from collections.abc import Sequence
-from typing import TYPE_CHECKING, Any, Literal
-
-from anndata import AnnData
-from lets_plot import (
-    aes,
-    geom_boxplot,
-    geom_jitter,
-    geom_point,
-    geom_sina,
-    geom_violin,
-    ggplot,
-    ggtb,
-    layer_tooltips,
-)
-from lets_plot.plot.core import FeatureSpec, PlotSpec
-
-from cellestial.frames import build_frame
-from cellestial.themes import _THEME_DIST
-from cellestial.util import (
-    _determine_axis,
-    _select_variable_keys,
-)
-
-if TYPE_CHECKING:
-    from lets_plot.plot.core import PlotSpec
-
-
-def _distribution(
-    data: AnnData,
-    key: str | Sequence[str],
-    *,
-    mapping: FeatureSpec | None = None,
-    geom: Literal["violin", "boxplot"] = "violin",
-    axis: Literal[0, 1] | None = None,
-    color: str | None = None,
-    fill: str | None = None,
-    add_keys: Sequence[str] | str | None = None,
-    tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None,
-    geom_fill: str | None = "#FF00FF",
-    geom_color: str | None = "#2f2f2f",
-    point_color: str = "#1f1f1f",
-    point_alpha: float = 0.7,
-    point_size: float = 0.5,
-    point_geom: Literal["jitter", "point", "sina"] = "jitter",
-    observations_name: str = "Barcode",
-    variables_name: str = "Variable",
-    show_points: bool = True,
-    interactive: bool = False,
-    value_column: str = "value",
-    variable_column: str = "variable",
-    point_kwargs: dict[str, Any] | None = None,
-    **geom_kwargs,
-) -> PlotSpec:
-    # Handling Data types
-    if not isinstance(data, AnnData):
-        msg = "data must be an `AnnData` object"
-        raise TypeError(msg)
-
-    # HANDLE: mapping
-    if mapping is None:
-        mapping = aes()
-
-    # convert to list if single string
-    if isinstance(key, str):
-        keys = [key]
-    elif isinstance(key, Sequence):
-        keys = list(key)
-
-    # handle value_column if single key is provided
-    if len(keys) == 1:
-        value_column = keys[0]
-
-    # determine separator
-    separator = None
-    if fill is not None:
-        separator = fill
-    elif color is not None:
-        separator = color
-
-    if point_kwargs is None:
-        point_kwargs = {}
-
-    # determine index to unpivot
-    index = [x for x in [fill, color] if x is not None]
-    if add_keys is not None:
-        if isinstance(add_keys, str):
-            add_keys = [add_keys]
-        index.extend(add_keys)
-
-    # DETERMINE: axis if not provided
-    axis = _determine_axis(data=data, keys=keys) if axis is None else axis
-
-    # handle fill and color
-    geom_fill = None if fill is not None else geom_fill
-    geom_color = None if color is not None else geom_color
-
-    # BUILD: the DataFrame
-    variable_keys = _select_variable_keys(data=data, keys=keys)
-    variable_keys.extend(_select_variable_keys(data=data, keys=add_keys))
-    frame = build_frame(
-        data=data,
-        variable_keys=variable_keys,
-        axis=axis,
-        observations_name=observations_name,
-        variables_name=variables_name,
-    )
-
-    frame = frame.unpivot(
-        on=keys, index=index, value_name=value_column, variable_name=variable_column
-    )
-    if separator is None or len(keys) > 1:
-        separator = variable_column
-
-    # HANDLE: tooltips
-    if tooltips is None:
-        tooltips = [variable_column, value_column]
-        tooltips_spec = layer_tooltips(tooltips)
-    elif tooltips == "none" or isinstance(tooltips, str):
-        tooltips_spec = tooltips
-    elif isinstance(tooltips, Sequence):
-        tooltips = list(tooltips)
-        tooltips_spec = layer_tooltips(tooltips)
-    elif isinstance(tooltips, FeatureSpec):
-        tooltips_spec = tooltips
-
-    # BUILD: the plot
-    dst = ggplot(data=frame) + _THEME_DIST
-
-    # add the geom layer
-    if geom == "violin":
-        dst += geom_violin(
-            mapping=aes(
-                x=separator,
-                y=value_column,
-                color=color,
-                fill=fill,
-                **mapping.as_dict(),
-            ),
-            fill=geom_fill,
-            color=geom_color,
-            tooltips=layer_tooltips(frame.columns),
-            **geom_kwargs,
-        )
-    elif geom == "boxplot":
-        dst += geom_boxplot(
-            mapping=aes(
-                x=separator,
-                y=value_column,
-                color=color,
-                fill=fill,
-                **mapping.as_dict(),
-            ),
-            fill=geom_fill,
-            color=geom_color,
-            tooltips=layer_tooltips(frame.columns),
-            **geom_kwargs,
-        )
-
-    # handle the points (jitter,point,sina)
-    if show_points:
-        if point_geom in ["jitter", "point", "sina"]:
-            geom_functions = {
-                "jitter": geom_jitter,
-                "point": geom_point,
-                "sina": geom_sina,
-            }
-            geom_function = geom_functions.get(point_geom, geom_jitter)
-
-            dst += geom_function(
-                data=frame,
-                mapping=aes(x=separator, y=value_column),
-                color=point_color,
-                alpha=point_alpha,
-                size=point_size,
-                tooltips=tooltips_spec,
-                **point_kwargs,
-            )
-        else:
-            msg = "point_geom must be one of ['jitter','point','sina']."
-            raise KeyError(msg)
-
-    # handle interactive
-    if interactive:
-        dst += ggtb(size_zoomin=-1)
-
-    return dst
-
-
-
-[docs] -def violin( - data: AnnData, - key: str | Sequence[str], - *, - mapping: FeatureSpec | None = None, - axis: Literal[0, 1] | None = None, - color: str | None = None, - fill: str | None = None, - add_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - geom_fill: str | None = "#FF00FF", - geom_color: str | None = "#2f2f2f", - point_color: str = "#1f1f1f", - point_alpha: float = 0.7, - point_size: float = 0.5, - point_geom: Literal["jitter", "point", "sina"] = "jitter", - observations_name: str = "Barcode", - variables_name: str = "Variable", - show_points: bool = True, - interactive: bool = False, - value_column: str = "value", - variable_column: str = "variable", - point_kwargs: dict[str, Any] | None = None, - **geom_kwargs, -) -> PlotSpec: - """ - Violin Plot. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - key : str | Sequence[str] - The key(s) to get the values (numerical). - e.g., 'total_counts' or a gene name. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - axis : Literal[0,1] | None, default=None - axis of the data, 0 for observations and 1 for variables. - color : str | None, default=None - Color aesthetic to split the violin plot (categorical). - e,g., 'cell_type' or 'leiden'. - fill : str | None, default=None - Fill aesthetic to split the violin plot (categorical). - e,g., 'cell_type' or 'leiden'. - add_keys : Sequence[str] | str | None, default=None - Additional keys to include in the dataframe. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - geom_fill : str | None, default='#FF00FF' - Fill color for all violins in the violin plot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - geom_color : str | None, default='#2f2f2f' - Border color for all violins in the violin plot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - point_color : str, default='#1f1f1f' - Color for the points in the violin plot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - point_alpha : float, default=0.7 - Alpha (transparency) for the points in the violin plot. - point_size : float, default=0.5 - Size for the points in the violin plot. - point_geom : Literal['jitter','point','sina'], default is 'jitter', - Geom type of the points, default is geom_jitter. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - variables_name : str, default='Variable' - The name to give to variable index column in the dataframe. - show_points : bool, default=True - Whether to show points. - interactive : bool, default=False - Whether to make the plot interactive. - variable_column : str, default='variable' - The name of the variable column in the dataframe. - value_column : str, default='value' - The name of the value column in the dataframe. - point_kwargs : dict[str, Any] | None, default=None - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - **geom_kwargs - Additional parameters for the `geom_violin` layer. - For more information on geom_violin parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_violin.html - - Returns - ------- - PlotSpec - Violin plot. - """ - return _distribution( - data=data, - key=key, - mapping=mapping, - geom="violin", - axis=axis, - color=color, - fill=fill, - add_keys=add_keys, - tooltips=tooltips, - geom_fill=geom_fill, - geom_color=geom_color, - point_color=point_color, - point_alpha=point_alpha, - point_size=point_size, - point_geom=point_geom, - observations_name=observations_name, - variables_name=variables_name, - show_points=show_points, - interactive=interactive, - value_column=value_column, - variable_column=variable_column, - point_kwargs=point_kwargs, - **geom_kwargs, - )
- - - -
-[docs] -def boxplot( - data: AnnData, - key: str | Sequence[str], - *, - mapping: FeatureSpec | None = None, - axis: Literal[0, 1] | None = None, - color: str | None = None, - fill: str | None = None, - add_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - geom_fill: str | None = "#FF00FF", - geom_color: str | None = "#2f2f2f", - point_color: str = "#1f1f1f", - point_alpha: float = 0.7, - point_size: float = 0.5, - point_geom: Literal["jitter", "point", "sina"] = "jitter", - observations_name: str = "Barcode", - variables_name: str = "Variable", - show_points: bool = True, - interactive: bool = False, - value_column: str = "value", - variable_column: str = "variable", - point_kwargs: dict[str, Any] | None = None, - **geom_kwargs, -) -> PlotSpec: - """ - Boxplot. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - key : str | Sequence[str] - The key(s) to get the values (numerical). - e.g., 'total_counts' or a gene name. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - axis : Literal[0,1] | None, default=None - axis of the data, 0 for observations and 1 for variables. - color : str | None, default=None - Color aesthetic to split the boxplot (categorical). - e,g., 'cell_type' or 'leiden'. - fill : str | None, default=None - Fill aesthetic to split the boxplot (categorical). - e,g., 'cell_type' or 'leiden'. - add_keys : Sequence[str] | str | None, default=None - Additional keys to include in the dataframe. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - geom_fill : str | None, default='#FF00FF' - Fill color for all boxplots in the boxplot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - geom_color : str | None, default='#2f2f2f' - Border color for all boxplots in the boxplot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - point_color : str, default='#1f1f1f' - Color for the points in the boxplot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - point_alpha : float, default=0.7 - Alpha (transparency) for the points in the boxplot. - point_size : float, default=0.5 - Size for the points in the boxplot. - point_geom : Literal['jitter','point','sina'], default is 'jitter', - Geom type of the points, default is geom_jitter. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - variables_name : str, default='Variable' - The name to give to variable index column in the dataframe. - show_points : bool, default=True - Whether to show points. - interactive : bool, default=False - Whether to make the plot interactive. - variable_column : str, default='variable' - The name of the variable column in the dataframe. - value_column : str, default='value' - The name of the value column in the dataframe. - point_kwargs : dict[str, Any] | None, default=None - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - **geom_kwargs - Additional parameters for the `geom_boxplot` layer. - For more information on geom_boxplot parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_boxplot.html - - Returns - ------- - PlotSpec - Boxplot. - """ - return _distribution( - data=data, - key=key, - mapping=mapping, - geom="boxplot", - axis=axis, - color=color, - fill=fill, - add_keys=add_keys, - tooltips=tooltips, - geom_fill=geom_fill, - geom_color=geom_color, - point_color=point_color, - point_alpha=point_alpha, - point_size=point_size, - point_geom=point_geom, - observations_name=observations_name, - variables_name=variables_name, - show_points=show_points, - interactive=interactive, - value_column=value_column, - variable_column=variable_column, - point_kwargs=point_kwargs, - **geom_kwargs, - )
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/core/distributions.html b/docs/_build/_modules/cellestial/single/core/distributions.html deleted file mode 100644 index ea5f83f..0000000 --- a/docs/_build/_modules/cellestial/single/core/distributions.html +++ /dev/null @@ -1,885 +0,0 @@ - - - - - - - - - - cellestial.single.core.distributions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.core.distributions

-from __future__ import annotations
-
-from typing import TYPE_CHECKING, Any, Literal
-
-from lets_plot import gggrid
-from lets_plot.plot.core import FeatureSpec, LayerSpec
-
-from cellestial.single.core.distribution import boxplot, violin
-from cellestial.util import _share_axis, _share_ticks
-
-if TYPE_CHECKING:
-    from collections.abc import Sequence
-
-    from anndata import AnnData
-    from lets_plot.plot.subplots import SupPlotsSpec
-
-
-
-[docs] -def violins( - data: AnnData, - keys: Sequence[str], - *, - mapping: FeatureSpec | None = None, - axis: Literal[0, 1] | None = None, - color: str | None = None, - fill: str | None = None, - add_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - geom_fill: str = "#FF00FF", - geom_color: str = "#2f2f2f", - point_color: str = "#1f1f1f", - point_alpha: float = 0.7, - point_size: float = 0.5, - point_geom: Literal["jitter", "point", "sina"] = "jitter", - observations_name: str = "Barcode", - variables_name: str = "Variable", - show_points: bool = True, - interactive: bool = False, - value_column: str = "value", - variable_column: str = "variable", - # multi plot args - share_axis: bool = False, - share_ticks: bool = False, - layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, - # grid args - ncol: int | None = None, - sharex: str | None = None, - sharey: str | None = None, - widths: list | None = None, - heights: list | None = None, - hspace: float | None = None, - vspace: float | None = None, - fit: bool | None = None, - align: bool | None = None, - guides: str = "auto", - # other kwargs - point_kwargs: dict[str, Any] | None = None, - **geom_kwargs, -) -> SupPlotsSpec: - """ - Violin Plots. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - keys : list[str] | tuple[str] | Sequence[str] - The keys to get the values (numerical). - e.g., ['total_counts', 'pct_counts_in_top_50_genes'] or a list of gene names. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - axis : Literal[0,1] | None, default=None - axis of the data, 0 for observations and 1 for variables. - color : str | None, default=None - Color aesthetic to split the violin plot (categorical). - e,g., 'cell_type' or 'leiden'. - fill : str | None, default=None - Fill aesthetic to split the violin plot (categorical). - e,g., 'cell_type' or 'leiden'. - add_keys : Sequence[str] | str | None, default=None - Additional keys to include in the dataframe. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - geom_fill : str, default='#FF00FF' - Fill color for all violins in the violin plot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - geom_color : str, default='#2f2f2f' - Border color for all violins in the violin plot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - point_color : str, default='#1f1f1f' - Color for the points in the violin plot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - point_alpha : float, default=0.7 - Alpha (transparency) for the points in the violin plot. - point_size : float, default=0.5 - Size for the points in the violin plot. - point_geom : Literal['jitter','point','sina'], default is 'jitter', - Geom type of the points, default is geom_jitter. - trim : bool, default=False - Whether to trim the violin plot. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - variables_name : str, default='Gene' - The name to give to variable index column in the dataframe. - show_points : bool, default=True - Whether to show points. - interactive : bool, default=False - Whether to make the plot interactive. - share_ticks : bool, default=True - Whether to share the labels across all plots. - If True, only X tick texts on bottom row and Y tick text on left column are shown. - share_axis : bool, default=False - Whether to share the axis across all plots. - If True, only X axis on bottom row and Y axis on left column is shown. - layers : Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None, default=None - Additional layers to add to the plot. - variable_column : str, default='variable' - The name of the variable column in the dataframe. - value_column : str, default='value' - The name of the value column in the dataframe. - ncol : int, default=None - Number of columns in grid. If not specified, shows plots horizontally, in one row. - sharex, sharey : bool, default=None - Controls sharing of axis limits between subplots in the grid. - `all`/True - share limits between all subplots. - `none`/False - do not share limits between subplots. - `row` - share limits between subplots in the same row. - `col` - share limits between subplots in the same column. - widths : list[float], default=None - Relative width of each column of grid, left to right. - heights : list[float], default=None - Relative height of each row of grid, top-down. - hspace : float | None = None - Cell horizontal spacing in px. - vspace : float | None = None - Cell vertical spacing in px. - fit : bool, default=True - Whether to stretch each plot to match the aspect ratio of its cell (fit=True), - or to preserve the original aspect ratio of plots (fit=False). - align : bool, default=False - If True, align inner areas (i.e. “geom” bounds) of plots. - However, cells containing other (sub)grids are not participating - in the plot “inner areas” layouting. - guides : str, default='auto' - Specifies how guides (legends and colorbars) should be treated in the layout. - - 'collect' collect guides from all subplots, removing duplicates. - - 'keep' keep guides in their original subplots; do not collect at this level. - - 'auto' allow guides to be collected if an upper-level layout uses guides='collect'; - - otherwise, keep them in subplots. - Duplicates are identified by comparing visual properties: - For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). - For colorbars: title, domain limits, breaks, and color gradient. - - For more information on gggrid parameters: - https://lets-plot.org/python/pages/api/lets_plot.gggrid.html - - point_kwargs : dict[str, Any] | None, default=None - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - **geom_kwargs - Additional parameters for the `geom_violin` layer. - For more information on geom_violin parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_violin.html - - Returns - ------- - SupPlotsSpec - Violin Plots. - """ - plots = [] - for i,key in enumerate(keys): - plot = violin( - data=data, - key=key, - mapping=mapping, - axis=axis, - color=color, - fill=fill, - add_keys=add_keys, - tooltips=tooltips, - geom_fill=geom_fill, - geom_color=geom_color, - point_color=point_color, - point_alpha=point_alpha, - point_size=point_size, - point_geom=point_geom, - observations_name=observations_name, - variables_name=variables_name, - show_points=show_points, - interactive=interactive, - value_column=value_column, - variable_column=variable_column, - point_kwargs=point_kwargs, - **geom_kwargs, - ) - # handle the layers - if layers is not None: - if isinstance(layers, (FeatureSpec, LayerSpec)): - layers = [layers] - for layer in layers: - plot += layer - if share_ticks: - plot = _share_ticks(plot, i, keys, ncol) - if share_axis: - plot = _share_axis(plot, i, keys, ncol, "axis") - plots.append(plot) - - return gggrid( - plots, - ncol=ncol, - sharex=sharex, - sharey=sharey, - widths=widths, - heights=heights, - hspace=hspace, - vspace=vspace, - fit=fit, - align=align, - guides=guides, - )
- - -
-[docs] -def boxplots( - data: AnnData, - keys: Sequence[str], - *, - mapping: FeatureSpec | None = None, - axis: Literal[0, 1] | None = None, - color: str | None = None, - fill: str | None = None, - add_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - geom_fill: str = "#FF00FF", - geom_color: str = "#2f2f2f", - point_color: str = "#1f1f1f", - point_alpha: float = 0.7, - point_size: float = 0.5, - point_geom: Literal["jitter", "point", "sina"] = "jitter", - observations_name: str = "Barcode", - variables_name: str = "Variable", - show_points: bool = True, - interactive: bool = False, - value_column: str = "value", - variable_column: str = "variable", - # multi plot args - share_axis: bool = False, - share_ticks: bool = False, - layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, - # grid args - ncol: int | None = None, - sharex: str | None = None, - sharey: str | None = None, - widths: list | None = None, - heights: list | None = None, - hspace: float | None = None, - vspace: float | None = None, - fit: bool | None = None, - align: bool | None = None, - guides: str = "auto", - # other kwargs - point_kwargs: dict[str, Any] | None = None, - **geom_kwargs, -) -> SupPlotsSpec: - """ - Boxplots. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - keys : list[str] | tuple[str] | Sequence[str] - The keys to get the values (numerical). - e.g., ['total_counts', 'pct_counts_in_top_50_genes'] or a list of gene names. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - axis : Literal[0,1] | None, default=None - axis of the data, 0 for observations and 1 for variables. - color : str | None, default=None - Color aesthetic to split the boxplot (categorical). - e,g., 'cell_type' or 'leiden'. - fill : str | None, default=None - Fill aesthetic to split the boxplot (categorical). - e,g., 'cell_type' or 'leiden'. - add_keys : Sequence[str] | str | None, default=None - Additional keys to include in the dataframe. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - geom_fill : str, default='#FF00FF' - Fill color for all boxplots in the boxplot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - geom_color : str, default='#2f2f2f' - Border color for all boxplots in the boxplot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - point_color : str, default='#1f1f1f' - Color for the points in the boxplot. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - point_alpha : float, default=0.7 - Alpha (transparency) for the points in the boxplot. - point_size : float, default=0.5 - Size for the points in the boxplot. - point_geom : Literal['jitter','point','sina'], default is 'jitter', - Geom type of the points, default is geom_jitter. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - variables_name : str, default='Gene' - The name to give to variable index column in the dataframe. - show_points : bool, default=True - Whether to show points. - interactive : bool, default=False - Whether to make the plot interactive. - share_ticks : bool, default=True - Whether to share the labels across all plots. - If True, only X tick texts on bottom row and Y tick text on left column are shown. - share_axis : bool, default=False - Whether to share the axis across all plots. - If True, only X axis on bottom row and Y axis on left column is shown. - layers : Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None, default=None - Additional layers to add to the plot. - variable_column : str, default='variable' - The name of the variable column in the dataframe. - value_column : str, default='value' - The name of the value column in the dataframe. - ncol : int, default=None - Number of columns in grid. If not specified, shows plots horizontally, in one row. - sharex, sharey : bool, default=None - Controls sharing of axis limits between subplots in the grid. - `all`/True - share limits between all subplots. - `none`/False - do not share limits between subplots. - `row` - share limits between subplots in the same row. - `col` - share limits between subplots in the same column. - widths : list[float], default=None - Relative width of each column of grid, left to right. - heights : list[float], default=None - Relative height of each row of grid, top-down. - hspace : float | None = None - Cell horizontal spacing in px. - vspace : float | None = None - Cell vertical spacing in px. - fit : bool, default=True - Whether to stretch each plot to match the aspect ratio of its cell (fit=True), - or to preserve the original aspect ratio of plots (fit=False). - align : bool, default=False - If True, align inner areas (i.e. “geom” bounds) of plots. - However, cells containing other (sub)grids are not participating - in the plot “inner areas” layouting. - guides : str, default='auto' - Specifies how guides (legends and colorbars) should be treated in the layout. - - 'collect' collect guides from all subplots, removing duplicates. - - 'keep' keep guides in their original subplots; do not collect at this level. - - 'auto' allow guides to be collected if an upper-level layout uses guides='collect'; - - otherwise, keep them in subplots. - Duplicates are identified by comparing visual properties: - For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). - For colorbars: title, domain limits, breaks, and color gradient. - - For more information on gggrid parameters: - https://lets-plot.org/python/pages/api/lets_plot.gggrid.html - - point_kwargs : dict[str, Any] | None, default=None - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - **geom_kwargs - Additional parameters for the `geom_boxplot` layer. - For more information on geom_boxplot parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_boxplot.html - - Returns - ------- - SupPlotsSpec - Boxplots. - """ - plots = [] - for i,key in enumerate(keys): - plot = boxplot( - data=data, - key=key, - mapping=mapping, - axis=axis, - color=color, - fill=fill, - add_keys=add_keys, - tooltips=tooltips, - geom_fill=geom_fill, - geom_color=geom_color, - point_color=point_color, - point_alpha=point_alpha, - point_size=point_size, - point_geom=point_geom, - observations_name=observations_name, - variables_name=variables_name, - show_points=show_points, - interactive=interactive, - value_column=value_column, - variable_column=variable_column, - point_kwargs=point_kwargs, - **geom_kwargs, - ) - # handle the layers - if layers is not None: - if isinstance(layers, (FeatureSpec, LayerSpec)): - layers = [layers] - for layer in layers: - plot += layer - if share_ticks: - plot = _share_ticks(plot, i, keys, ncol) - if share_axis: - plot = _share_axis(plot, i, keys, ncol, "axis") - - plots.append(plot) - - return gggrid( - plots, - ncol=ncol, - sharex=sharex, - sharey=sharey, - widths=widths, - heights=heights, - hspace=hspace, - vspace=vspace, - fit=fit, - align=align, - guides=guides, - )
- - -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/core/subdimensional.html b/docs/_build/_modules/cellestial/single/core/subdimensional.html deleted file mode 100644 index 149974f..0000000 --- a/docs/_build/_modules/cellestial/single/core/subdimensional.html +++ /dev/null @@ -1,1137 +0,0 @@ - - - - - - - - - - cellestial.single.core.subdimensional - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.core.subdimensional

-from __future__ import annotations
-
-from typing import TYPE_CHECKING, Literal
-
-from cellestial.single.core.dimensional import dimensional
-from cellestial.util import _is_variable_key
-
-if TYPE_CHECKING:
-    from collections.abc import Sequence
-
-    from anndata import AnnData
-    from lets_plot.plot.core import FeatureSpec, PlotSpec
-
-
-
-[docs] -def umap( - data: AnnData, - key: str | None = None, - *, - mapping : FeatureSpec | None = None, - use_key: str | None = None, - xy: tuple[int, int] | Sequence[int] = (1, 2), - size: float = 0.8, - variable_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - color_low: str = "#e6e6e6", - color_mid: str | None = None, - color_high: str = "#377eb8", - mid_point: Literal["mean", "median", "mid"] | float = "median", - axis_type: Literal["axis", "arrow"] | None = None, - arrow_length: float = 0.25, - arrow_size: float = 1, - arrow_color: str = "#3f3f3f", - arrow_angle: float = 10, - legend_ondata: bool = False, - ondata_size: float = 12, - ondata_color: str = "#3f3f3f", - ondata_fontface: str = "bold", - ondata_family: str = "sans", - ondata_alpha: float = 1, - ondata_weighted: bool = True, - **point_kwargs, -) -> PlotSpec: - """ - UMAP Dimensionality reduction plot. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - key : str, default=None - The key (cell feature) to color the points by. - e.g., 'leiden' or 'louvain' to color by clusters or gene name for expression. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - use_key : str, default=None - The specific key to use for the desired dimensions. - e.g., 'X_umap_2d' or 'X_pca_2d'. - Otherwise, the function will decide on the key based on the dimensions. - xy : tuple[int, int] | Sequence[int], default=(1, 2) - The x and y axes to use for the plot. - e.g., (1, 2) for UMAP1 and UMAP2. - size : float, default=0.8 - The size of the points. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - color_low : str, default='#e6e6e6' - The color to use for the low end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_mid : str, default=None - The color to use for the middle part of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_high : str, default='#377EB8' - The color to use for the high end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - mid_point : Literal['mean', 'median', 'mid'] | float, default='median' - The midpoint (in data value) of the color gradient. - Can be 'mean', 'median' and 'mid' or a number (float or int). - - If 'mean', the midpoint is the mean of the data. - - If 'median', the midpoint is the median of the data. - - If 'mid', the midpoint is the mean of 'min' and 'max' of the data. - - axis_type : Literal['axis', 'arrow'] | None - Whether to use regular axis or arrows as the axis. - arrow_length : float, default=0.25 - Length of the arrow head (px). - arrow_size : float, default=1 - Size of the arrow. - arrow_color : str, default='#3f3f3f' - Color of the arrows. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - arrow_angle : float, default=10 - Angle of the arrow head in degrees. - legend_ondata: bool, default=False - whether to show legend on data - ondata_size: float, default=12 - size of the legend (text) on data. - ondata_color: str, default='#3f3f3f' - color of the legend (text) on data - ondata_fontface: str, default='bold' - fontface of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-face - ondata_family: str, default='sans' - family of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-family - ondata_alpha: float, default=1 - alpha (transparency) of the legend on data. - ondata_weighted: bool, default=True - whether to use weighted mean for the legend on data. - If True, the weighted mean of the group means is used. - If False, the arithmetic mean of the group means is used. - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - PlotSpec - Dimensional reduction plot. - - """ - return dimensional( - data=data, - key=key, - mapping=mapping, - dimensions="umap", - use_key=use_key, - xy=xy, - size=size, - variable_keys=variable_keys, - tooltips=tooltips, - interactive=interactive, - observations_name=observations_name, - color_low=color_low, - color_mid=color_mid, - color_high=color_high, - mid_point=mid_point, - axis_type=axis_type, - arrow_length=arrow_length, - arrow_size=arrow_size, - arrow_color=arrow_color, - arrow_angle=arrow_angle, - legend_ondata=legend_ondata, - ondata_size=ondata_size, - ondata_color=ondata_color, - ondata_fontface=ondata_fontface, - ondata_family=ondata_family, - ondata_alpha=ondata_alpha, - ondata_weighted=ondata_weighted, - **point_kwargs, - )
- - - -
-[docs] -def tsne( - data: AnnData, - key: str | None = None, - *, - mapping : FeatureSpec | None = None, - use_key: str | None = None, - xy: tuple[int, int] | Sequence[int] = (1, 2), - size: float = 0.8, - variable_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - color_low: str = "#e6e6e6", - color_mid: str | None = None, - color_high: str = "#377eb8", - mid_point: Literal["mean", "median", "mid"] | float = "median", - axis_type: Literal["axis", "arrow"] | None = None, - arrow_length: float = 0.25, - arrow_size: float = 1, - arrow_color: str = "#3f3f3f", - arrow_angle: float = 10, - legend_ondata: bool = False, - ondata_size: float = 12, - ondata_color: str = "#3f3f3f", - ondata_fontface: str = "bold", - ondata_family: str = "sans", - ondata_alpha: float = 1, - ondata_weighted: bool = True, - **point_kwargs, -) -> PlotSpec: - """ - tSNE Dimensionality reduction plot. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - key : str, default=None - The key (cell feature) to color the points by. - e.g., 'leiden' or 'louvain' to color by clusters or gene name for expression. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - use_key : str, default=None - The specific key to use for the desired dimensions. - e.g., 'X_umap_2d' or 'X_pca_2d'. - Otherwise, the function will decide on the key based on the dimensions. - xy : tuple[int, int] | Sequence[int], default=(1, 2) - The x and y axes to use for the plot. - e.g., (1, 2) for UMAP1 and UMAP2. - size : float, default=0.8 - The size of the points. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - color_low : str, default='#e6e6e6' - The color to use for the low end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_mid : str, default=None - The color to use for the middle part of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_high : str, default='#377EB8' - The color to use for the high end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - mid_point : Literal['mean', 'median', 'mid'] | float, default='median' - The midpoint (in data value) of the color gradient. - Can be 'mean', 'median' and 'mid' or a number (float or int). - - If 'mean', the midpoint is the mean of the data. - - If 'median', the midpoint is the median of the data. - - If 'mid', the midpoint is the mean of 'min' and 'max' of the data. - - axis_type : Literal['axis', 'arrow'] | None - Whether to use regular axis or arrows as the axis. - arrow_length : float, default=0.25 - Length of the arrow head (px). - arrow_size : float, default=1 - Size of the arrow. - arrow_color : str, default='#3f3f3f' - Color of the arrows. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - arrow_angle : float, default=10 - Angle of the arrow head in degrees. - legend_ondata: bool, default=False - whether to show legend on data - ondata_size: float, default=12 - size of the legend (text) on data. - ondata_color: str, default='#3f3f3f' - color of the legend (text) on data - ondata_fontface: str, default='bold' - fontface of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-face - ondata_family: str, default='sans' - family of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-family - ondata_alpha: float, default=1 - alpha (transparency) of the legend on data. - ondata_weighted: bool, default=True - whether to use weighted mean for the legend on data. - If True, the weighted mean of the group means is used. - If False, the arithmetic mean of the group means is used. - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - PlotSpec - Dimensional reduction plot. - - """ # noqa: D403 - return dimensional( - data=data, - key=key, - mapping=mapping, - dimensions="tsne", - use_key=use_key, - xy=xy, - size=size, - variable_keys=variable_keys, - tooltips=tooltips, - interactive=interactive, - observations_name=observations_name, - color_low=color_low, - color_mid=color_mid, - color_high=color_high, - mid_point=mid_point, - axis_type=axis_type, - arrow_length=arrow_length, - arrow_size=arrow_size, - arrow_color=arrow_color, - arrow_angle=arrow_angle, - legend_ondata=legend_ondata, - ondata_size=ondata_size, - ondata_color=ondata_color, - ondata_fontface=ondata_fontface, - ondata_family=ondata_family, - ondata_alpha=ondata_alpha, - ondata_weighted=ondata_weighted, - **point_kwargs, - )
- - - -
-[docs] -def pca( - data: AnnData, - key: str | None = None, - *, - mapping : FeatureSpec | None = None, - use_key: str | None = None, - xy: tuple[int, int] | Sequence[int] = (1, 2), - size: float = 0.8, - variable_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - color_low: str = "#e6e6e6", - color_mid: str | None = None, - color_high: str = "#377eb8", - mid_point: Literal["mean", "median", "mid"] | float = "median", - axis_type: Literal["axis", "arrow"] | None = None, - arrow_length: float = 0.25, - arrow_size: float = 1, - arrow_color: str = "#3f3f3f", - arrow_angle: float = 10, - legend_ondata: bool = False, - ondata_size: float = 12, - ondata_color: str = "#3f3f3f", - ondata_fontface: str = "bold", - ondata_family: str = "sans", - ondata_alpha: float = 1, - ondata_weighted: bool = True, - **point_kwargs, -) -> PlotSpec: - """ - PCA Dimensionality reduction plot. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - key : str, default=None - The key (cell feature) to color the points by. - e.g., 'leiden' or 'louvain' to color by clusters or gene name for expression. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - use_key : str, default=None - The specific key to use for the desired dimensions. - e.g., 'X_umap_2d' or 'X_pca_2d'. - Otherwise, the function will decide on the key based on the dimensions. - xy : tuple[int, int] | Sequence[int], default=(1, 2) - The x and y axes to use for the plot. - e.g., (1, 2) for UMAP1 and UMAP2. - size : float, default=0.8 - The size of the points. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - color_low : str, default='#e6e6e6' - The color to use for the low end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_mid : str, default=None - The color to use for the middle part of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_high : str, default='#377EB8' - The color to use for the high end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - mid_point : Literal['mean', 'median', 'mid'] | float, default='median' - The midpoint (in data value) of the color gradient. - Can be 'mean', 'median' and 'mid' or a number (float or int). - - If 'mean', the midpoint is the mean of the data. - - If 'median', the midpoint is the median of the data. - - If 'mid', the midpoint is the mean of 'min' and 'max' of the data. - - axis_type : Literal['axis', 'arrow'] | None - Whether to use regular axis or arrows as the axis. - arrow_length : float, default=0.25 - Length of the arrow head (px). - arrow_size : float, default=1 - Size of the arrow. - arrow_color : str, default='#3f3f3f' - Color of the arrows. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - arrow_angle : float, default=10 - Angle of the arrow head in degrees. - legend_ondata: bool, default=False - whether to show legend on data - ondata_size: float, default=12 - size of the legend (text) on data. - ondata_color: str, default='#3f3f3f' - color of the legend (text) on data - ondata_fontface: str, default='bold' - fontface of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-face - ondata_family: str, default='sans' - family of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-family - ondata_alpha: float, default=1 - alpha (transparency) of the legend on data. - ondata_weighted: bool, default=True - whether to use weighted mean for the legend on data. - If True, the weighted mean of the group means is used. - If False, the arithmetic mean of the group means is used. - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - PlotSpec - Dimensional reduction plot. - - """ - return dimensional( - data=data, - key=key, - mapping=mapping, - dimensions="pca", - use_key=use_key, - xy=xy, - size=size, - variable_keys=variable_keys, - tooltips=tooltips, - interactive=interactive, - observations_name=observations_name, - color_low=color_low, - color_mid=color_mid, - color_high=color_high, - mid_point=mid_point, - axis_type=axis_type, - arrow_length=arrow_length, - arrow_size=arrow_size, - arrow_color=arrow_color, - arrow_angle=arrow_angle, - legend_ondata=legend_ondata, - ondata_size=ondata_size, - ondata_color=ondata_color, - ondata_fontface=ondata_fontface, - ondata_family=ondata_family, - ondata_alpha=ondata_alpha, - ondata_weighted=ondata_weighted, - **point_kwargs, - )
- - - -
-[docs] -def expression( - data: AnnData, - key: str, - *, - mapping : FeatureSpec | None = None, - dimensions: Literal["umap", "pca", "tsne"] = "umap", - use_key: str | None = None, - xy: tuple[int, int] | Sequence[int] = (1, 2), - size: float = 0.8, - variable_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - color_low: str = "#e6e6e6", - color_mid: str | None = None, - color_high: str = "#377eb8", - mid_point: Literal["mean", "median", "mid"] | float = "median", - axis_type: Literal["axis", "arrow"] | None = "arrow", - arrow_length: float = 0.25, - arrow_size: float = 1, - arrow_color: str = "#3f3f3f", - arrow_angle: float = 10, - legend_ondata: bool = False, - ondata_size: float = 12, - ondata_color: str = "#3f3f3f", - ondata_fontface: str = "bold", - ondata_family: str = "sans", - ondata_alpha: float = 1, - ondata_weighted: bool = True, - **point_kwargs, -) -> PlotSpec: - """ - Dimensionality reduction plot of expression data. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - key : str - The key (gene names) to color the points by. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - dimensions : Literal['umap', 'pca', 'tsne'], default='umap' - The dimensional reduction method to use. - e.g., 'umap' or 'pca' or 'tsne'. - use_key : str, default=None - The specific key to use for the desired dimensions. - e.g., 'X_umap_2d' or 'X_pca_2d'. - Otherwise, the function will decide on the key based on the dimensions. - xy : tuple[int, int] | Sequence[int], default=(1, 2) - The x and y axes to use for the plot. - e.g., (1, 2) for UMAP1 and UMAP2. - size : float, default=0.8 - The size of the points. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - color_low : str, default='#e6e6e6' - The color to use for the low end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_mid : str, default=None - The color to use for the middle part of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_high : str, default='#377EB8' - The color to use for the high end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - mid_point : Literal['mean', 'median', 'mid'] | float, default='median' - The midpoint (in data value) of the color gradient. - Can be 'mean', 'median' and 'mid' or a number (float or int). - - If 'mean', the midpoint is the mean of the data. - - If 'median', the midpoint is the median of the data. - - If 'mid', the midpoint is the mean of 'min' and 'max' of the data. - - axis_type : Literal['axis', 'arrow'] | None - Whether to use regular axis or arrows as the axis. - arrow_length : float, default=0.25 - Length of the arrow head (px). - arrow_size : float, default=1 - Size of the arrow. - arrow_color : str, default='#3f3f3f' - Color of the arrows. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - arrow_angle : float, default=10 - Angle of the arrow head in degrees. - legend_ondata: bool, default=False - whether to show legend on data - ondata_size: float, default=12 - size of the legend (text) on data. - ondata_color: str, default='#3f3f3f' - color of the legend (text) on data - ondata_fontface: str, default='bold' - fontface of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-face - ondata_family: str, default='sans' - family of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-family - ondata_alpha: float, default=1 - alpha (transparency) of the legend on data. - ondata_weighted: bool, default=True - whether to use weighted mean for the legend on data. - If True, the weighted mean of the group means is used. - If False, the arithmetic mean of the group means is used. - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - PlotSpec - Dimensional reduction plot. - - """ - if not _is_variable_key(data, key): - msg = f"'{key}' is not present in `variable` names" - raise ValueError(msg) - return dimensional( - data=data, - key=key, - mapping=mapping, - dimensions=dimensions, - use_key=use_key, - xy=xy, - size=size, - variable_keys=variable_keys, - tooltips=tooltips, - interactive=interactive, - observations_name=observations_name, - color_low=color_low, - color_mid=color_mid, - color_high=color_high, - mid_point=mid_point, - axis_type=axis_type, - arrow_length=arrow_length, - arrow_size=arrow_size, - arrow_color=arrow_color, - arrow_angle=arrow_angle, - legend_ondata=legend_ondata, - ondata_size=ondata_size, - ondata_color=ondata_color, - ondata_fontface=ondata_fontface, - ondata_family=ondata_family, - ondata_alpha=ondata_alpha, - ondata_weighted=ondata_weighted, - **point_kwargs, - )
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/core/subdimensionals.html b/docs/_build/_modules/cellestial/single/core/subdimensionals.html deleted file mode 100644 index e1f6337..0000000 --- a/docs/_build/_modules/cellestial/single/core/subdimensionals.html +++ /dev/null @@ -1,1789 +0,0 @@ - - - - - - - - - - cellestial.single.core.subdimensionals - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.core.subdimensionals

-from __future__ import annotations
-
-from collections.abc import Sequence
-from typing import TYPE_CHECKING, Literal
-
-from lets_plot import gggrid
-from lets_plot.plot.core import FeatureSpec, LayerSpec
-
-from cellestial.single.core.dimensional import dimensional
-from cellestial.single.core.subdimensional import expression, pca, tsne, umap
-from cellestial.util import _share_axis, _share_labels
-
-if TYPE_CHECKING:
-    from anndata import AnnData
-    from lets_plot.plot.subplots import SupPlotsSpec
-
-
-
-[docs] -def dimensionals( - data: AnnData, - keys: Sequence[str], - *, - mapping: FeatureSpec | None = None, - dimensions: Literal["umap", "pca", "tsne"] = "umap", - use_key: str | None = None, - xy: tuple[int, int] | Sequence[int] = (1, 2), - size: float = 0.8, - variable_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - color_low: str = "#e6e6e6", - color_mid: str | None = None, - color_high: str = "#377eb8", - mid_point: Literal["mean", "median", "mid"] | float = "median", - axis_type: Literal["axis", "arrow"] | None = None, - arrow_length: float = 0.25, - arrow_size: float = 1, - arrow_color: str = "#3f3f3f", - arrow_angle: float = 10, - legend_ondata: bool = False, - ondata_size: float = 12, - ondata_color: str = "#3f3f3f", - ondata_fontface: str = "bold", - ondata_family: str = "sans", - ondata_alpha: float = 1, - ondata_weighted: bool = True, - # multi plot args - share_labels: bool = True, - share_axis: bool = False, - layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, - # grid args - ncol: int | None = None, - sharex: str | None = None, - sharey: str | None = None, - widths: list[float] | None = None, - heights: list[float] | None = None, - hspace: float | None = None, - vspace: float | None = None, - fit: bool | None = None, - align: bool | None = None, - guides: str = "auto", - **point_kwargs, -) -> SupPlotsSpec: - """ - Grid of dimensionality reduction plots. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - keys : list[str] | tuple[str] | Sequence[str] - The keys (cell features) to color the points by. - e.g., 'leiden' or 'louvain' to color by clusters or gene name for expression. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - dimensions : Literal['umap', 'pca', 'tsne'], default='umap' - The dimensional reduction method to use. - e.g., 'umap' or 'pca' or 'tsne'. - xy : tuple[int, int] | Sequence[int], default=(1, 2) - The x and y axes to use for the plot. - e.g., (1, 2) for UMAP1 and UMAP2. - use_key : str, default=None - The specific key to use for the desired dimensions. - e.g., 'X_umap_2d' or 'X_pca_2d'. - Otherwise, the function will decide on the key based on the dimensions. - size : float, default=0.8 - The size of the points. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - cluster_name : str, default='Cluster' - The name to overwrite the clustering key in the dataframe and the plot. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - color_low : str, default='#e6e6e6' - The color to use for the low end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_mid : str, default=None - The color to use for the middle part of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_high : str, default='#377EB8' - The color to use for the high end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - mid_point : Literal['mean', 'median', 'mid'] | float, default='median' - The midpoint (in data value) of the color gradient. - Can be 'mean', 'median' and 'mid' or a number (float or int). - - If 'mean', the midpoint is the mean of the data. - - If 'median', the midpoint is the median of the data. - - If 'mid', the midpoint is the mean of 'min' and 'max' of the data. - - axis_type : Literal['axis', 'arrow'] | None - Whether to use regular axis or arrows as the axis. - arrow_length : float, default=0.25 - Length of the arrow head (px). - arrow_size : float, default=1 - Size of the arrow. - arrow_color : str, default='#3f3f3f' - Color of the arrows. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - arrow_angle : float, default=10 - Angle of the arrow head in degrees. - legend_ondata: bool, default=False - whether to show legend on data - ondata_size: float, default=12 - size of the legend (text) on data. - ondata_color: str, default='#3f3f3f' - color of the legend (text) on data - ondata_fontface: str, default='bold' - fontface of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-face - ondata_family: str, default='sans' - family of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-family - ondata_alpha: float, default=1 - alpha (transparency) of the legend on data. - ondata_weighted: bool, default=True - whether to use weighted mean for the legend on data. - If True, the weighted mean of the group means is used. - If False, the arithmetic mean of the group means is used. - share_labels : bool, default=True - Whether to share the labels across all plots. - If True, only X labels on bottom row and Y labels on left column are shown. - share_axis : bool, default=False - Whether to share the axis across all plots. - If True, only X axis on bottom row and Y axis on left column is shown. - layers : Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default=None - Layers to add to all the plots in the grid. - ncol : int, default=None - Number of columns in grid. If not specified, shows plots horizontally, in one row. - sharex, sharey : bool, default=None - Controls sharing of axis limits between subplots in the grid. - `all`/True - share limits between all subplots. - `none`/False - do not share limits between subplots. - `row` - share limits between subplots in the same row. - `col` - share limits between subplots in the same column. - widths : list[float], default=None - Relative width of each column of grid, left to right. - heights : list[float], default=None - Relative height of each row of grid, top-down. - hspace : float | None = None - Cell horizontal spacing in px. - vspace : float | None = None - Cell vertical spacing in px. - fit : bool, default=True - Whether to stretch each plot to match the aspect ratio of its cell (fit=True), - or to preserve the original aspect ratio of plots (fit=False). - align : bool, default=False - If True, align inner areas (i.e. “geom” bounds) of plots. - However, cells containing other (sub)grids are not participating - in the plot “inner areas” layouting. - guides : str, default='auto' - Specifies how guides (legends and colorbars) should be treated in the layout. - - 'collect' collect guides from all subplots, removing duplicates. - - 'keep' keep guides in their original subplots; do not collect at this level. - - 'auto' allow guides to be collected if an upper-level layout uses guides='collect'; - - otherwise, keep them in subplots. - Duplicates are identified by comparing visual properties: - For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). - For colorbars: title, domain limits, breaks, and color gradient. - - For more information on gggrid parameters: - https://lets-plot.org/python/pages/api/lets_plot.gggrid.html - - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - SupPlotsSpec - Grid of dimensionality reduction plots. - - """ - if not isinstance(keys, Sequence) or isinstance(keys, str): - msg = "keys must be an Sequence of strings" - raise TypeError(msg) - - plots = [] - for i, key in enumerate(keys): - plot = dimensional( - data=data, - key=key, - mapping=mapping, - dimensions=dimensions, - use_key=use_key, - xy=xy, - size=size, - variable_keys=variable_keys, - tooltips=tooltips, - interactive=interactive, - observations_name=observations_name, - color_low=color_low, - color_mid=color_mid, - color_high=color_high, - mid_point=mid_point, - axis_type=axis_type, - arrow_length=arrow_length, - arrow_size=arrow_size, - arrow_color=arrow_color, - arrow_angle=arrow_angle, - legend_ondata=legend_ondata, - ondata_size=ondata_size, - ondata_color=ondata_color, - ondata_fontface=ondata_fontface, - ondata_family=ondata_family, - ondata_alpha=ondata_alpha, - ondata_weighted=ondata_weighted, - **point_kwargs, - ) - - # handle the layers - if layers is not None: - if isinstance(layers, (FeatureSpec, LayerSpec)): - layers = [layers] - for layer in layers: - plot += layer - if share_labels: - plot = _share_labels(plot, i, keys, ncol) - if share_axis: - if axis_type is not None: - plot = _share_axis(plot, i, keys, ncol, axis_type) - - plots.append(plot) - - return gggrid( - plots, - ncol=ncol, - sharex=sharex, - sharey=sharey, - widths=widths, - heights=heights, - hspace=hspace, - vspace=vspace, - fit=fit, - align=align, - guides=guides, - )
- - - -
-[docs] -def umaps( - data: AnnData, - keys: Sequence[str], - *, - mapping: FeatureSpec | None = None, - use_key: str | None = None, - xy: tuple[int, int] | Sequence[int] = (1, 2), - size: float = 0.8, - variable_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - color_low: str = "#e6e6e6", - color_mid: str | None = None, - color_high: str = "#377eb8", - mid_point: Literal["mean", "median", "mid"] | float = "median", - axis_type: Literal["axis", "arrow"] | None = None, - arrow_length: float = 0.25, - arrow_size: float = 1, - arrow_color: str = "#3f3f3f", - arrow_angle: float = 10, - legend_ondata: bool = False, - ondata_size: float = 12, - ondata_color: str = "#3f3f3f", - ondata_fontface: str = "bold", - ondata_family: str = "sans", - ondata_alpha: float = 1, - ondata_weighted: bool = True, - # multi plot args - share_labels: bool = True, - share_axis: bool = False, - layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, - # grid args - ncol: int | None = None, - sharex: str | None = None, - sharey: str | None = None, - widths: list[float] | None = None, - heights: list[float] | None = None, - hspace: float | None = None, - vspace: float | None = None, - fit: bool | None = None, - align: bool | None = None, - guides: str = "auto", - **point_kwargs, -) -> SupPlotsSpec: - """ - Grid of dimensionality reduction plots. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - keys : list[str] | tuple[str] | Sequence[str] - The keys (cell features) to color the points by. - e.g., 'leiden' or 'louvain' to color by clusters or gene name for expression. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - xy : tuple[int, int] | Sequence[int], default=(1, 2) - The x and y axes to use for the plot. - e.g., (1, 2) for UMAP1 and UMAP2. - use_key : str, default=None - The specific key to use for the desired dimensions. - e.g., 'X_umap_2d' or 'X_pca_2d'. - Otherwise, the function will decide on the key based on the dimensions. - size : float, default=0.8 - The size of the points. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - cluster_name : str, default='Cluster' - The name to overwrite the clustering key in the dataframe and the plot. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - color_low : str, default='#e6e6e6' - The color to use for the low end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_mid : str, default=None - The color to use for the middle part of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_high : str, default='#377EB8' - The color to use for the high end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - mid_point : Literal['mean', 'median', 'mid'] | float, default='median' - The midpoint (in data value) of the color gradient. - Can be 'mean', 'median' and 'mid' or a number (float or int). - - If 'mean', the midpoint is the mean of the data. - - If 'median', the midpoint is the median of the data. - - If 'mid', the midpoint is the mean of 'min' and 'max' of the data. - - axis_type : Literal['axis', 'arrow'] | None - Whether to use regular axis or arrows as the axis. - arrow_length : float, default=0.25 - Length of the arrow head (px). - arrow_size : float, default=1 - Size of the arrow. - arrow_color : str, default='#3f3f3f' - Color of the arrows. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - arrow_angle : float, default=10 - Angle of the arrow head in degrees. - legend_ondata: bool, default=False - whether to show legend on data - ondata_size: float, default=12 - size of the legend (text) on data. - ondata_color: str, default='#3f3f3f' - color of the legend (text) on data - ondata_fontface: str, default='bold' - fontface of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-face - ondata_family: str, default='sans' - family of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-family - ondata_alpha: float, default=1 - alpha (transparency) of the legend on data. - ondata_weighted: bool, default=True - whether to use weighted mean for the legend on data. - If True, the weighted mean of the group means is used. - If False, the arithmetic mean of the group means is used. - share_labels : bool, default=True - Whether to share the labels across all plots. - If True, only X labels on bottom row and Y labels on left column are shown. - share_axis : bool, default=False - Whether to share the axis across all plots. - If True, only X axis on bottom row and Y axis on left column is shown. - layers : Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default=None - Layers to add to all the plots in the grid. - ncol : int, default=None - Number of columns in grid. If not specified, shows plots horizontally, in one row. - sharex, sharey : bool, default=None - Controls sharing of axis limits between subplots in the grid. - `all`/True - share limits between all subplots. - `none`/False - do not share limits between subplots. - `row` - share limits between subplots in the same row. - `col` - share limits between subplots in the same column. - widths : list[float], default=None - Relative width of each column of grid, left to right. - heights : list[float], default=None - Relative height of each row of grid, top-down. - hspace : float | None = None - Cell horizontal spacing in px. - vspace : float | None = None - Cell vertical spacing in px. - fit : bool, default=True - Whether to stretch each plot to match the aspect ratio of its cell (fit=True), - or to preserve the original aspect ratio of plots (fit=False). - align : bool, default=False - If True, align inner areas (i.e. “geom” bounds) of plots. - However, cells containing other (sub)grids are not participating - in the plot “inner areas” layouting. - guides : str, default='auto' - Specifies how guides (legends and colorbars) should be treated in the layout. - - 'collect' collect guides from all subplots, removing duplicates. - - 'keep' keep guides in their original subplots; do not collect at this level. - - 'auto' allow guides to be collected if an upper-level layout uses guides='collect'; - - otherwise, keep them in subplots. - Duplicates are identified by comparing visual properties: - For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). - For colorbars: title, domain limits, breaks, and color gradient. - - For more information on gggrid parameters: - https://lets-plot.org/python/pages/api/lets_plot.gggrid.html - - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - SupPlotsSpec - Grid of dimensionality reduction plots. - - """ - if not isinstance(keys, Sequence) or isinstance(keys, str): - msg = "keys must be an Sequence of strings" - raise TypeError(msg) - - plots = [] - for i, key in enumerate(keys): - plot = umap( - data=data, - key=key, - mapping=mapping, - use_key=use_key, - xy=xy, - size=size, - variable_keys=variable_keys, - tooltips=tooltips, - interactive=interactive, - observations_name=observations_name, - color_low=color_low, - color_mid=color_mid, - color_high=color_high, - mid_point=mid_point, - axis_type=axis_type, - arrow_length=arrow_length, - arrow_size=arrow_size, - arrow_color=arrow_color, - arrow_angle=arrow_angle, - legend_ondata=legend_ondata, - ondata_size=ondata_size, - ondata_color=ondata_color, - ondata_fontface=ondata_fontface, - ondata_family=ondata_family, - ondata_alpha=ondata_alpha, - ondata_weighted=ondata_weighted, - **point_kwargs, - ) - - # handle the layers - if layers is not None: - if isinstance(layers, (FeatureSpec, LayerSpec)): - layers = [layers] - for layer in layers: - plot += layer - if share_labels: - plot = _share_labels(plot, i, keys, ncol) - if share_axis: - if axis_type is not None: - plot = _share_axis(plot, i, keys, ncol, axis_type) - - plots.append(plot) - - return gggrid( - plots, - ncol=ncol, - sharex=sharex, - sharey=sharey, - widths=widths, - heights=heights, - hspace=hspace, - vspace=vspace, - fit=fit, - align=align, - guides=guides, - )
- - - -
-[docs] -def tsnes( - data: AnnData, - keys: Sequence[str], - *, - mapping: FeatureSpec | None = None, - use_key: str | None = None, - xy: tuple[int, int] | Sequence[int] = (1, 2), - size: float = 0.8, - variable_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - color_low: str = "#e6e6e6", - color_mid: str | None = None, - color_high: str = "#377eb8", - mid_point: Literal["mean", "median", "mid"] | float = "median", - axis_type: Literal["axis", "arrow"] | None = None, - arrow_length: float = 0.25, - arrow_size: float = 1, - arrow_color: str = "#3f3f3f", - arrow_angle: float = 10, - legend_ondata: bool = False, - ondata_size: float = 12, - ondata_color: str = "#3f3f3f", - ondata_fontface: str = "bold", - ondata_family: str = "sans", - ondata_alpha: float = 1, - ondata_weighted: bool = True, - # multi plot args - share_labels: bool = True, - share_axis: bool = False, - layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, - # grid args - ncol: int | None = None, - sharex: str | None = None, - sharey: str | None = None, - widths: list[float] | None = None, - heights: list[float] | None = None, - hspace: float | None = None, - vspace: float | None = None, - fit: bool | None = None, - align: bool | None = None, - guides: str = "auto", - **point_kwargs, -) -> SupPlotsSpec: - """ - Grid of dimensionality reduction plots. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - keys : list[str] | tuple[str] | Sequence[str] - The keys (cell features) to color the points by. - e.g., 'leiden' or 'louvain' to color by clusters or gene name for expression. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - xy : tuple[int, int] | Sequence[int], default=(1, 2) - The x and y axes to use for the plot. - e.g., (1, 2) for UMAP1 and UMAP2. - use_key : str, default=None - The specific key to use for the desired dimensions. - e.g., 'X_umap_2d' or 'X_pca_2d'. - Otherwise, the function will decide on the key based on the dimensions. - size : float, default=0.8 - The size of the points. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - cluster_name : str, default='Cluster' - The name to overwrite the clustering key in the dataframe and the plot. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - color_low : str, default='#e6e6e6' - The color to use for the low end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_mid : str, default=None - The color to use for the middle part of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_high : str, default='#377EB8' - The color to use for the high end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - mid_point : Literal['mean', 'median', 'mid'] | float, default='median' - The midpoint (in data value) of the color gradient. - Can be 'mean', 'median' and 'mid' or a number (float or int). - - If 'mean', the midpoint is the mean of the data. - - If 'median', the midpoint is the median of the data. - - If 'mid', the midpoint is the mean of 'min' and 'max' of the data. - - axis_type : Literal['axis', 'arrow'] | None - Whether to use regular axis or arrows as the axis. - arrow_length : float, default=0.25 - Length of the arrow head (px). - arrow_size : float, default=1 - Size of the arrow. - arrow_color : str, default='#3f3f3f' - Color of the arrows. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - arrow_angle : float, default=10 - Angle of the arrow head in degrees. - legend_ondata: bool, default=False - whether to show legend on data - ondata_size: float, default=12 - size of the legend (text) on data. - ondata_color: str, default='#3f3f3f' - color of the legend (text) on data - ondata_fontface: str, default='bold' - fontface of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-face - ondata_family: str, default='sans' - family of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-family - ondata_alpha: float, default=1 - alpha (transparency) of the legend on data. - ondata_weighted: bool, default=True - whether to use weighted mean for the legend on data. - If True, the weighted mean of the group means is used. - If False, the arithmetic mean of the group means is used. - share_labels : bool, default=True - Whether to share the labels across all plots. - If True, only X labels on bottom row and Y labels on left column are shown. - share_axis : bool, default=False - Whether to share the axis across all plots. - If True, only X axis on bottom row and Y axis on left column is shown. - layers : Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default=None - Layers to add to all the plots in the grid. - ncol : int, default=None - Number of columns in grid. If not specified, shows plots horizontally, in one row. - sharex, sharey : bool, default=None - Controls sharing of axis limits between subplots in the grid. - `all`/True - share limits between all subplots. - `none`/False - do not share limits between subplots. - `row` - share limits between subplots in the same row. - `col` - share limits between subplots in the same column. - widths : list[float], default=None - Relative width of each column of grid, left to right. - heights : list[float], default=None - Relative height of each row of grid, top-down. - hspace : float | None = None - Cell horizontal spacing in px. - vspace : float | None = None - Cell vertical spacing in px. - fit : bool, default=True - Whether to stretch each plot to match the aspect ratio of its cell (fit=True), - or to preserve the original aspect ratio of plots (fit=False). - align : bool, default=False - If True, align inner areas (i.e. “geom” bounds) of plots. - However, cells containing other (sub)grids are not participating - in the plot “inner areas” layouting. - guides : str, default='auto' - Specifies how guides (legends and colorbars) should be treated in the layout. - - 'collect' collect guides from all subplots, removing duplicates. - - 'keep' keep guides in their original subplots; do not collect at this level. - - 'auto' allow guides to be collected if an upper-level layout uses guides='collect'; - - otherwise, keep them in subplots. - Duplicates are identified by comparing visual properties: - For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). - For colorbars: title, domain limits, breaks, and color gradient. - - For more information on gggrid parameters: - https://lets-plot.org/python/pages/api/lets_plot.gggrid.html - - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - SupPlotsSpec - Grid of dimensionality reduction plots. - - """ - if not isinstance(keys, Sequence) or isinstance(keys, str): - msg = "keys must be an Sequence of strings" - raise TypeError(msg) - - plots = [] - for i, key in enumerate(keys): - plot = tsne( - data=data, - key=key, - mapping=mapping, - use_key=use_key, - xy=xy, - size=size, - variable_keys=variable_keys, - tooltips=tooltips, - interactive=interactive, - observations_name=observations_name, - color_low=color_low, - color_mid=color_mid, - color_high=color_high, - mid_point=mid_point, - axis_type=axis_type, - arrow_length=arrow_length, - arrow_size=arrow_size, - arrow_color=arrow_color, - legend_ondata=legend_ondata, - ondata_size=ondata_size, - ondata_color=ondata_color, - ondata_fontface=ondata_fontface, - ondata_family=ondata_family, - ondata_alpha=ondata_alpha, - ondata_weighted=ondata_weighted, - **point_kwargs, - ) - - # handle the layers - if layers is not None: - if isinstance(layers, (FeatureSpec, LayerSpec)): - layers = [layers] - for layer in layers: - plot += layer - if share_labels: - plot = _share_labels(plot, i, keys, ncol) - if share_axis: - if axis_type is not None: - plot = _share_axis(plot, i, keys, ncol, axis_type) - - plots.append(plot) - - return gggrid( - plots, - ncol=ncol, - sharex=sharex, - sharey=sharey, - widths=widths, - heights=heights, - hspace=hspace, - vspace=vspace, - fit=fit, - align=align, - guides=guides, - )
- - - -
-[docs] -def pcas( - data: AnnData, - keys: Sequence[str], - *, - mapping: FeatureSpec | None = None, - use_key: str | None = None, - xy: tuple[int, int] | Sequence[int] = (1, 2), - size: float = 0.8, - variable_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - color_low: str = "#e6e6e6", - color_mid: str | None = None, - color_high: str = "#377eb8", - mid_point: Literal["mean", "median", "mid"] | float = "median", - axis_type: Literal["axis", "arrow"] | None = None, - arrow_length: float = 0.25, - arrow_size: float = 1, - arrow_color: str = "#3f3f3f", - arrow_angle: float = 10, - legend_ondata: bool = False, - ondata_size: float = 12, - ondata_color: str = "#3f3f3f", - ondata_fontface: str = "bold", - ondata_family: str = "sans", - ondata_alpha: float = 1, - ondata_weighted: bool = True, - # multi plot args - share_labels: bool = True, - share_axis: bool = False, - layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, - # grid args - ncol: int | None = None, - sharex: str | None = None, - sharey: str | None = None, - widths: list[float] | None = None, - heights: list[float] | None = None, - hspace: float | None = None, - vspace: float | None = None, - fit: bool | None = None, - align: bool | None = None, - guides: str = "auto", - **point_kwargs, -) -> SupPlotsSpec: - """ - Grid of dimensionality reduction plots. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - keys : list[str] | tuple[str] | Sequence[str] - The keys (cell features) to color the points by. - e.g., 'leiden' or 'louvain' to color by clusters or gene name for expression. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - xy : tuple[int, int] | Sequence[int], default=(1, 2) - The x and y axes to use for the plot. - e.g., (1, 2) for UMAP1 and UMAP2. - use_key : str, default=None - The specific key to use for the desired dimensions. - e.g., 'X_umap_2d' or 'X_pca_2d'. - Otherwise, the function will decide on the key based on the dimensions. - size : float, default=0.8 - The size of the points. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - cluster_name : str, default='Cluster' - The name to overwrite the clustering key in the dataframe and the plot. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - color_low : str, default='#e6e6e6' - The color to use for the low end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_mid : str, default=None - The color to use for the middle part of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_high : str, default='#377EB8' - The color to use for the high end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - mid_point : Literal['mean', 'median', 'mid'] | float, default='median' - The midpoint (in data value) of the color gradient. - Can be 'mean', 'median' and 'mid' or a number (float or int). - - If 'mean', the midpoint is the mean of the data. - - If 'median', the midpoint is the median of the data. - - If 'mid', the midpoint is the mean of 'min' and 'max' of the data. - - axis_type : Literal['axis', 'arrow'] | None - Whether to use regular axis or arrows as the axis. - arrow_length : float, default=0.25 - Length of the arrow head (px). - arrow_size : float, default=1 - Size of the arrow. - arrow_color : str, default='#3f3f3f' - Color of the arrows. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - arrow_angle : float, default=10 - Angle of the arrow head in degrees. - legend_ondata: bool, default=False - whether to show legend on data - ondata_size: float, default=12 - size of the legend (text) on data. - ondata_color: str, default='#3f3f3f' - color of the legend (text) on data - ondata_fontface: str, default='bold' - fontface of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-face - ondata_family: str, default='sans' - family of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-family - ondata_alpha: float, default=1 - alpha (transparency) of the legend on data. - ondata_weighted: bool, default=True - whether to use weighted mean for the legend on data. - If True, the weighted mean of the group means is used. - If False, the arithmetic mean of the group means is used. - share_labels : bool, default=True - Whether to share the labels across all plots. - If True, only X labels on bottom row and Y labels on left column are shown. - share_axis : bool, default=False - Whether to share the axis across all plots. - If True, only X axis on bottom row and Y axis on left column is shown. - layers : Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default=None - Layers to add to all the plots in the grid. - ncol : int, default=None - Number of columns in grid. If not specified, shows plots horizontally, in one row. - sharex, sharey : bool, default=None - Controls sharing of axis limits between subplots in the grid. - `all`/True - share limits between all subplots. - `none`/False - do not share limits between subplots. - `row` - share limits between subplots in the same row. - `col` - share limits between subplots in the same column. - widths : list[float], default=None - Relative width of each column of grid, left to right. - heights : list[float], default=None - Relative height of each row of grid, top-down. - hspace : float | None = None - Cell horizontal spacing in px. - vspace : float | None = None - Cell vertical spacing in px. - fit : bool, default=True - Whether to stretch each plot to match the aspect ratio of its cell (fit=True), - or to preserve the original aspect ratio of plots (fit=False). - align : bool, default=False - If True, align inner areas (i.e. “geom” bounds) of plots. - However, cells containing other (sub)grids are not participating - in the plot “inner areas” layouting. - guides : str, default='auto' - Specifies how guides (legends and colorbars) should be treated in the layout. - - 'collect' collect guides from all subplots, removing duplicates. - - 'keep' keep guides in their original subplots; do not collect at this level. - - 'auto' allow guides to be collected if an upper-level layout uses guides='collect'; - - otherwise, keep them in subplots. - Duplicates are identified by comparing visual properties: - For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). - For colorbars: title, domain limits, breaks, and color gradient. - - For more information on gggrid parameters: - https://lets-plot.org/python/pages/api/lets_plot.gggrid.html - - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - SupPlotsSpec - Grid of dimensionality reduction plots. - - """ - if not isinstance(keys, Sequence) or isinstance(keys, str): - msg = "keys must be an Sequence of strings" - raise TypeError(msg) - - plots = [] - for i, key in enumerate(keys): - plot = pca( - data=data, - key=key, - mapping=mapping, - use_key=use_key, - xy=xy, - size=size, - variable_keys=variable_keys, - tooltips=tooltips, - interactive=interactive, - observations_name=observations_name, - color_low=color_low, - color_mid=color_mid, - color_high=color_high, - mid_point=mid_point, - axis_type=axis_type, - arrow_length=arrow_length, - arrow_size=arrow_size, - arrow_color=arrow_color, - arrow_angle=arrow_angle, - legend_ondata=legend_ondata, - ondata_size=ondata_size, - ondata_color=ondata_color, - ondata_fontface=ondata_fontface, - ondata_family=ondata_family, - ondata_alpha=ondata_alpha, - ondata_weighted=ondata_weighted, - **point_kwargs, - ) - - # handle the layers - if layers is not None: - if isinstance(layers, (FeatureSpec, LayerSpec)): - layers = [layers] - for layer in layers: - plot += layer - if share_labels: - plot = _share_labels(plot, i, keys, ncol) - if share_axis: - if axis_type is not None: - plot = _share_axis(plot, i, keys, ncol, axis_type) - - plots.append(plot) - - return gggrid( - plots, - ncol=ncol, - sharex=sharex, - sharey=sharey, - widths=widths, - heights=heights, - hspace=hspace, - vspace=vspace, - fit=fit, - align=align, - guides=guides, - )
- - - -
-[docs] -def expressions( - data: AnnData, - keys: Sequence[str], - *, - mapping: FeatureSpec | None = None, - dimensions: Literal["umap", "pca", "tsne"] = "umap", - use_key: str | None = None, - xy: tuple[int, int] | Sequence[int] = (1, 2), - size: float = 0.8, - variable_keys: Sequence[str] | str | None = None, - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - observations_name: str = "Barcode", - color_low: str = "#e6e6e6", - color_mid: str | None = None, - color_high: str = "#377eb8", - mid_point: Literal["mean", "median", "mid"] | float = "median", - axis_type: Literal["axis", "arrow"] | None = None, - arrow_length: float = 0.25, - arrow_size: float = 1, - arrow_color: str = "#3f3f3f", - arrow_angle: float = 10, - legend_ondata: bool = False, - ondata_size: float = 12, - ondata_color: str = "#3f3f3f", - ondata_fontface: str = "bold", - ondata_family: str = "sans", - ondata_alpha: float = 1, - ondata_weighted: bool = True, - # multi plot args - share_labels: bool = True, - share_axis: bool = False, - layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, - # grid args - ncol: int | None = None, - sharex: str | None = None, - sharey: str | None = None, - widths: list[float] | None = None, - heights: list[float] | None = None, - hspace: float | None = None, - vspace: float | None = None, - fit: bool | None = None, - align: bool | None = None, - guides: str = "auto", - **point_kwargs, -) -> SupPlotsSpec: - """ - Grid of dimensionality reduction plots. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - keys : list[str] | tuple[str] | Sequence[str] - The keys (gene names) to color the points by. - mapping : FeatureSpec | None, default=None - Additional aesthetic mappings for the plot, the result of `aes()`. - dimensions : Literal['umap', 'pca', 'tsne'], default='umap' - The dimensional reduction method to use. - e.g., 'umap' or 'pca' or 'tsne'. - xy : tuple[int, int] | Sequence[int], default=(1, 2) - The x and y axes to use for the plot. - e.g., (1, 2) for UMAP1 and UMAP2. - use_key : str, default=None - The specific key to use for the desired dimensions. - e.g., 'X_umap_2d' or 'X_pca_2d'. - Otherwise, the function will decide on the key based on the dimensions. - size : float, default=0.8 - The size of the points. - variable_keys : str | Sequence[str] | None, default=None - Variable keys to add to the DataFrame. If None, no additional keys are added. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - cluster_name : str, default='Cluster' - The name to overwrite the clustering key in the dataframe and the plot. - observations_name : str, default='Barcode' - The name to give to barcode (or index) column in the dataframe. - color_low : str, default='#e6e6e6' - The color to use for the low end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_mid : str, default=None - The color to use for the middle part of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - color_high : str, default='#377EB8' - The color to use for the high end of the color gradient. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - mid_point : Literal['mean', 'median', 'mid'] | float, default='median' - The midpoint (in data value) of the color gradient. - Can be 'mean', 'median' and 'mid' or a number (float or int). - - If 'mean', the midpoint is the mean of the data. - - If 'median', the midpoint is the median of the data. - - If 'mid', the midpoint is the mean of 'min' and 'max' of the data. - - axis_type : Literal['axis', 'arrow'] | None - Whether to use regular axis or arrows as the axis. - arrow_length : float, default=0.25 - Length of the arrow head (px). - arrow_size : float, default=1 - Size of the arrow. - arrow_color : str, default='#3f3f3f' - Color of the arrows. - - Accepts: - - hex code e.g. '#f1f1f1' - - color name (of a limited set of colors). - - RGB/RGBA e.g. 'rgb(0, 0, 255)', 'rgba(0, 0, 255, 0.5)'. - - Applies to continuous (non-categorical) data. - - arrow_angle : float, default=10 - Angle of the arrow head in degrees. - legend_ondata: bool, default=False - whether to show legend on data - ondata_size: float, default=12 - size of the legend (text) on data. - ondata_color: str, default='#3f3f3f' - color of the legend (text) on data - ondata_fontface: str, default='bold' - fontface of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-face - ondata_family: str, default='sans' - family of the legend (text) on data. - https://lets-plot.org/python/pages/aesthetics.html#font-family - ondata_alpha: float, default=1 - alpha (transparency) of the legend on data. - ondata_weighted: bool, default=True - whether to use weighted mean for the legend on data. - If True, the weighted mean of the group means is used. - If False, the arithmetic mean of the group means is used. - share_labels : bool, default=True - Whether to share the labels across all plots. - If True, only X labels on bottom row and Y labels on left column are shown. - share_axis : bool, default=False - Whether to share the axis across all plots. - If True, only X axis on bottom row and Y axis on left column is shown. - layers : Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default=None - Layers to add to all the plots in the grid. - ncol : int, default=None - Number of columns in grid. If not specified, shows plots horizontally, in one row. - sharex, sharey : bool, default=None - Controls sharing of axis limits between subplots in the grid. - `all`/True - share limits between all subplots. - `none`/False - do not share limits between subplots. - `row` - share limits between subplots in the same row. - `col` - share limits between subplots in the same column. - widths : list[float], default=None - Relative width of each column of grid, left to right. - heights : list[float], default=None - Relative height of each row of grid, top-down. - hspace : float | None = None - Cell horizontal spacing in px. - vspace : float | None = None - Cell vertical spacing in px. - fit : bool, default=True - Whether to stretch each plot to match the aspect ratio of its cell (fit=True), - or to preserve the original aspect ratio of plots (fit=False). - align : bool, default=False - If True, align inner areas (i.e. “geom” bounds) of plots. - However, cells containing other (sub)grids are not participating - in the plot “inner areas” layouting. - guides : str, default='auto' - Specifies how guides (legends and colorbars) should be treated in the layout. - - 'collect' collect guides from all subplots, removing duplicates. - - 'keep' keep guides in their original subplots; do not collect at this level. - - 'auto' allow guides to be collected if an upper-level layout uses guides='collect'; - - otherwise, keep them in subplots. - Duplicates are identified by comparing visual properties: - For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). - For colorbars: title, domain limits, breaks, and color gradient. - - For more information on gggrid parameters: - https://lets-plot.org/python/pages/api/lets_plot.gggrid.html - - **point_kwargs - Additional parameters for the `geom_point` layer. - For more information on geom_point parameters, see: - https://lets-plot.org/python/pages/api/lets_plot.geom_point.html - - Returns - ------- - SupPlotsSpec - Grid of dimensionality reduction plots. - - """ - if not isinstance(keys, Sequence) or isinstance(keys, str): - msg = "keys must be an Sequence of strings" - raise TypeError(msg) - - plots = [] - for i, key in enumerate(keys): - plot = expression( - data=data, - key=key, - mapping=mapping, - dimensions=dimensions, - use_key=use_key, - xy=xy, - size=size, - variable_keys=variable_keys, - tooltips=tooltips, - interactive=interactive, - observations_name=observations_name, - color_low=color_low, - color_mid=color_mid, - color_high=color_high, - mid_point=mid_point, - axis_type=axis_type, - arrow_length=arrow_length, - arrow_size=arrow_size, - arrow_color=arrow_color, - arrow_angle=arrow_angle, - legend_ondata=legend_ondata, - ondata_size=ondata_size, - ondata_color=ondata_color, - ondata_fontface=ondata_fontface, - ondata_family=ondata_family, - ondata_alpha=ondata_alpha, - ondata_weighted=ondata_weighted, - **point_kwargs, - ) - - # handle the layers - if layers is not None: - if isinstance(layers, (FeatureSpec, LayerSpec)): - layers = [layers] - for layer in layers: - plot += layer - if share_labels: - plot = _share_labels(plot, i, keys, ncol) - if share_axis: - if axis_type is not None: - plot = _share_axis(plot, i, keys, ncol, axis_type) - - plots.append(plot) - - return gggrid( - plots, - ncol=ncol, - sharex=sharex, - sharey=sharey, - widths=widths, - heights=heights, - hspace=hspace, - vspace=vspace, - fit=fit, - align=align, - guides=guides, - )
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/single/special/dotplot.html b/docs/_build/_modules/cellestial/single/special/dotplot.html deleted file mode 100644 index 3812253..0000000 --- a/docs/_build/_modules/cellestial/single/special/dotplot.html +++ /dev/null @@ -1,613 +0,0 @@ - - - - - - - - - - cellestial.single.special.dotplot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.single.special.dotplot

-from __future__ import annotations
-
-import contextlib
-from collections.abc import Sequence
-from typing import TYPE_CHECKING, Literal
-
-import polars as pl
-from anndata import AnnData
-from lets_plot import (
-    aes,
-    geom_point,
-    ggplot,
-    ggtb,
-    layer_tooltips,
-    scale_color_gradient,
-    scale_fill_gradient,
-)
-from lets_plot.plot.core import FeatureSpec
-
-from cellestial.frames import build_frame
-from cellestial.themes import _THEME_DOTPLOT
-
-if TYPE_CHECKING:
-    from lets_plot.plot.core import PlotSpec
-
-
-
-[docs] -def dotplot( - data: AnnData, - keys: Sequence[str], - group_by: str, - *, - threshold: float = 0, - variables_name: str = "gene", - value_name: str = "expression", - color_low: str = "#e6e6e6", - color_high: str = "#D2042D", - fill: bool = False, - sort_by: str | Sequence[str] | None = None, - sort_order: Literal["ascending", "descending"] = "descending", - percentage_key: str = "pct_exp", - mean_key: str = "avg_exp", - tooltips: Literal["none"] | Sequence[str] | FeatureSpec | None = None, - interactive: bool = False, - **geom_kwargs, -) -> PlotSpec: - """ - Dotplot. - - Parameters - ---------- - data : AnnData - The AnnData object of the single cell data. - keys : Sequence[str] - The variable keys or names to include in the dotplot. - group_by : str - The key to group the data by. - threshold : float, default=0 - The expression threshold to consider a gene as expressed. - variables_name : str, default='gene' - The name of the variable column in the long format. - value_name : str, default='expression' - The name of the value column in the long format. - color_low : str, default='#e6e6e6' - The low color for the gradient. - color_high : str, default='#D2042D' - The high color for the gradient. - fill : bool, optional - Whether to use fill aesthetic instead of color, by default False. - sort_by : str | None - The column to sort the results by, by default None. - sort_order : str, default='descending' - The sort order, either 'ascending' or 'descending'. - percentage_key : str, default='pct_exp' - The name of the percentage column. - mean_key : str, default='avg_exp' - The name of the mean expression column. - tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None, default=None - Tooltips to show when hovering over the geom. - Accepts Sequence[str] or result of `layer_tooltips()` for more complex tooltips. - Use 'none' to disable tooltips. - show_tooltips : bool, default=True - Whether to show tooltips. - interactive : bool, default=False - Whether to make the plot interactive. - **geom_kwargs : Any - Additional keyword arguments for the geom_point layer. - - Returns - ------- - PlotSpec - Dotplot. - """ - # HANDLE: Data types - if not isinstance(data, AnnData): - msg = "data must be an `AnnData` object" - raise TypeError(msg) - # BUILD: dataframe - frame = build_frame(data=data, axis=0, variable_keys=keys) - index_columns = [x for x in frame.columns if x not in keys] - - # CRITICAL PARTS: Dataframe Operations - # 1. Unpivot frame - frame = frame.unpivot( - on=keys, - index=index_columns, - variable_name=variables_name, - value_name=value_name, - ) - # 2. Aggregate and compute stats - frame = frame.group_by([group_by, variables_name]).agg( - [ - pl.col(value_name).mean().alias(mean_key), - (pl.col(value_name) > threshold).mean().mul(100).alias(percentage_key), - ] - ) - - # HANDLE: Sorting - # In case of pseudo-categorical integer group_by temporarily cast to int for proper sorting - with contextlib.suppress(Exception): # supress errors if sorting fails - frame = ( - frame.with_columns(pl.col(group_by).cast(pl.String).cast(pl.Int64)).sort( - group_by, descending=True - ) - # .with_columns(pl.col(group_by).cast(pl.String).cast(pl.Categorical)) - ) - # perform sorting - if sort_by is not None: - frame = frame.sort( - by=sort_by, - descending=(sort_order == "descending"), - ) - # Cast back to categorical - if frame[group_by].dtype == pl.Int64: - frame = frame.with_columns( - pl.col(group_by).cast(pl.String).cast(pl.Categorical) - ) - - # HANDLE: tooltips - if tooltips is None: - tooltips = [variables_name, group_by] - tooltips_spec = layer_tooltips(tooltips) - elif tooltips == "none" or isinstance(tooltips, str): - tooltips_spec = tooltips - elif isinstance(tooltips, Sequence): - tooltips = list(tooltips) - tooltips_spec = layer_tooltips(tooltips) - if not set(tooltips).issubset(frame.columns): - missing = set(tooltips) - set(frame.columns) - msg = f"Some tooltip columns are not in the data: {missing}" - raise ValueError(msg) - elif isinstance(tooltips, FeatureSpec): - tooltips_spec = tooltips - - # BUILD: Dotplot - if not fill: # use color aesthetic - dtplt = ( - ggplot(frame, aes(x=variables_name, y=group_by)) - + geom_point( - aes(size=percentage_key, color=mean_key), tooltips=tooltips_spec, **geom_kwargs - ) - + scale_color_gradient(low=color_low, high=color_high) - ) - else: # elif fill: use fill aesthetic - dtplt = ( - ggplot(frame, aes(x=variables_name, y=group_by)) - + geom_point( - aes(size=percentage_key, fill=mean_key), tooltips=tooltips_spec, **geom_kwargs - ) - + scale_fill_gradient(low=color_low, high=color_high) - ) - - # ADD: layers - dtplt += _THEME_DOTPLOT - - # HANDLE: interactive - if interactive: - dtplt += ggtb(size_zoomin=-1) - - return dtplt
- -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/util/colors.html b/docs/_build/_modules/cellestial/util/colors.html deleted file mode 100644 index 0825d58..0000000 --- a/docs/_build/_modules/cellestial/util/colors.html +++ /dev/null @@ -1,517 +0,0 @@ - - - - - - - - - - cellestial.util.colors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.util.colors

-from lets_plot import (
-    LetsPlot,
-    aes,
-    element_rect,
-    geom_point,
-    geom_text,
-    gggrid,
-    ggplot,
-    ggsize,
-    theme,
-    theme_void,
-)
-
-# Hand-picked colors for cellestial
-TEAL = "#219B9D"
-BLUE = "#377EB8"
-RED = "#D2042D"
-CHERRY = "#AF1740"
-LIGHT_GRAY = "#E6E6E6"
-SNOW = "#F9F9F9"
-PURPLE = "#640D5F"
-PINK = "#E73879"
-ORANGE = "#F14A00"
-TEAL = "#219B9D"
-RED = "#D2042D"
-CHERRY = "#AF1740"
-BLUE = "#377EB8"
-LIGHT_GRAY = "#E6E6E6"
-
-
-
-[docs] -def show_colors(): - """Show a grid of hand-picked colors.""" - colors = { - "TEAL": TEAL, - "RED": RED, - "LIGHT_GRAY": LIGHT_GRAY, - "BLUE": BLUE, - "CHERRY": CHERRY, - "SNOW": SNOW, - "PURPLE": PURPLE, - "PINK": PINK, - "ORANGE": ORANGE, - } - - plots = [] - for color in colors: - text_color = "white" if color != "LIGHT_GRAY" and color != "SNOW" else "black" - - plot = ( - ggplot({"x": [1], "y": [1]}) - + geom_point(aes(x="x", y="y"), fill=colors[color], shape=22, size=90, color="#1f1f1f") - + geom_text( - aes(x="x", y="y"), - label=f"{color}\n", - color=text_color, - size=14, - fontface="bold", - family="Arial", - ) - + geom_text( - aes(x="x", y="y"), - label=f"\n{colors[color]}", - color=text_color, - size=10, - fontface="regular", - family="sans-serif", - ) - + theme_void() - + theme(panel_background=element_rect(color=colors[color], size=13)) - ) - plots.append(plot) - - ncol = 3 - nrow = len(colors) // ncol - if len(colors) % ncol != 0: - nrow += 1 - - return gggrid(plots, ncol=3, hspace=0, vspace=0) + ggsize(ncol * 200, nrow * 200)
- - - -if __name__ == "__main__": - LetsPlot.setup_html() - show_colors().to_html("colors.html") -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/cellestial/util/utilities.html b/docs/_build/_modules/cellestial/util/utilities.html deleted file mode 100644 index b854ff9..0000000 --- a/docs/_build/_modules/cellestial/util/utilities.html +++ /dev/null @@ -1,1079 +0,0 @@ - - - - - - - - - - cellestial.util.utilities - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -

Source code for cellestial.util.utilities

-from __future__ import annotations
-
-from collections.abc import Sequence
-from math import ceil, log10
-from typing import TYPE_CHECKING, Literal
-
-from anndata import AnnData
-from lets_plot import (
-    arrow,
-    element_blank,
-    element_text,
-    geom_blank,
-    geom_segment,
-    gggrid,
-    guide_legend,
-    guides,
-    layer_tooltips,
-    scale_color_continuous,
-    scale_color_gradient2,
-    theme,
-)
-from lets_plot.plot.core import PlotSpec
-from lets_plot.plot.subplots import SupPlotsSpec
-
-if TYPE_CHECKING:
-    import polars as pl
-    from lets_plot.plot.core import FeatureSpec
-
-
-def _add_arrow_axis(
-    frame: pl.DataFrame,
-    *,
-    x: str,
-    y: str,
-    axis_type: Literal["axis", "arrow"] | None,
-    arrow_size: float,
-    arrow_color: str,
-    arrow_angle: float,
-    arrow_length: float,
-):
-    """
-    Adds arrows as the X and Y axis to the plot.
-
-    Parameters
-    ----------
-    frame : `polars.DataFrame`
-        DataFrame copied from the single cell data.
-    x : str
-        Name of the x axis column.
-    y : str
-        Name of the y axis column.
-    axis_type : Literal['axis', 'arrow'] | None
-        Whether to use regular axis or arrows as the axis.
-    arrow_size : float
-        Size of the arrow.
-    arrow_color : str
-        Color of the arrow.
-    arrow_angle : float
-        Angle of the arrow head in degrees.
-    arrow_length : float
-        Length of the arrow head (px).
-
-    Returns
-    -------
-    `FeatureSpec` or `FeatureSpecArray`
-        Theme feature specification.
-
-    for more information on the arrow parameters, see:
-    https://lets-plot.org/python/pages/api/lets_plot.arrow.html
-    """
-    if axis_type is None:
-        return theme(
-            # remove axis elements
-            axis_text_x=element_blank(),
-            axis_text_y=element_blank(),
-            axis_ticks_y=element_blank(),
-            axis_ticks_x=element_blank(),
-            axis_line=element_blank(),
-        )
-
-    elif axis_type == "axis":
-        return geom_blank()
-
-    elif axis_type == "arrow":
-        new_layer = theme(
-            # remove axis elements
-            axis_text_x=element_blank(),
-            axis_text_y=element_blank(),
-            axis_ticks_y=element_blank(),
-            axis_ticks_x=element_blank(),
-            axis_line=element_blank(),
-            # position axis titles according to arrow size
-            axis_title_x=element_text(hjust=arrow_length / 2.5),  # better than 2
-            axis_title_y=element_text(hjust=arrow_length / 2.5),
-        )
-        x_max = frame[x].max()
-        x_min = frame[x].min()
-        y_max = frame[y].max()
-        y_min = frame[y].min()
-
-        # find total difference between the max and min for both axis
-        x_diff = x_max - x_min  # ty:ignore[unsupported-operator]
-        y_diff = y_max - y_min  # ty:ignore[unsupported-operator]
-
-        # find the ends of the arrows
-        # ensure the arrow length is the same for both axis
-        xend = x_min + arrow_length * min(y_diff, x_diff)
-        yend = y_min + arrow_length * min(y_diff, x_diff)
-
-        # adjust bottom ends of arrows
-        adjust_rate = 0.025
-        x0 = x_min - x_diff * adjust_rate
-        y0 = y_min - y_diff * adjust_rate
-
-        # X axis
-        new_layer += geom_segment(
-            x=x0,
-            y=y0,
-            xend=xend,
-            yend=y0,
-            color=arrow_color,
-            size=arrow_size,
-            arrow=arrow(arrow_angle),
-        )
-        # Y axis
-        new_layer += geom_segment(
-            x=x0,
-            y=y0,
-            xend=x0,
-            yend=yend,
-            color=arrow_color,
-            size=arrow_size,
-            arrow=arrow(arrow_angle),
-        )
-    else:
-        msg = f"expected 'axis' or 'arrow' for 'axis_type' argument, but received {axis_type}"
-        raise ValueError(msg)
-
-    return new_layer
-
-
-# TODO: Deprecate
-def _decide_tooltips(
-    base_tooltips: Sequence[str] | str | None,
-    add_tooltips: Sequence[str] | str | None,
-    custom_tooltips: Sequence[str] | str | None,
-    *,
-    show_tooltips: bool,
-) -> list[str] | Literal["none"]:
-    """
-    Decide on the tooltips.
-
-    Parameters
-    ----------
-    base_tooltips : list[str] | str
-        Base tooltips, default ones by the function.
-    add_tooltips : list[str] | str
-        Additional tooltips, will be appended to the base_tooltips.
-    custom_tooltips : list[str] | str
-        Custom tooltips, will overwrite the base_tooltips.
-    show_tooltips : bool
-        Whether to show tooltips at all.
-        Set tooltip to the Literal 'none' if False.
-
-    Returns
-    -------
-    list[str]
-        Tooltips.
-    """
-    # PART 1: CONVERT str TO list
-    if isinstance(base_tooltips, str):
-        base_tooltips = [base_tooltips]
-    elif base_tooltips is None:
-        base_tooltips = []
-    if isinstance(add_tooltips, str):
-        add_tooltips = [add_tooltips]
-    if isinstance(custom_tooltips, str):
-        custom_tooltips = [custom_tooltips]
-
-    # PART 2: HANDLE TOOLTIP LOGIC
-    if not show_tooltips:
-        tooltips = "none"  # for letsplot, this removes the tooltips
-    else:
-        if isinstance(custom_tooltips, Sequence):
-            tooltips = list(custom_tooltips)
-        elif isinstance(add_tooltips, Sequence):
-            tooltips = list(base_tooltips) + list(add_tooltips)
-        else:
-            tooltips = list(base_tooltips)
-
-    return tooltips
-
-
-def _build_tooltips(
-    *,
-    tooltips: list[str] | str,
-    cluster_name: str,
-    key: str | None = None,
-    title: str | None = None,
-    clustering: bool = False,
-) -> FeatureSpec | Literal["none"]:
-    """Crete the tooltips for the plot."""
-    if tooltips == "none":
-        return "none"
-
-    tooltips_object = layer_tooltips()
-    for tooltip in tooltips:
-        if clustering:
-            if tooltip != key:
-                tooltips_object.line(f"{tooltip}|@{tooltip}")
-            else:
-                tooltips_object.line(f"{cluster_name}|@{key}")
-        else:
-            tooltips_object.line(f"{tooltip}|@{tooltip}")
-    if title is not None:
-        tooltips_object.title(title)
-
-    return tooltips_object
-
-
-def _range_inclusive(start: float, stop: float, step: int) -> list[float]:
-    """Return a list of rounded numbers between start and stop, inclusive."""
-    decimals = 0
-    if stop - start < 1:
-        if stop - start == 0:
-            return [start]
-        decimals = -round(log10(stop - start)) + 1
-
-    diff = round(stop - start, decimals)
-    increment = round(diff / (step - 1), decimals + 1)
-    inc_list = []
-
-    for i in range(step):
-        inc_list.append(round(start + increment * i, decimals + 2))
-    # make unique
-    inc_list = list(set(inc_list))
-    return sorted(inc_list)
-
-
-def _color_gradient(
-    series,
-    color_low=None,
-    color_mid=None,
-    color_high=None,
-    mid_point: Literal["mean", "median", "mid"] | float = "median",
-) -> FeatureSpec:
-    """
-    Create a gradient color feature.
-
-    Parameters
-    ----------
-    series : polars.Series
-        Series to find the mid point of.
-    color_low : str
-        The color to use for the low end of the color gradient.
-    color_mid : str
-       The color to use for the mid part of the color gradient.
-    color_high : str
-        The color to use for the high end of the color gradient.
-    mid_point : float, default='median'
-        The midpoint (in data value) of the color gradient.
-        Can be 'mean', 'median' and 'mid' or a number (float or int).
-        If 'mean', the midpoint is the mean of the data.
-        If 'median', the midpoint is the median of the data.
-        If 'mid', the midpoint is the mean of 'min' and 'max' of the data.
-
-    Returns
-    -------
-    FeatureSpec
-        FeatureSpec object with the gradient color feature.
-    """
-    if color_mid is None:
-        return scale_color_continuous(low=color_low, high=color_high)
-    else:
-        if isinstance(mid_point, (float, int)):
-            mid_value = mid_point
-        elif mid_point == "mean":
-            mid_value = series.mean()
-        elif mid_point == "median":
-            mid_value = series.median()
-        elif mid_point == "mid":
-            mid_value = (series.max() + series.min()) / 2
-
-        return scale_color_gradient2(
-            low=color_low,
-            mid=color_mid,
-            high=color_high,
-            midpoint=mid_value,
-        )
-
-
-
-[docs] -def get_mapping(plot: PlotSpec, *, index=0) -> dict: - """Returns the mapping of the plot.""" - return { - **plot.as_dict().get("mapping"), # from the global mapping, - **plot.as_dict().get("layers")[index].get("mapping"), # from a layer. - }
- - - -
-[docs] -def retrieve(plot: PlotSpec | SupPlotsSpec, index: int = 0) -> pl.DataFrame: - """ - Retrieves the dataframe from a PlotSpec or SupPlotsSpec using the index. - - plot : PlotSpec | SupPlotsSpec - The plot to retrieve the dataframe from. - index : int, optional - The index of the figure to retrieve the dataframe from, by default 0 - - Returns - ------- - pl.DataFrame - The dataframe utilized in the plot. - - Raises - ------ - TypeError - If the plot is not a PlotSpec or SupPlotsSpec object. - """ - if isinstance(plot, PlotSpec): - frame = plot.as_dict().get("data") - elif isinstance(plot, SupPlotsSpec): - frame = plot.as_dict().get("figures")[index].get("data") - else: - msg = f"Plot MUST be a `PlotSpec` or `SupPlotsSpec` object, type={type(plot)}" - raise TypeError(msg) - - if frame is None: - msg = "Could not retrieve the dataframe from the plot." - raise ValueError(msg) - - return frame
- - - -
-[docs] -def slice( - grid: SupPlotsSpec, index: int | Sequence[int], **kwargs -) -> PlotSpec | SupPlotsSpec | None: - """ - Slice a ggrid (SupPlotsSpec) objects with given index. - - Parameters - ---------- - grid : SupPlotsSpec - The grid to slice. - index : int | Sequence[int] - The index or indices of the plots to slice. - **kwargs : dict[str, Any] - Additional arguments for the `gggrid` function. - see: https://lets-plot.org/python/pages/api/lets_plot.gggrid.html - - Returns - ------- - PlotSpec | SupPlotsSpec - The sliced grid. - - Raises - ------ - TypeError - If the grid is not a SupPlotsSpec object. - If the index is not an int or Sequence[int]. - """ - if isinstance(grid, SupPlotsSpec): - figures = grid.as_dict().get("figures") - - if figures is not None: - if isinstance(index, int): - plot = figures[index] - return plot - elif isinstance(index, Sequence): - list_plots = [figures[i] for i in index] - return gggrid(list_plots, **kwargs) - else: - msg = f"Expected int or Sequence for index, but received {type(index)}" - raise TypeError(msg) - else: - msg = f"Expected `SupPlotsSpec`, but received {type(grid)}" - raise TypeError(msg)
- - - -def _share_labels(plot, i: int, keys: Sequence[str], ncol: int | None) -> SupPlotsSpec: - if ncol is None: - ncol = len(keys) - total = len(keys) - nrow = ceil(total / ncol) - left_places = [i for i in range(total) if i % ncol == 0] - bottom_places = [i for i in range(total) if i >= ncol * (nrow - 1)] - if len(bottom_places) < ncol: - penultimate_row = list(range((nrow - 2) * ncol, (nrow - 1) * ncol)) - bottom_places.extend(penultimate_row) - if i not in bottom_places: # remove x axis title except for bottom row - plot = plot + theme(axis_title_x=element_blank()) - if i not in left_places: # remove y axis title except for left column - plot = plot + theme(axis_title_y=element_blank()) - - return plot - - -def _share_axis( - plot, i: int, keys: Sequence[str], ncol: int | None, axis_type: Literal["axis", "arrow"] -) -> SupPlotsSpec: - total = len(keys) - if ncol is None: - ncol = len(keys) - nrow = ceil(total / ncol) - left_places = [i for i in range(total) if i % ncol == 0] - bottom_places = [i for i in range(total) if i >= ncol * (nrow - 1)] - if len(bottom_places) < ncol: - penultimate_row = list(range((nrow - 2) * ncol, (nrow - 1) * ncol)) - bottom_places.extend(penultimate_row) - - if axis_type == "axis": - if i not in bottom_places: # remove x axis title except for bottom row - plot = plot + theme( - # remove x axis elements - axis_text_x=element_blank(), - axis_ticks_x=element_blank(), - axis_line_x=element_blank(), - ) - if i not in left_places: # remove y axis title except for left column - plot = plot + theme( - # remove y axis elements - axis_text_y=element_blank(), - axis_ticks_y=element_blank(), - axis_line_y=element_blank(), - ) - elif axis_type == "arrow": - pass - else: - msg = f"expected 'axis' or 'arrow' for 'axis_type' argument, but received {axis_type}" - raise ValueError(msg) - - return plot - - -def _share_ticks(plot, i: int, keys: Sequence[str], ncol: int | None) -> SupPlotsSpec: - if ncol is None: - ncol = len(keys) - total = len(keys) - nrow = ceil(total / ncol) - left_places = [i for i in range(total) if i % ncol == 0] - bottom_places = [i for i in range(total) if i >= ncol * (nrow - 1)] - if len(bottom_places) < ncol: - penultimate_row = list(range((nrow - 2) * ncol, (nrow - 1) * ncol)) - bottom_places.extend(penultimate_row) - if i not in bottom_places: # remove x axis title except for bottom row - plot = plot + theme(axis_text_x=element_blank()) - if i not in left_places: # remove y axis title except for left column - plot = plot + theme(axis_text_y=element_blank()) - - return plot - - -''' -def _key_style(data: AnnData, key: str) -> str: - """Find the layers with the given key.""" - if key in data.obs.columns: - origin = "obs" - elif key in data.var_names: - origin = "obs" - elif key in data.var.columns: - origin = "var" -''' - - -def _wrap_legend( - frame: pl.DataFrame, fill: str | None, color: str | None, nrow: int = 5 -) -> FeatureSpec: - legend = guides() - # CASE1: LEGEND IS SEPARATED BY FILL - if fill is not None: - n_distinct = frame.select(fill).unique().height - if n_distinct > 10: - ncol = ceil(n_distinct / 10) - legend = guides(fill=guide_legend(ncol=ncol)) - # CASE2: LEGEND IS SEPARATED BY COLOR - if color is not None: - n_distinct = frame.select(color).unique().height - if n_distinct > 10: - ncol = ceil(n_distinct / 10) - legend = guides(color=guide_legend(ncol=ncol)) - - return legend - - -def _is_variable_key(data: AnnData, key: str | None) -> bool: - if key is None: - return False - - if isinstance(data, AnnData): - if key in data.var_names: - result = True - else: - result = False - else: - msg = f"Unknown data type: {type(data)}." - raise TypeError(msg) - - return result - - -def _are_variables(data: AnnData, keys: Sequence[str] | None) -> bool: - if keys is None: - return False - - if isinstance(data, AnnData): - result = all(key in data.var_names for key in keys) - else: - msg = f"Unknown data type: {type(data)}." - raise TypeError(msg) - - return result - - -def _is_observation_key(data: AnnData, key: str | None) -> bool: - if key is None: - return False - - if isinstance(data, AnnData): - if key in data.obs.columns: - result = True - else: - result = False - else: - msg = f"Unknown data type: {type(data)}." - raise TypeError(msg) - - return result - - -def _are_observations(data: AnnData, keys: Sequence[str] | None) -> bool: - if keys is None: - return False - - if isinstance(data, AnnData): - result = all(key in data.obs.columns for key in keys) - else: - msg = f"Unknown data type: {type(data)}." - raise TypeError(msg) - - return result - - -def _select_variable_keys( - data: AnnData, - keys: Sequence[str] | None, -) -> list[str]: - """From given keys, select only those that are variable keys.""" - if keys is None: - return [] - - if isinstance(data, AnnData): - variable_keys = [key for key in keys if key in data.var_names] - else: - msg = f"Unknown data type: {type(data)}." - raise TypeError(msg) - return variable_keys - - -def _is_observation_feature(data: AnnData, key: str | None) -> bool: - """Check whether the key is in observations axis (axis=0).""" - if key is None: - return False - - if isinstance(data, AnnData): - if key in data.obs.columns or key in data.var_names: - result = True - else: - result = False - else: - msg = f"Unknown data type: {type(data)}." - raise TypeError(msg) - - return result - - -def _are_observation_features(data: AnnData, keys: Sequence[str] | None) -> bool: - """Check whether all the keys are in observations axis (axis=0).""" - if keys is None: - return False - - if isinstance(data, AnnData): - result = all((key in data.obs.columns or key in data.var_names) for key in keys) - else: - msg = f"Unknown data type: {type(data)}." - raise TypeError(msg) - - return result - - -def _is_variable_feature(data: AnnData, key: str | None) -> bool: - """Check whether the key is in variable axis (axis=1).""" - if key is None: - return False - - if isinstance(data, AnnData): - if key in data.var.columns: - result = True - else: - result = False - else: - msg = f"Unknown data type: {type(data)}." - raise TypeError(msg) - - return result - - -def _are_variable_features(data: AnnData, keys: Sequence[str] | None) -> bool: - """Check whether all the keys are in variable axis (axis=1).""" - if keys is None: - return False - - if isinstance(data, AnnData): - result = all(key in data.var.columns for key in keys) - else: - msg = f"Unknown data type: {type(data)}." - raise TypeError(msg) - - return result - - -def _determine_axis( - data: AnnData, - keys: str | Sequence[str], -) -> Literal[0, 1]: - """Determine the axis based on the given key or keys.""" - if isinstance(keys, str): - keys = [keys] - if isinstance(data, AnnData): - if _are_variable_features(data, keys): - axis = 1 - elif _are_observation_features(data, keys): - axis = 0 - else: - msg = f"Could not determine the axis with given keys ({keys})." - raise ValueError(msg) - else: - msg = f"Unknown data type: {type(data)}." - raise TypeError(msg) - - return axis -
- -
- - - - - -
- - - - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_modules/index.html b/docs/_build/_modules/index.html deleted file mode 100644 index cedb9c3..0000000 --- a/docs/_build/_modules/index.html +++ /dev/null @@ -1,458 +0,0 @@ - - - - - - - - - - Overview: module code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - - -
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.basic.heatmap.heatmap.rst.txt b/docs/_build/_sources/generated/cellestial.single.basic.heatmap.heatmap.rst.txt deleted file mode 100644 index f703d75..0000000 --- a/docs/_build/_sources/generated/cellestial.single.basic.heatmap.heatmap.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.basic.heatmap.heatmap -======================================= - -.. currentmodule:: cellestial.single.basic.heatmap - -.. autofunction:: heatmap \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.basic.scatter.scatter.rst.txt b/docs/_build/_sources/generated/cellestial.single.basic.scatter.scatter.rst.txt deleted file mode 100644 index e17b011..0000000 --- a/docs/_build/_sources/generated/cellestial.single.basic.scatter.scatter.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.basic.scatter.scatter -======================================= - -.. currentmodule:: cellestial.single.basic.scatter - -.. autofunction:: scatter \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.common.xyplot.xyplot.rst.txt b/docs/_build/_sources/generated/cellestial.single.common.xyplot.xyplot.rst.txt deleted file mode 100644 index bcc077c..0000000 --- a/docs/_build/_sources/generated/cellestial.single.common.xyplot.xyplot.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.common.xyplot.xyplot -====================================== - -.. currentmodule:: cellestial.single.common.xyplot - -.. autofunction:: xyplot \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.common.xyplots.xyplots.rst.txt b/docs/_build/_sources/generated/cellestial.single.common.xyplots.xyplots.rst.txt deleted file mode 100644 index 6bff72d..0000000 --- a/docs/_build/_sources/generated/cellestial.single.common.xyplots.xyplots.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.common.xyplots.xyplots -======================================== - -.. currentmodule:: cellestial.single.common.xyplots - -.. autofunction:: xyplots \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.dimensional.dimensional.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.dimensional.dimensional.rst.txt deleted file mode 100644 index 4fb9f1f..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.dimensional.dimensional.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.dimensional.dimensional -============================================== - -.. currentmodule:: cellestial.single.core.dimensional - -.. autofunction:: dimensional \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.distribution.boxplot.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.distribution.boxplot.rst.txt deleted file mode 100644 index ffca415..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.distribution.boxplot.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.distribution.boxplot -=========================================== - -.. currentmodule:: cellestial.single.core.distribution - -.. autofunction:: boxplot \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.distribution.violin.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.distribution.violin.rst.txt deleted file mode 100644 index 5d350f8..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.distribution.violin.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.distribution.violin -========================================== - -.. currentmodule:: cellestial.single.core.distribution - -.. autofunction:: violin \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.distributions.boxplots.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.distributions.boxplots.rst.txt deleted file mode 100644 index 028a10c..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.distributions.boxplots.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.distributions.boxplots -============================================= - -.. currentmodule:: cellestial.single.core.distributions - -.. autofunction:: boxplots \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.distributions.violins.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.distributions.violins.rst.txt deleted file mode 100644 index e7b065b..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.distributions.violins.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.distributions.violins -============================================ - -.. currentmodule:: cellestial.single.core.distributions - -.. autofunction:: violins \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.subdimensional.expression.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.subdimensional.expression.rst.txt deleted file mode 100644 index 82a2e56..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.subdimensional.expression.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.subdimensional.expression -================================================ - -.. currentmodule:: cellestial.single.core.subdimensional - -.. autofunction:: expression \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.subdimensional.pca.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.subdimensional.pca.rst.txt deleted file mode 100644 index 87886f0..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.subdimensional.pca.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.subdimensional.pca -========================================= - -.. currentmodule:: cellestial.single.core.subdimensional - -.. autofunction:: pca \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.subdimensional.tsne.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.subdimensional.tsne.rst.txt deleted file mode 100644 index a6772d8..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.subdimensional.tsne.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.subdimensional.tsne -========================================== - -.. currentmodule:: cellestial.single.core.subdimensional - -.. autofunction:: tsne \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.subdimensional.umap.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.subdimensional.umap.rst.txt deleted file mode 100644 index 13db6f5..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.subdimensional.umap.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.subdimensional.umap -========================================== - -.. currentmodule:: cellestial.single.core.subdimensional - -.. autofunction:: umap \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.dimensionals.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.dimensionals.rst.txt deleted file mode 100644 index 6b4a7ea..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.dimensionals.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.subdimensionals.dimensionals -=================================================== - -.. currentmodule:: cellestial.single.core.subdimensionals - -.. autofunction:: dimensionals \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.expressions.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.expressions.rst.txt deleted file mode 100644 index 7f482ae..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.expressions.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.subdimensionals.expressions -================================================== - -.. currentmodule:: cellestial.single.core.subdimensionals - -.. autofunction:: expressions \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.pcas.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.pcas.rst.txt deleted file mode 100644 index 5397440..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.pcas.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.subdimensionals.pcas -=========================================== - -.. currentmodule:: cellestial.single.core.subdimensionals - -.. autofunction:: pcas \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.tsnes.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.tsnes.rst.txt deleted file mode 100644 index aee9406..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.tsnes.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.subdimensionals.tsnes -============================================ - -.. currentmodule:: cellestial.single.core.subdimensionals - -.. autofunction:: tsnes \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.umaps.rst.txt b/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.umaps.rst.txt deleted file mode 100644 index c63d872..0000000 --- a/docs/_build/_sources/generated/cellestial.single.core.subdimensionals.umaps.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.core.subdimensionals.umaps -============================================ - -.. currentmodule:: cellestial.single.core.subdimensionals - -.. autofunction:: umaps \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.single.special.dotplot.dotplot.rst.txt b/docs/_build/_sources/generated/cellestial.single.special.dotplot.dotplot.rst.txt deleted file mode 100644 index 9b274df..0000000 --- a/docs/_build/_sources/generated/cellestial.single.special.dotplot.dotplot.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.single.special.dotplot.dotplot -========================================= - -.. currentmodule:: cellestial.single.special.dotplot - -.. autofunction:: dotplot \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.util.colors.show_colors.rst.txt b/docs/_build/_sources/generated/cellestial.util.colors.show_colors.rst.txt deleted file mode 100644 index 8fe86bd..0000000 --- a/docs/_build/_sources/generated/cellestial.util.colors.show_colors.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.util.colors.show\_colors -=================================== - -.. currentmodule:: cellestial.util.colors - -.. autofunction:: show_colors \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.util.get_mapping.rst.txt b/docs/_build/_sources/generated/cellestial.util.get_mapping.rst.txt deleted file mode 100644 index a0d37cd..0000000 --- a/docs/_build/_sources/generated/cellestial.util.get_mapping.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.util.get\_mapping -============================ - -.. currentmodule:: cellestial.util - -.. autofunction:: get_mapping \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.util.utilities.get_mapping.rst.txt b/docs/_build/_sources/generated/cellestial.util.utilities.get_mapping.rst.txt deleted file mode 100644 index c02bc5e..0000000 --- a/docs/_build/_sources/generated/cellestial.util.utilities.get_mapping.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.util.utilities.get\_mapping -====================================== - -.. currentmodule:: cellestial.util.utilities - -.. autofunction:: get_mapping \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.util.utilities.retrieve.rst.txt b/docs/_build/_sources/generated/cellestial.util.utilities.retrieve.rst.txt deleted file mode 100644 index 7616294..0000000 --- a/docs/_build/_sources/generated/cellestial.util.utilities.retrieve.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.util.utilities.retrieve -================================== - -.. currentmodule:: cellestial.util.utilities - -.. autofunction:: retrieve \ No newline at end of file diff --git a/docs/_build/_sources/generated/cellestial.util.utilities.slice.rst.txt b/docs/_build/_sources/generated/cellestial.util.utilities.slice.rst.txt deleted file mode 100644 index 37d2d1f..0000000 --- a/docs/_build/_sources/generated/cellestial.util.utilities.slice.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -cellestial.util.utilities.slice -=============================== - -.. currentmodule:: cellestial.util.utilities - -.. autofunction:: slice \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.basic.heatmap.heatmap.html b/docs/_build/generated/cellestial.single.basic.heatmap.heatmap.html deleted file mode 100644 index ec7c0e7..0000000 --- a/docs/_build/generated/cellestial.single.basic.heatmap.heatmap.html +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - - - - - cellestial.single.basic.heatmap.heatmap - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.basic.heatmap.heatmap#

-
-
-heatmap(data: AnnData, mapping: FeatureSpec | None = None, *, axis: Literal[0, 1] | None = None, variable_keys: Sequence[str] | None = None, observations_name: str = 'Barcode', variables_name: str = 'Variable', include_dimensions: bool | int = False, interactive: bool = False, **geom_kwargs) PlotSpec[source]#
-

Heatmap.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • mapping (FeatureSpec | None, default None) – Aesthetic mappings for the plot, the result of aes().

  • -
  • axis (Literal[0,1] | None, default None) – axis of the data, 0 for observations and 1 for variables.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • observations_name (str, default 'Barcode') – The name of the observations column.

  • -
  • variables_name (str, default 'Variable') – Name for the variables index column.

  • -
  • include_dimensions (bool | int, default False) – Whether to include dimensions in the DataFrame. -Providing an integer will limit the number of dimensions to given number.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • **geom_kwargs – Additional parameters for the geom_bar layer. -For more information on geom_bar parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_bar.html

  • -
-
-
Returns:
-

PlotSpec – Heatmap.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.basic.scatter.scatter.html b/docs/_build/generated/cellestial.single.basic.scatter.scatter.html deleted file mode 100644 index e43f9c4..0000000 --- a/docs/_build/generated/cellestial.single.basic.scatter.scatter.html +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - - - - - - cellestial.single.basic.scatter.scatter - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.basic.scatter.scatter#

-
-
-scatter(data: AnnData, mapping: FeatureSpec | None = None, *, axis: Literal[0, 1] | None = None, variable_keys: Sequence[str] | None = None, observations_name: str = 'Barcode', variables_name: str = 'Variable', include_dimensions: bool | int = False, interactive: bool = False, **geom_kwargs) PlotSpec[source]#
-

Scatter Plot.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • mapping (FeatureSpec | None, default None) – Aesthetic mappings for the plot, the result of aes().

  • -
  • axis (Literal[0,1] | None, default None) – axis of the data, 0 for observations and 1 for variables.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • axis – The axis to build the frame for. 0 for observations, 1 for variables.

  • -
  • observations_name (str, default 'Barcode') – The name of the observations column.

  • -
  • variables_name (str, default 'Variable') – Name for the variables index column.

  • -
  • include_dimensions (bool | int, default False) – Whether to include dimensions in the DataFrame. -Providing an integer will limit the number of dimensions to given number.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • **geom_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

PlotSpec – Scatter plot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.common.xyplot.xyplot.html b/docs/_build/generated/cellestial.single.common.xyplot.xyplot.html deleted file mode 100644 index 16647f5..0000000 --- a/docs/_build/generated/cellestial.single.common.xyplot.xyplot.html +++ /dev/null @@ -1,498 +0,0 @@ - - - - - - - - - - - cellestial.single.common.xyplot.xyplot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.common.xyplot.xyplot#

-
-
-xyplot(data: AnnData, x: str, y: str, *, mapping: FeatureSpec | None = None, axis: Literal[0, 1] | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', variables_name: str = 'Variable', include_dimensions: bool | int = False, **point_kwargs) PlotSpec[source]#
-

Scatter Plot.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • x (str) – The key for the x-axis.

  • -
  • y (str) – The key for the y-axis.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • axis (Literal[0,1] | None, default None) – axis of the data, 0 for observations and 1 for variables.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • variables_name (str, default 'Variable') – The name to give to variable index column in the dataframe.

  • -
  • include_dimensions (bool | int, default False) – Whether to include dimensions in the DataFrame. -Providing an integer will limit the number of dimensions to given number.

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

PlotSpec – Scatter plot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.common.xyplots.xyplots.html b/docs/_build/generated/cellestial.single.common.xyplots.xyplots.html deleted file mode 100644 index fb580dd..0000000 --- a/docs/_build/generated/cellestial.single.common.xyplots.xyplots.html +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - - - - - - cellestial.single.common.xyplots.xyplots - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.common.xyplots.xyplots#

-
-
-xyplots(data: AnnData, x: str | Sequence[str], y: str | Sequence[str], *, mapping: FeatureSpec | None = None, axis: Literal[0, 1] | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', variables_name: str = 'Variable', include_dimensions: bool | int = False, layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, ncol: int | None = None, sharex: str | None = None, sharey: str | None = None, widths: list[float] | None = None, heights: list[float] | None = None, hspace: float | None = None, vspace: float | None = None, fit: bool | None = None, align: bool | None = None, guides: str = 'auto', **point_kwargs) SupPlotsSpec[source]#
-

Scatter Plots.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • x (str) – The key(s) for the x-axis.

  • -
  • y (str) – The key(s) for the y-axis.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • axis (Literal[0,1] | None, default None) – axis of the data, 0 for observations and 1 for variables.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • variables_name (str, default 'Variable') – The name to give to variable index column in the dataframe.

  • -
  • include_dimensions (bool | int, default False) – Whether to include dimensions in the DataFrame. -Providing an integer will limit the number of dimensions to given number.

  • -
  • layers (Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default None) – Layers to add to all the plots in the grid.

  • -
  • ncol (int, default None) – Number of columns in grid. If not specified, shows plots horizontally, in one row.

  • -
  • sharex (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • sharey (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • widths (list[float], default None) – Relative width of each column of grid, left to right.

  • -
  • heights (list[float], default None) – Relative height of each row of grid, top-down.

  • -
  • hspace (float | None = None) – Cell horizontal spacing in px.

  • -
  • vspace (float | None = None) – Cell vertical spacing in px.

  • -
  • fit (bool, default True) – Whether to stretch each plot to match the aspect ratio of its cell (fit=True), -or to preserve the original aspect ratio of plots (fit=False).

  • -
  • align (bool, default False) – If True, align inner areas (i.e. “geom” bounds) of plots. -However, cells containing other (sub)grids are not participating -in the plot “inner areas” layouting.

  • -
  • guides (str, default 'auto') –

    -
    Specifies how guides (legends and colorbars) should be treated in the layout.
      -
    • ’collect’ collect guides from all subplots, removing duplicates.

    • -
    • ’keep’ keep guides in their original subplots; do not collect at this level.

    • -
    • ’auto’ allow guides to be collected if an upper-level layout uses guides=’collect’;

    • -
    -
    -
    -

    otherwise, keep them in subplots. -Duplicates are identified by comparing visual properties: -For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). -For colorbars: title, domain limits, breaks, and color gradient.

    -

    For more information on gggrid parameters: -https://lets-plot.org/python/pages/api/lets_plot.gggrid.html

    -

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

PlotSpec – Scatter plot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.dimensional.dimensional.html b/docs/_build/generated/cellestial.single.core.dimensional.dimensional.html deleted file mode 100644 index 63177e6..0000000 --- a/docs/_build/generated/cellestial.single.core.dimensional.dimensional.html +++ /dev/null @@ -1,575 +0,0 @@ - - - - - - - - - - - cellestial.single.core.dimensional.dimensional - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.dimensional.dimensional#

-
-
-dimensional(data: AnnData, key: str | None = None, *, mapping: FeatureSpec | None = None, dimensions: Literal['umap', 'pca', 'tsne'] = 'umap', use_key: str | None = None, xy: tuple[int, int] | Sequence[int] = (1, 2), size: float = 0.8, variable_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', color_low: str = '#e6e6e6', color_mid: str | None = None, color_high: str = '#377eb8', mid_point: Literal['mean', 'median', 'mid'] | float = 'median', axis_type: Literal['axis', 'arrow'] | None = None, arrow_length: float = 0.25, arrow_size: float = 1, arrow_color: str = '#3f3f3f', arrow_angle: float = 10, legend_ondata: bool = False, ondata_size: float = 12, ondata_color: str = '#3f3f3f', ondata_fontface: str = 'bold', ondata_family: str = 'sans', ondata_alpha: float = 1, ondata_weighted: bool = True, **point_kwargs) PlotSpec[source]#
-

Dimensionality reduction plot.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • key (str, default None) – The key (cell feature) to color the points by. -e.g., ‘leiden’ or ‘louvain’ to color by clusters or gene name for expression.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • dimensions (Literal[``’umap’, ``'pca', 'tsne'], default 'umap') – The dimensional reduction method to use. -e.g., ‘umap’ or ‘pca’ or ‘tsne’.

  • -
  • xy (tuple[int, int] | Sequence[int], default (1, 2)) – The x and y axes to use for the plot. -e.g., (1, 2) for UMAP1 and UMAP2.

  • -
  • use_key (str, default None) – The specific key to use for the desired dimensions. -e.g., ‘X_umap_2d’ or ‘X_pca_2d’. -Otherwise, the function will decide on the key based on the dimensions.

  • -
  • size (float, default 0.8) – The size of the points.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • color_low (str, default '#e6e6e6') –

    The color to use for the low end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_mid (str, default None) –

    The color to use for the middle part of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_high (str, default '#377EB8') –

    The color to use for the high end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • mid_point (Literal[``’mean’, ``'median', 'mid'] | float, default 'median') – The midpoint (in data value) of the color gradient. -Can be ‘mean’, ‘median’ and ‘mid’ or a number (float or int). -- If ‘mean’, the midpoint is the mean of the data. -- If ‘median’, the midpoint is the median of the data. -- If ‘mid’, the midpoint is the mean of ‘min’ and ‘max’ of the data.

  • -
  • axis_type (Literal[``’axis’, ``'arrow'] | None) – Whether to use regular axis or arrows as the axis.

  • -
  • arrow_length (float, default 0.25) – Length of the arrow head (px).

  • -
  • arrow_size (float, default 1) – Size of the arrow.

  • -
  • arrow_color (str, default '#3f3f3f') –

    Color of the arrows. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • arrow_angle (float, default 10) – Angle of the arrow head in degrees.

  • -
  • legend_ondata (bool, default False) – whether to show legend on data

  • -
  • ondata_size (float, default 12) – size of the legend (text) on data.

  • -
  • ondata_color (str, default '#3f3f3f') – color of the legend (text) on data

  • -
  • ondata_fontface (str, default 'bold') – fontface of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-face

  • -
  • ondata_family (str, default 'sans') – family of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-family

  • -
  • ondata_alpha (float, default 1) – alpha (transparency) of the legend on data.

  • -
  • ondata_weighted (bool, default True) – whether to use weighted mean for the legend on data. -If True, the weighted mean of the group means is used. -If False, the arithmetic mean of the group means is used.

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

PlotSpec – Dimensional reduction plot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.distribution.boxplot.html b/docs/_build/generated/cellestial.single.core.distribution.boxplot.html deleted file mode 100644 index c71c47f..0000000 --- a/docs/_build/generated/cellestial.single.core.distribution.boxplot.html +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - - - - - cellestial.single.core.distribution.boxplot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.distribution.boxplot#

-
-
-boxplot(data: AnnData, key: str | Sequence[str], *, mapping: FeatureSpec | None = None, axis: Literal[0, 1] | None = None, color: str | None = None, fill: str | None = None, add_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, geom_fill: str | None = '#FF00FF', geom_color: str | None = '#2f2f2f', point_color: str = '#1f1f1f', point_alpha: float = 0.7, point_size: float = 0.5, point_geom: Literal['jitter', 'point', 'sina'] = 'jitter', observations_name: str = 'Barcode', variables_name: str = 'Variable', show_points: bool = True, interactive: bool = False, value_column: str = 'value', variable_column: str = 'variable', point_kwargs: dict[str, Any] | None = None, **geom_kwargs) PlotSpec[source]#
-

Boxplot.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • key (str | Sequence[str]) – The key(s) to get the values (numerical). -e.g., ‘total_counts’ or a gene name.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • axis (Literal[0,1] | None, default None) – axis of the data, 0 for observations and 1 for variables.

  • -
  • color (str | None, default None) – Color aesthetic to split the boxplot (categorical). -e,g., ‘cell_type’ or ‘leiden’.

  • -
  • fill (str | None, default None) – Fill aesthetic to split the boxplot (categorical). -e,g., ‘cell_type’ or ‘leiden’.

  • -
  • add_keys (Sequence[str] | str | None, default None) – Additional keys to include in the dataframe.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • geom_fill (str | None, default '#FF00FF') –

    Fill color for all boxplots in the boxplot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • geom_color (str | None, default '#2f2f2f') –

    Border color for all boxplots in the boxplot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • point_color (str, default '#1f1f1f') –

    Color for the points in the boxplot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • point_alpha (float, default 0.7) – Alpha (transparency) for the points in the boxplot.

  • -
  • point_size (float, default 0.5) – Size for the points in the boxplot.

  • -
  • point_geom (Literal[``’jitter’:py:class:`,`’point’:py:class:`,`’sina’:py:class:`]`, *default* is ``'jitter',) – Geom type of the points, default is geom_jitter.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • variables_name (str, default 'Variable') – The name to give to variable index column in the dataframe.

  • -
  • show_points (bool, default True) – Whether to show points.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • variable_column (str, default 'variable') – The name of the variable column in the dataframe.

  • -
  • value_column (str, default 'value') – The name of the value column in the dataframe.

  • -
  • point_kwargs (dict[str, Any] | None, default None) – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
  • **geom_kwargs – Additional parameters for the geom_boxplot layer. -For more information on geom_boxplot parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_boxplot.html

  • -
-
-
Returns:
-

PlotSpec – Boxplot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.distribution.violin.html b/docs/_build/generated/cellestial.single.core.distribution.violin.html deleted file mode 100644 index 298b0f2..0000000 --- a/docs/_build/generated/cellestial.single.core.distribution.violin.html +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - - - - - cellestial.single.core.distribution.violin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.distribution.violin#

-
-
-violin(data: AnnData, key: str | Sequence[str], *, mapping: FeatureSpec | None = None, axis: Literal[0, 1] | None = None, color: str | None = None, fill: str | None = None, add_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, geom_fill: str | None = '#FF00FF', geom_color: str | None = '#2f2f2f', point_color: str = '#1f1f1f', point_alpha: float = 0.7, point_size: float = 0.5, point_geom: Literal['jitter', 'point', 'sina'] = 'jitter', observations_name: str = 'Barcode', variables_name: str = 'Variable', show_points: bool = True, interactive: bool = False, value_column: str = 'value', variable_column: str = 'variable', point_kwargs: dict[str, Any] | None = None, **geom_kwargs) PlotSpec[source]#
-

Violin Plot.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • key (str | Sequence[str]) – The key(s) to get the values (numerical). -e.g., ‘total_counts’ or a gene name.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • axis (Literal[0,1] | None, default None) – axis of the data, 0 for observations and 1 for variables.

  • -
  • color (str | None, default None) – Color aesthetic to split the violin plot (categorical). -e,g., ‘cell_type’ or ‘leiden’.

  • -
  • fill (str | None, default None) – Fill aesthetic to split the violin plot (categorical). -e,g., ‘cell_type’ or ‘leiden’.

  • -
  • add_keys (Sequence[str] | str | None, default None) – Additional keys to include in the dataframe.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • geom_fill (str | None, default '#FF00FF') –

    Fill color for all violins in the violin plot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • geom_color (str | None, default '#2f2f2f') –

    Border color for all violins in the violin plot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • point_color (str, default '#1f1f1f') –

    Color for the points in the violin plot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • point_alpha (float, default 0.7) – Alpha (transparency) for the points in the violin plot.

  • -
  • point_size (float, default 0.5) – Size for the points in the violin plot.

  • -
  • point_geom (Literal[``’jitter’:py:class:`,`’point’:py:class:`,`’sina’:py:class:`]`, *default* is ``'jitter',) – Geom type of the points, default is geom_jitter.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • variables_name (str, default 'Variable') – The name to give to variable index column in the dataframe.

  • -
  • show_points (bool, default True) – Whether to show points.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • variable_column (str, default 'variable') – The name of the variable column in the dataframe.

  • -
  • value_column (str, default 'value') – The name of the value column in the dataframe.

  • -
  • point_kwargs (dict[str, Any] | None, default None) – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
  • **geom_kwargs – Additional parameters for the geom_violin layer. -For more information on geom_violin parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_violin.html

  • -
-
-
Returns:
-

PlotSpec – Violin plot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.distributions.boxplots.html b/docs/_build/generated/cellestial.single.core.distributions.boxplots.html deleted file mode 100644 index 387e879..0000000 --- a/docs/_build/generated/cellestial.single.core.distributions.boxplots.html +++ /dev/null @@ -1,580 +0,0 @@ - - - - - - - - - - - cellestial.single.core.distributions.boxplots - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.distributions.boxplots#

-
-
-boxplots(data: AnnData, keys: Sequence[str], *, mapping: FeatureSpec | None = None, axis: Literal[0, 1] | None = None, color: str | None = None, fill: str | None = None, add_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, geom_fill: str = '#FF00FF', geom_color: str = '#2f2f2f', point_color: str = '#1f1f1f', point_alpha: float = 0.7, point_size: float = 0.5, point_geom: Literal['jitter', 'point', 'sina'] = 'jitter', observations_name: str = 'Barcode', variables_name: str = 'Variable', show_points: bool = True, interactive: bool = False, value_column: str = 'value', variable_column: str = 'variable', share_axis: bool = False, share_ticks: bool = False, layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, ncol: int | None = None, sharex: str | None = None, sharey: str | None = None, widths: list | None = None, heights: list | None = None, hspace: float | None = None, vspace: float | None = None, fit: bool | None = None, align: bool | None = None, guides: str = 'auto', point_kwargs: dict[str, Any] | None = None, **geom_kwargs) SupPlotsSpec[source]#
-

Boxplots.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • keys (list[str] | tuple[str] | Sequence[str]) – The keys to get the values (numerical). -e.g., [‘total_counts’, ‘pct_counts_in_top_50_genes’] or a list of gene names.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • axis (Literal[0,1] | None, default None) – axis of the data, 0 for observations and 1 for variables.

  • -
  • color (str | None, default None) – Color aesthetic to split the boxplot (categorical). -e,g., ‘cell_type’ or ‘leiden’.

  • -
  • fill (str | None, default None) – Fill aesthetic to split the boxplot (categorical). -e,g., ‘cell_type’ or ‘leiden’.

  • -
  • add_keys (Sequence[str] | str | None, default None) – Additional keys to include in the dataframe.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • geom_fill (str, default '#FF00FF') –

    Fill color for all boxplots in the boxplot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • geom_color (str, default '#2f2f2f') –

    Border color for all boxplots in the boxplot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • point_color (str, default '#1f1f1f') –

    Color for the points in the boxplot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • point_alpha (float, default 0.7) – Alpha (transparency) for the points in the boxplot.

  • -
  • point_size (float, default 0.5) – Size for the points in the boxplot.

  • -
  • point_geom (Literal[``’jitter’:py:class:`,`’point’:py:class:`,`’sina’:py:class:`]`, *default* is ``'jitter',) – Geom type of the points, default is geom_jitter.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • variables_name (str, default 'Gene') – The name to give to variable index column in the dataframe.

  • -
  • show_points (bool, default True) – Whether to show points.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • share_ticks (bool, default True) – Whether to share the labels across all plots. -If True, only X tick texts on bottom row and Y tick text on left column are shown.

  • -
  • share_axis (bool, default False) – Whether to share the axis across all plots. -If True, only X axis on bottom row and Y axis on left column is shown.

  • -
  • layers (Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None, default None) – Additional layers to add to the plot.

  • -
  • variable_column (str, default 'variable') – The name of the variable column in the dataframe.

  • -
  • value_column (str, default 'value') – The name of the value column in the dataframe.

  • -
  • ncol (int, default None) – Number of columns in grid. If not specified, shows plots horizontally, in one row.

  • -
  • sharex (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • sharey (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • widths (list[float], default None) – Relative width of each column of grid, left to right.

  • -
  • heights (list[float], default None) – Relative height of each row of grid, top-down.

  • -
  • hspace (float | None = None) – Cell horizontal spacing in px.

  • -
  • vspace (float | None = None) – Cell vertical spacing in px.

  • -
  • fit (bool, default True) – Whether to stretch each plot to match the aspect ratio of its cell (fit=True), -or to preserve the original aspect ratio of plots (fit=False).

  • -
  • align (bool, default False) – If True, align inner areas (i.e. “geom” bounds) of plots. -However, cells containing other (sub)grids are not participating -in the plot “inner areas” layouting.

  • -
  • guides (str, default 'auto') –

    -
    Specifies how guides (legends and colorbars) should be treated in the layout.
      -
    • ’collect’ collect guides from all subplots, removing duplicates.

    • -
    • ’keep’ keep guides in their original subplots; do not collect at this level.

    • -
    • ’auto’ allow guides to be collected if an upper-level layout uses guides=’collect’;

    • -
    -
    -
    -

    otherwise, keep them in subplots. -Duplicates are identified by comparing visual properties: -For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). -For colorbars: title, domain limits, breaks, and color gradient.

    -

    For more information on gggrid parameters: -https://lets-plot.org/python/pages/api/lets_plot.gggrid.html

    -

  • -
  • point_kwargs (dict[str, Any] | None, default None) – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
  • **geom_kwargs – Additional parameters for the geom_boxplot layer. -For more information on geom_boxplot parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_boxplot.html

  • -
-
-
Returns:
-

SupPlotsSpec – Boxplots.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.distributions.violins.html b/docs/_build/generated/cellestial.single.core.distributions.violins.html deleted file mode 100644 index b0b7ae3..0000000 --- a/docs/_build/generated/cellestial.single.core.distributions.violins.html +++ /dev/null @@ -1,581 +0,0 @@ - - - - - - - - - - - cellestial.single.core.distributions.violins - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.distributions.violins#

-
-
-violins(data: AnnData, keys: Sequence[str], *, mapping: FeatureSpec | None = None, axis: Literal[0, 1] | None = None, color: str | None = None, fill: str | None = None, add_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, geom_fill: str = '#FF00FF', geom_color: str = '#2f2f2f', point_color: str = '#1f1f1f', point_alpha: float = 0.7, point_size: float = 0.5, point_geom: Literal['jitter', 'point', 'sina'] = 'jitter', observations_name: str = 'Barcode', variables_name: str = 'Variable', show_points: bool = True, interactive: bool = False, value_column: str = 'value', variable_column: str = 'variable', share_axis: bool = False, share_ticks: bool = False, layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, ncol: int | None = None, sharex: str | None = None, sharey: str | None = None, widths: list | None = None, heights: list | None = None, hspace: float | None = None, vspace: float | None = None, fit: bool | None = None, align: bool | None = None, guides: str = 'auto', point_kwargs: dict[str, Any] | None = None, **geom_kwargs) SupPlotsSpec[source]#
-

Violin Plots.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • keys (list[str] | tuple[str] | Sequence[str]) – The keys to get the values (numerical). -e.g., [‘total_counts’, ‘pct_counts_in_top_50_genes’] or a list of gene names.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • axis (Literal[0,1] | None, default None) – axis of the data, 0 for observations and 1 for variables.

  • -
  • color (str | None, default None) – Color aesthetic to split the violin plot (categorical). -e,g., ‘cell_type’ or ‘leiden’.

  • -
  • fill (str | None, default None) – Fill aesthetic to split the violin plot (categorical). -e,g., ‘cell_type’ or ‘leiden’.

  • -
  • add_keys (Sequence[str] | str | None, default None) – Additional keys to include in the dataframe.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • geom_fill (str, default '#FF00FF') –

    Fill color for all violins in the violin plot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • geom_color (str, default '#2f2f2f') –

    Border color for all violins in the violin plot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • point_color (str, default '#1f1f1f') –

    Color for the points in the violin plot. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -

  • -
  • point_alpha (float, default 0.7) – Alpha (transparency) for the points in the violin plot.

  • -
  • point_size (float, default 0.5) – Size for the points in the violin plot.

  • -
  • point_geom (Literal[``’jitter’:py:class:`,`’point’:py:class:`,`’sina’:py:class:`]`, *default* is ``'jitter',) – Geom type of the points, default is geom_jitter.

  • -
  • trim (bool, default False) – Whether to trim the violin plot.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • variables_name (str, default 'Gene') – The name to give to variable index column in the dataframe.

  • -
  • show_points (bool, default True) – Whether to show points.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • share_ticks (bool, default True) – Whether to share the labels across all plots. -If True, only X tick texts on bottom row and Y tick text on left column are shown.

  • -
  • share_axis (bool, default False) – Whether to share the axis across all plots. -If True, only X axis on bottom row and Y axis on left column is shown.

  • -
  • layers (Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None, default None) – Additional layers to add to the plot.

  • -
  • variable_column (str, default 'variable') – The name of the variable column in the dataframe.

  • -
  • value_column (str, default 'value') – The name of the value column in the dataframe.

  • -
  • ncol (int, default None) – Number of columns in grid. If not specified, shows plots horizontally, in one row.

  • -
  • sharex (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • sharey (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • widths (list[float], default None) – Relative width of each column of grid, left to right.

  • -
  • heights (list[float], default None) – Relative height of each row of grid, top-down.

  • -
  • hspace (float | None = None) – Cell horizontal spacing in px.

  • -
  • vspace (float | None = None) – Cell vertical spacing in px.

  • -
  • fit (bool, default True) – Whether to stretch each plot to match the aspect ratio of its cell (fit=True), -or to preserve the original aspect ratio of plots (fit=False).

  • -
  • align (bool, default False) – If True, align inner areas (i.e. “geom” bounds) of plots. -However, cells containing other (sub)grids are not participating -in the plot “inner areas” layouting.

  • -
  • guides (str, default 'auto') –

    -
    Specifies how guides (legends and colorbars) should be treated in the layout.
      -
    • ’collect’ collect guides from all subplots, removing duplicates.

    • -
    • ’keep’ keep guides in their original subplots; do not collect at this level.

    • -
    • ’auto’ allow guides to be collected if an upper-level layout uses guides=’collect’;

    • -
    -
    -
    -

    otherwise, keep them in subplots. -Duplicates are identified by comparing visual properties: -For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). -For colorbars: title, domain limits, breaks, and color gradient.

    -

    For more information on gggrid parameters: -https://lets-plot.org/python/pages/api/lets_plot.gggrid.html

    -

  • -
  • point_kwargs (dict[str, Any] | None, default None) – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
  • **geom_kwargs – Additional parameters for the geom_violin layer. -For more information on geom_violin parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_violin.html

  • -
-
-
Returns:
-

SupPlotsSpec – Violin Plots.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.subdimensional.expression.html b/docs/_build/generated/cellestial.single.core.subdimensional.expression.html deleted file mode 100644 index 5691c59..0000000 --- a/docs/_build/generated/cellestial.single.core.subdimensional.expression.html +++ /dev/null @@ -1,574 +0,0 @@ - - - - - - - - - - - cellestial.single.core.subdimensional.expression - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.subdimensional.expression#

-
-
-expression(data: AnnData, key: str, *, mapping: FeatureSpec | None = None, dimensions: Literal['umap', 'pca', 'tsne'] = 'umap', use_key: str | None = None, xy: tuple[int, int] | Sequence[int] = (1, 2), size: float = 0.8, variable_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', color_low: str = '#e6e6e6', color_mid: str | None = None, color_high: str = '#377eb8', mid_point: Literal['mean', 'median', 'mid'] | float = 'median', axis_type: Literal['axis', 'arrow'] | None = 'arrow', arrow_length: float = 0.25, arrow_size: float = 1, arrow_color: str = '#3f3f3f', arrow_angle: float = 10, legend_ondata: bool = False, ondata_size: float = 12, ondata_color: str = '#3f3f3f', ondata_fontface: str = 'bold', ondata_family: str = 'sans', ondata_alpha: float = 1, ondata_weighted: bool = True, **point_kwargs) PlotSpec[source]#
-

Dimensionality reduction plot of expression data.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • key (str) – The key (gene names) to color the points by.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • dimensions (Literal[``’umap’, ``'pca', 'tsne'], default 'umap') – The dimensional reduction method to use. -e.g., ‘umap’ or ‘pca’ or ‘tsne’.

  • -
  • use_key (str, default None) – The specific key to use for the desired dimensions. -e.g., ‘X_umap_2d’ or ‘X_pca_2d’. -Otherwise, the function will decide on the key based on the dimensions.

  • -
  • xy (tuple[int, int] | Sequence[int], default (1, 2)) – The x and y axes to use for the plot. -e.g., (1, 2) for UMAP1 and UMAP2.

  • -
  • size (float, default 0.8) – The size of the points.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • color_low (str, default '#e6e6e6') –

    The color to use for the low end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_mid (str, default None) –

    The color to use for the middle part of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_high (str, default '#377EB8') –

    The color to use for the high end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • mid_point (Literal[``’mean’, ``'median', 'mid'] | float, default 'median') – The midpoint (in data value) of the color gradient. -Can be ‘mean’, ‘median’ and ‘mid’ or a number (float or int). -- If ‘mean’, the midpoint is the mean of the data. -- If ‘median’, the midpoint is the median of the data. -- If ‘mid’, the midpoint is the mean of ‘min’ and ‘max’ of the data.

  • -
  • axis_type (Literal[``’axis’, ``'arrow'] | None) – Whether to use regular axis or arrows as the axis.

  • -
  • arrow_length (float, default 0.25) – Length of the arrow head (px).

  • -
  • arrow_size (float, default 1) – Size of the arrow.

  • -
  • arrow_color (str, default '#3f3f3f') –

    Color of the arrows. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • arrow_angle (float, default 10) – Angle of the arrow head in degrees.

  • -
  • legend_ondata (bool, default False) – whether to show legend on data

  • -
  • ondata_size (float, default 12) – size of the legend (text) on data.

  • -
  • ondata_color (str, default '#3f3f3f') – color of the legend (text) on data

  • -
  • ondata_fontface (str, default 'bold') – fontface of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-face

  • -
  • ondata_family (str, default 'sans') – family of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-family

  • -
  • ondata_alpha (float, default 1) – alpha (transparency) of the legend on data.

  • -
  • ondata_weighted (bool, default True) – whether to use weighted mean for the legend on data. -If True, the weighted mean of the group means is used. -If False, the arithmetic mean of the group means is used.

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

PlotSpec – Dimensional reduction plot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.subdimensional.pca.html b/docs/_build/generated/cellestial.single.core.subdimensional.pca.html deleted file mode 100644 index 3ba844d..0000000 --- a/docs/_build/generated/cellestial.single.core.subdimensional.pca.html +++ /dev/null @@ -1,573 +0,0 @@ - - - - - - - - - - - cellestial.single.core.subdimensional.pca - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.subdimensional.pca#

-
-
-pca(data: AnnData, key: str | None = None, *, mapping: FeatureSpec | None = None, use_key: str | None = None, xy: tuple[int, int] | Sequence[int] = (1, 2), size: float = 0.8, variable_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', color_low: str = '#e6e6e6', color_mid: str | None = None, color_high: str = '#377eb8', mid_point: Literal['mean', 'median', 'mid'] | float = 'median', axis_type: Literal['axis', 'arrow'] | None = None, arrow_length: float = 0.25, arrow_size: float = 1, arrow_color: str = '#3f3f3f', arrow_angle: float = 10, legend_ondata: bool = False, ondata_size: float = 12, ondata_color: str = '#3f3f3f', ondata_fontface: str = 'bold', ondata_family: str = 'sans', ondata_alpha: float = 1, ondata_weighted: bool = True, **point_kwargs) PlotSpec[source]#
-

PCA Dimensionality reduction plot.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • key (str, default None) – The key (cell feature) to color the points by. -e.g., ‘leiden’ or ‘louvain’ to color by clusters or gene name for expression.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • use_key (str, default None) – The specific key to use for the desired dimensions. -e.g., ‘X_umap_2d’ or ‘X_pca_2d’. -Otherwise, the function will decide on the key based on the dimensions.

  • -
  • xy (tuple[int, int] | Sequence[int], default (1, 2)) – The x and y axes to use for the plot. -e.g., (1, 2) for UMAP1 and UMAP2.

  • -
  • size (float, default 0.8) – The size of the points.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • color_low (str, default '#e6e6e6') –

    The color to use for the low end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_mid (str, default None) –

    The color to use for the middle part of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_high (str, default '#377EB8') –

    The color to use for the high end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • mid_point (Literal[``’mean’, ``'median', 'mid'] | float, default 'median') – The midpoint (in data value) of the color gradient. -Can be ‘mean’, ‘median’ and ‘mid’ or a number (float or int). -- If ‘mean’, the midpoint is the mean of the data. -- If ‘median’, the midpoint is the median of the data. -- If ‘mid’, the midpoint is the mean of ‘min’ and ‘max’ of the data.

  • -
  • axis_type (Literal[``’axis’, ``'arrow'] | None) – Whether to use regular axis or arrows as the axis.

  • -
  • arrow_length (float, default 0.25) – Length of the arrow head (px).

  • -
  • arrow_size (float, default 1) – Size of the arrow.

  • -
  • arrow_color (str, default '#3f3f3f') –

    Color of the arrows. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • arrow_angle (float, default 10) – Angle of the arrow head in degrees.

  • -
  • legend_ondata (bool, default False) – whether to show legend on data

  • -
  • ondata_size (float, default 12) – size of the legend (text) on data.

  • -
  • ondata_color (str, default '#3f3f3f') – color of the legend (text) on data

  • -
  • ondata_fontface (str, default 'bold') – fontface of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-face

  • -
  • ondata_family (str, default 'sans') – family of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-family

  • -
  • ondata_alpha (float, default 1) – alpha (transparency) of the legend on data.

  • -
  • ondata_weighted (bool, default True) – whether to use weighted mean for the legend on data. -If True, the weighted mean of the group means is used. -If False, the arithmetic mean of the group means is used.

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

PlotSpec – Dimensional reduction plot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.subdimensional.tsne.html b/docs/_build/generated/cellestial.single.core.subdimensional.tsne.html deleted file mode 100644 index c6156de..0000000 --- a/docs/_build/generated/cellestial.single.core.subdimensional.tsne.html +++ /dev/null @@ -1,573 +0,0 @@ - - - - - - - - - - - cellestial.single.core.subdimensional.tsne - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.subdimensional.tsne#

-
-
-tsne(data: AnnData, key: str | None = None, *, mapping: FeatureSpec | None = None, use_key: str | None = None, xy: tuple[int, int] | Sequence[int] = (1, 2), size: float = 0.8, variable_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', color_low: str = '#e6e6e6', color_mid: str | None = None, color_high: str = '#377eb8', mid_point: Literal['mean', 'median', 'mid'] | float = 'median', axis_type: Literal['axis', 'arrow'] | None = None, arrow_length: float = 0.25, arrow_size: float = 1, arrow_color: str = '#3f3f3f', arrow_angle: float = 10, legend_ondata: bool = False, ondata_size: float = 12, ondata_color: str = '#3f3f3f', ondata_fontface: str = 'bold', ondata_family: str = 'sans', ondata_alpha: float = 1, ondata_weighted: bool = True, **point_kwargs) PlotSpec[source]#
-

tSNE Dimensionality reduction plot.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • key (str, default None) – The key (cell feature) to color the points by. -e.g., ‘leiden’ or ‘louvain’ to color by clusters or gene name for expression.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • use_key (str, default None) – The specific key to use for the desired dimensions. -e.g., ‘X_umap_2d’ or ‘X_pca_2d’. -Otherwise, the function will decide on the key based on the dimensions.

  • -
  • xy (tuple[int, int] | Sequence[int], default (1, 2)) – The x and y axes to use for the plot. -e.g., (1, 2) for UMAP1 and UMAP2.

  • -
  • size (float, default 0.8) – The size of the points.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • color_low (str, default '#e6e6e6') –

    The color to use for the low end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_mid (str, default None) –

    The color to use for the middle part of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_high (str, default '#377EB8') –

    The color to use for the high end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • mid_point (Literal[``’mean’, ``'median', 'mid'] | float, default 'median') – The midpoint (in data value) of the color gradient. -Can be ‘mean’, ‘median’ and ‘mid’ or a number (float or int). -- If ‘mean’, the midpoint is the mean of the data. -- If ‘median’, the midpoint is the median of the data. -- If ‘mid’, the midpoint is the mean of ‘min’ and ‘max’ of the data.

  • -
  • axis_type (Literal[``’axis’, ``'arrow'] | None) – Whether to use regular axis or arrows as the axis.

  • -
  • arrow_length (float, default 0.25) – Length of the arrow head (px).

  • -
  • arrow_size (float, default 1) – Size of the arrow.

  • -
  • arrow_color (str, default '#3f3f3f') –

    Color of the arrows. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • arrow_angle (float, default 10) – Angle of the arrow head in degrees.

  • -
  • legend_ondata (bool, default False) – whether to show legend on data

  • -
  • ondata_size (float, default 12) – size of the legend (text) on data.

  • -
  • ondata_color (str, default '#3f3f3f') – color of the legend (text) on data

  • -
  • ondata_fontface (str, default 'bold') – fontface of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-face

  • -
  • ondata_family (str, default 'sans') – family of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-family

  • -
  • ondata_alpha (float, default 1) – alpha (transparency) of the legend on data.

  • -
  • ondata_weighted (bool, default True) – whether to use weighted mean for the legend on data. -If True, the weighted mean of the group means is used. -If False, the arithmetic mean of the group means is used.

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

PlotSpec – Dimensional reduction plot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.subdimensional.umap.html b/docs/_build/generated/cellestial.single.core.subdimensional.umap.html deleted file mode 100644 index 18b32bd..0000000 --- a/docs/_build/generated/cellestial.single.core.subdimensional.umap.html +++ /dev/null @@ -1,573 +0,0 @@ - - - - - - - - - - - cellestial.single.core.subdimensional.umap - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.subdimensional.umap#

-
-
-umap(data: AnnData, key: str | None = None, *, mapping: FeatureSpec | None = None, use_key: str | None = None, xy: tuple[int, int] | Sequence[int] = (1, 2), size: float = 0.8, variable_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', color_low: str = '#e6e6e6', color_mid: str | None = None, color_high: str = '#377eb8', mid_point: Literal['mean', 'median', 'mid'] | float = 'median', axis_type: Literal['axis', 'arrow'] | None = None, arrow_length: float = 0.25, arrow_size: float = 1, arrow_color: str = '#3f3f3f', arrow_angle: float = 10, legend_ondata: bool = False, ondata_size: float = 12, ondata_color: str = '#3f3f3f', ondata_fontface: str = 'bold', ondata_family: str = 'sans', ondata_alpha: float = 1, ondata_weighted: bool = True, **point_kwargs) PlotSpec[source]#
-

UMAP Dimensionality reduction plot.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • key (str, default None) – The key (cell feature) to color the points by. -e.g., ‘leiden’ or ‘louvain’ to color by clusters or gene name for expression.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • use_key (str, default None) – The specific key to use for the desired dimensions. -e.g., ‘X_umap_2d’ or ‘X_pca_2d’. -Otherwise, the function will decide on the key based on the dimensions.

  • -
  • xy (tuple[int, int] | Sequence[int], default (1, 2)) – The x and y axes to use for the plot. -e.g., (1, 2) for UMAP1 and UMAP2.

  • -
  • size (float, default 0.8) – The size of the points.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • color_low (str, default '#e6e6e6') –

    The color to use for the low end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_mid (str, default None) –

    The color to use for the middle part of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_high (str, default '#377EB8') –

    The color to use for the high end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • mid_point (Literal[``’mean’, ``'median', 'mid'] | float, default 'median') – The midpoint (in data value) of the color gradient. -Can be ‘mean’, ‘median’ and ‘mid’ or a number (float or int). -- If ‘mean’, the midpoint is the mean of the data. -- If ‘median’, the midpoint is the median of the data. -- If ‘mid’, the midpoint is the mean of ‘min’ and ‘max’ of the data.

  • -
  • axis_type (Literal[``’axis’, ``'arrow'] | None) – Whether to use regular axis or arrows as the axis.

  • -
  • arrow_length (float, default 0.25) – Length of the arrow head (px).

  • -
  • arrow_size (float, default 1) – Size of the arrow.

  • -
  • arrow_color (str, default '#3f3f3f') –

    Color of the arrows. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • arrow_angle (float, default 10) – Angle of the arrow head in degrees.

  • -
  • legend_ondata (bool, default False) – whether to show legend on data

  • -
  • ondata_size (float, default 12) – size of the legend (text) on data.

  • -
  • ondata_color (str, default '#3f3f3f') – color of the legend (text) on data

  • -
  • ondata_fontface (str, default 'bold') – fontface of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-face

  • -
  • ondata_family (str, default 'sans') – family of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-family

  • -
  • ondata_alpha (float, default 1) – alpha (transparency) of the legend on data.

  • -
  • ondata_weighted (bool, default True) – whether to use weighted mean for the legend on data. -If True, the weighted mean of the group means is used. -If False, the arithmetic mean of the group means is used.

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

PlotSpec – Dimensional reduction plot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.subdimensionals.dimensionals.html b/docs/_build/generated/cellestial.single.core.subdimensionals.dimensionals.html deleted file mode 100644 index f721a75..0000000 --- a/docs/_build/generated/cellestial.single.core.subdimensionals.dimensionals.html +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - - - - - - cellestial.single.core.subdimensionals.dimensionals - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.subdimensionals.dimensionals#

-
-
-dimensionals(data: AnnData, keys: Sequence[str], *, mapping: FeatureSpec | None = None, dimensions: Literal['umap', 'pca', 'tsne'] = 'umap', use_key: str | None = None, xy: tuple[int, int] | Sequence[int] = (1, 2), size: float = 0.8, variable_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', color_low: str = '#e6e6e6', color_mid: str | None = None, color_high: str = '#377eb8', mid_point: Literal['mean', 'median', 'mid'] | float = 'median', axis_type: Literal['axis', 'arrow'] | None = None, arrow_length: float = 0.25, arrow_size: float = 1, arrow_color: str = '#3f3f3f', arrow_angle: float = 10, legend_ondata: bool = False, ondata_size: float = 12, ondata_color: str = '#3f3f3f', ondata_fontface: str = 'bold', ondata_family: str = 'sans', ondata_alpha: float = 1, ondata_weighted: bool = True, share_labels: bool = True, share_axis: bool = False, layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, ncol: int | None = None, sharex: str | None = None, sharey: str | None = None, widths: list[float] | None = None, heights: list[float] | None = None, hspace: float | None = None, vspace: float | None = None, fit: bool | None = None, align: bool | None = None, guides: str = 'auto', **point_kwargs) SupPlotsSpec[source]#
-

Grid of dimensionality reduction plots.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • keys (list[str] | tuple[str] | Sequence[str]) – The keys (cell features) to color the points by. -e.g., ‘leiden’ or ‘louvain’ to color by clusters or gene name for expression.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • dimensions (Literal[``’umap’, ``'pca', 'tsne'], default 'umap') – The dimensional reduction method to use. -e.g., ‘umap’ or ‘pca’ or ‘tsne’.

  • -
  • xy (tuple[int, int] | Sequence[int], default (1, 2)) – The x and y axes to use for the plot. -e.g., (1, 2) for UMAP1 and UMAP2.

  • -
  • use_key (str, default None) – The specific key to use for the desired dimensions. -e.g., ‘X_umap_2d’ or ‘X_pca_2d’. -Otherwise, the function will decide on the key based on the dimensions.

  • -
  • size (float, default 0.8) – The size of the points.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • cluster_name (str, default 'Cluster') – The name to overwrite the clustering key in the dataframe and the plot.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • color_low (str, default '#e6e6e6') –

    The color to use for the low end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_mid (str, default None) –

    The color to use for the middle part of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_high (str, default '#377EB8') –

    The color to use for the high end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • mid_point (Literal[``’mean’, ``'median', 'mid'] | float, default 'median') – The midpoint (in data value) of the color gradient. -Can be ‘mean’, ‘median’ and ‘mid’ or a number (float or int). -- If ‘mean’, the midpoint is the mean of the data. -- If ‘median’, the midpoint is the median of the data. -- If ‘mid’, the midpoint is the mean of ‘min’ and ‘max’ of the data.

  • -
  • axis_type (Literal[``’axis’, ``'arrow'] | None) – Whether to use regular axis or arrows as the axis.

  • -
  • arrow_length (float, default 0.25) – Length of the arrow head (px).

  • -
  • arrow_size (float, default 1) – Size of the arrow.

  • -
  • arrow_color (str, default '#3f3f3f') –

    Color of the arrows. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • arrow_angle (float, default 10) – Angle of the arrow head in degrees.

  • -
  • legend_ondata (bool, default False) – whether to show legend on data

  • -
  • ondata_size (float, default 12) – size of the legend (text) on data.

  • -
  • ondata_color (str, default '#3f3f3f') – color of the legend (text) on data

  • -
  • ondata_fontface (str, default 'bold') – fontface of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-face

  • -
  • ondata_family (str, default 'sans') – family of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-family

  • -
  • ondata_alpha (float, default 1) – alpha (transparency) of the legend on data.

  • -
  • ondata_weighted (bool, default True) – whether to use weighted mean for the legend on data. -If True, the weighted mean of the group means is used. -If False, the arithmetic mean of the group means is used.

  • -
  • share_labels (bool, default True) – Whether to share the labels across all plots. -If True, only X labels on bottom row and Y labels on left column are shown.

  • -
  • share_axis (bool, default False) – Whether to share the axis across all plots. -If True, only X axis on bottom row and Y axis on left column is shown.

  • -
  • layers (Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default None) – Layers to add to all the plots in the grid.

  • -
  • ncol (int, default None) – Number of columns in grid. If not specified, shows plots horizontally, in one row.

  • -
  • sharex (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • sharey (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • widths (list[float], default None) – Relative width of each column of grid, left to right.

  • -
  • heights (list[float], default None) – Relative height of each row of grid, top-down.

  • -
  • hspace (float | None = None) – Cell horizontal spacing in px.

  • -
  • vspace (float | None = None) – Cell vertical spacing in px.

  • -
  • fit (bool, default True) – Whether to stretch each plot to match the aspect ratio of its cell (fit=True), -or to preserve the original aspect ratio of plots (fit=False).

  • -
  • align (bool, default False) – If True, align inner areas (i.e. “geom” bounds) of plots. -However, cells containing other (sub)grids are not participating -in the plot “inner areas” layouting.

  • -
  • guides (str, default 'auto') –

    -
    Specifies how guides (legends and colorbars) should be treated in the layout.
      -
    • ’collect’ collect guides from all subplots, removing duplicates.

    • -
    • ’keep’ keep guides in their original subplots; do not collect at this level.

    • -
    • ’auto’ allow guides to be collected if an upper-level layout uses guides=’collect’;

    • -
    -
    -
    -

    otherwise, keep them in subplots. -Duplicates are identified by comparing visual properties: -For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). -For colorbars: title, domain limits, breaks, and color gradient.

    -

    For more information on gggrid parameters: -https://lets-plot.org/python/pages/api/lets_plot.gggrid.html

    -

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

SupPlotsSpec – Grid of dimensionality reduction plots.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.subdimensionals.expressions.html b/docs/_build/generated/cellestial.single.core.subdimensionals.expressions.html deleted file mode 100644 index c086c80..0000000 --- a/docs/_build/generated/cellestial.single.core.subdimensionals.expressions.html +++ /dev/null @@ -1,615 +0,0 @@ - - - - - - - - - - - cellestial.single.core.subdimensionals.expressions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.subdimensionals.expressions#

-
-
-expressions(data: AnnData, keys: Sequence[str], *, mapping: FeatureSpec | None = None, dimensions: Literal['umap', 'pca', 'tsne'] = 'umap', use_key: str | None = None, xy: tuple[int, int] | Sequence[int] = (1, 2), size: float = 0.8, variable_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', color_low: str = '#e6e6e6', color_mid: str | None = None, color_high: str = '#377eb8', mid_point: Literal['mean', 'median', 'mid'] | float = 'median', axis_type: Literal['axis', 'arrow'] | None = None, arrow_length: float = 0.25, arrow_size: float = 1, arrow_color: str = '#3f3f3f', arrow_angle: float = 10, legend_ondata: bool = False, ondata_size: float = 12, ondata_color: str = '#3f3f3f', ondata_fontface: str = 'bold', ondata_family: str = 'sans', ondata_alpha: float = 1, ondata_weighted: bool = True, share_labels: bool = True, share_axis: bool = False, layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, ncol: int | None = None, sharex: str | None = None, sharey: str | None = None, widths: list[float] | None = None, heights: list[float] | None = None, hspace: float | None = None, vspace: float | None = None, fit: bool | None = None, align: bool | None = None, guides: str = 'auto', **point_kwargs) SupPlotsSpec[source]#
-

Grid of dimensionality reduction plots.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • keys (list[str] | tuple[str] | Sequence[str]) – The keys (gene names) to color the points by.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • dimensions (Literal[``’umap’, ``'pca', 'tsne'], default 'umap') – The dimensional reduction method to use. -e.g., ‘umap’ or ‘pca’ or ‘tsne’.

  • -
  • xy (tuple[int, int] | Sequence[int], default (1, 2)) – The x and y axes to use for the plot. -e.g., (1, 2) for UMAP1 and UMAP2.

  • -
  • use_key (str, default None) – The specific key to use for the desired dimensions. -e.g., ‘X_umap_2d’ or ‘X_pca_2d’. -Otherwise, the function will decide on the key based on the dimensions.

  • -
  • size (float, default 0.8) – The size of the points.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • cluster_name (str, default 'Cluster') – The name to overwrite the clustering key in the dataframe and the plot.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • color_low (str, default '#e6e6e6') –

    The color to use for the low end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_mid (str, default None) –

    The color to use for the middle part of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_high (str, default '#377EB8') –

    The color to use for the high end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • mid_point (Literal[``’mean’, ``'median', 'mid'] | float, default 'median') – The midpoint (in data value) of the color gradient. -Can be ‘mean’, ‘median’ and ‘mid’ or a number (float or int). -- If ‘mean’, the midpoint is the mean of the data. -- If ‘median’, the midpoint is the median of the data. -- If ‘mid’, the midpoint is the mean of ‘min’ and ‘max’ of the data.

  • -
  • axis_type (Literal[``’axis’, ``'arrow'] | None) – Whether to use regular axis or arrows as the axis.

  • -
  • arrow_length (float, default 0.25) – Length of the arrow head (px).

  • -
  • arrow_size (float, default 1) – Size of the arrow.

  • -
  • arrow_color (str, default '#3f3f3f') –

    Color of the arrows. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • arrow_angle (float, default 10) – Angle of the arrow head in degrees.

  • -
  • legend_ondata (bool, default False) – whether to show legend on data

  • -
  • ondata_size (float, default 12) – size of the legend (text) on data.

  • -
  • ondata_color (str, default '#3f3f3f') – color of the legend (text) on data

  • -
  • ondata_fontface (str, default 'bold') – fontface of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-face

  • -
  • ondata_family (str, default 'sans') – family of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-family

  • -
  • ondata_alpha (float, default 1) – alpha (transparency) of the legend on data.

  • -
  • ondata_weighted (bool, default True) – whether to use weighted mean for the legend on data. -If True, the weighted mean of the group means is used. -If False, the arithmetic mean of the group means is used.

  • -
  • share_labels (bool, default True) – Whether to share the labels across all plots. -If True, only X labels on bottom row and Y labels on left column are shown.

  • -
  • share_axis (bool, default False) – Whether to share the axis across all plots. -If True, only X axis on bottom row and Y axis on left column is shown.

  • -
  • layers (Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default None) – Layers to add to all the plots in the grid.

  • -
  • ncol (int, default None) – Number of columns in grid. If not specified, shows plots horizontally, in one row.

  • -
  • sharex (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • sharey (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • widths (list[float], default None) – Relative width of each column of grid, left to right.

  • -
  • heights (list[float], default None) – Relative height of each row of grid, top-down.

  • -
  • hspace (float | None = None) – Cell horizontal spacing in px.

  • -
  • vspace (float | None = None) – Cell vertical spacing in px.

  • -
  • fit (bool, default True) – Whether to stretch each plot to match the aspect ratio of its cell (fit=True), -or to preserve the original aspect ratio of plots (fit=False).

  • -
  • align (bool, default False) – If True, align inner areas (i.e. “geom” bounds) of plots. -However, cells containing other (sub)grids are not participating -in the plot “inner areas” layouting.

  • -
  • guides (str, default 'auto') –

    -
    Specifies how guides (legends and colorbars) should be treated in the layout.
      -
    • ’collect’ collect guides from all subplots, removing duplicates.

    • -
    • ’keep’ keep guides in their original subplots; do not collect at this level.

    • -
    • ’auto’ allow guides to be collected if an upper-level layout uses guides=’collect’;

    • -
    -
    -
    -

    otherwise, keep them in subplots. -Duplicates are identified by comparing visual properties: -For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). -For colorbars: title, domain limits, breaks, and color gradient.

    -

    For more information on gggrid parameters: -https://lets-plot.org/python/pages/api/lets_plot.gggrid.html

    -

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

SupPlotsSpec – Grid of dimensionality reduction plots.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.subdimensionals.pcas.html b/docs/_build/generated/cellestial.single.core.subdimensionals.pcas.html deleted file mode 100644 index ed06445..0000000 --- a/docs/_build/generated/cellestial.single.core.subdimensionals.pcas.html +++ /dev/null @@ -1,614 +0,0 @@ - - - - - - - - - - - cellestial.single.core.subdimensionals.pcas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.subdimensionals.pcas#

-
-
-pcas(data: AnnData, keys: Sequence[str], *, mapping: FeatureSpec | None = None, use_key: str | None = None, xy: tuple[int, int] | Sequence[int] = (1, 2), size: float = 0.8, variable_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', color_low: str = '#e6e6e6', color_mid: str | None = None, color_high: str = '#377eb8', mid_point: Literal['mean', 'median', 'mid'] | float = 'median', axis_type: Literal['axis', 'arrow'] | None = None, arrow_length: float = 0.25, arrow_size: float = 1, arrow_color: str = '#3f3f3f', arrow_angle: float = 10, legend_ondata: bool = False, ondata_size: float = 12, ondata_color: str = '#3f3f3f', ondata_fontface: str = 'bold', ondata_family: str = 'sans', ondata_alpha: float = 1, ondata_weighted: bool = True, share_labels: bool = True, share_axis: bool = False, layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, ncol: int | None = None, sharex: str | None = None, sharey: str | None = None, widths: list[float] | None = None, heights: list[float] | None = None, hspace: float | None = None, vspace: float | None = None, fit: bool | None = None, align: bool | None = None, guides: str = 'auto', **point_kwargs) SupPlotsSpec[source]#
-

Grid of dimensionality reduction plots.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • keys (list[str] | tuple[str] | Sequence[str]) – The keys (cell features) to color the points by. -e.g., ‘leiden’ or ‘louvain’ to color by clusters or gene name for expression.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • xy (tuple[int, int] | Sequence[int], default (1, 2)) – The x and y axes to use for the plot. -e.g., (1, 2) for UMAP1 and UMAP2.

  • -
  • use_key (str, default None) – The specific key to use for the desired dimensions. -e.g., ‘X_umap_2d’ or ‘X_pca_2d’. -Otherwise, the function will decide on the key based on the dimensions.

  • -
  • size (float, default 0.8) – The size of the points.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • cluster_name (str, default 'Cluster') – The name to overwrite the clustering key in the dataframe and the plot.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • color_low (str, default '#e6e6e6') –

    The color to use for the low end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_mid (str, default None) –

    The color to use for the middle part of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_high (str, default '#377EB8') –

    The color to use for the high end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • mid_point (Literal[``’mean’, ``'median', 'mid'] | float, default 'median') – The midpoint (in data value) of the color gradient. -Can be ‘mean’, ‘median’ and ‘mid’ or a number (float or int). -- If ‘mean’, the midpoint is the mean of the data. -- If ‘median’, the midpoint is the median of the data. -- If ‘mid’, the midpoint is the mean of ‘min’ and ‘max’ of the data.

  • -
  • axis_type (Literal[``’axis’, ``'arrow'] | None) – Whether to use regular axis or arrows as the axis.

  • -
  • arrow_length (float, default 0.25) – Length of the arrow head (px).

  • -
  • arrow_size (float, default 1) – Size of the arrow.

  • -
  • arrow_color (str, default '#3f3f3f') –

    Color of the arrows. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • arrow_angle (float, default 10) – Angle of the arrow head in degrees.

  • -
  • legend_ondata (bool, default False) – whether to show legend on data

  • -
  • ondata_size (float, default 12) – size of the legend (text) on data.

  • -
  • ondata_color (str, default '#3f3f3f') – color of the legend (text) on data

  • -
  • ondata_fontface (str, default 'bold') – fontface of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-face

  • -
  • ondata_family (str, default 'sans') – family of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-family

  • -
  • ondata_alpha (float, default 1) – alpha (transparency) of the legend on data.

  • -
  • ondata_weighted (bool, default True) – whether to use weighted mean for the legend on data. -If True, the weighted mean of the group means is used. -If False, the arithmetic mean of the group means is used.

  • -
  • share_labels (bool, default True) – Whether to share the labels across all plots. -If True, only X labels on bottom row and Y labels on left column are shown.

  • -
  • share_axis (bool, default False) – Whether to share the axis across all plots. -If True, only X axis on bottom row and Y axis on left column is shown.

  • -
  • layers (Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default None) – Layers to add to all the plots in the grid.

  • -
  • ncol (int, default None) – Number of columns in grid. If not specified, shows plots horizontally, in one row.

  • -
  • sharex (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • sharey (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • widths (list[float], default None) – Relative width of each column of grid, left to right.

  • -
  • heights (list[float], default None) – Relative height of each row of grid, top-down.

  • -
  • hspace (float | None = None) – Cell horizontal spacing in px.

  • -
  • vspace (float | None = None) – Cell vertical spacing in px.

  • -
  • fit (bool, default True) – Whether to stretch each plot to match the aspect ratio of its cell (fit=True), -or to preserve the original aspect ratio of plots (fit=False).

  • -
  • align (bool, default False) – If True, align inner areas (i.e. “geom” bounds) of plots. -However, cells containing other (sub)grids are not participating -in the plot “inner areas” layouting.

  • -
  • guides (str, default 'auto') –

    -
    Specifies how guides (legends and colorbars) should be treated in the layout.
      -
    • ’collect’ collect guides from all subplots, removing duplicates.

    • -
    • ’keep’ keep guides in their original subplots; do not collect at this level.

    • -
    • ’auto’ allow guides to be collected if an upper-level layout uses guides=’collect’;

    • -
    -
    -
    -

    otherwise, keep them in subplots. -Duplicates are identified by comparing visual properties: -For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). -For colorbars: title, domain limits, breaks, and color gradient.

    -

    For more information on gggrid parameters: -https://lets-plot.org/python/pages/api/lets_plot.gggrid.html

    -

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

SupPlotsSpec – Grid of dimensionality reduction plots.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.subdimensionals.tsnes.html b/docs/_build/generated/cellestial.single.core.subdimensionals.tsnes.html deleted file mode 100644 index f8b66eb..0000000 --- a/docs/_build/generated/cellestial.single.core.subdimensionals.tsnes.html +++ /dev/null @@ -1,614 +0,0 @@ - - - - - - - - - - - cellestial.single.core.subdimensionals.tsnes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.subdimensionals.tsnes#

-
-
-tsnes(data: AnnData, keys: Sequence[str], *, mapping: FeatureSpec | None = None, use_key: str | None = None, xy: tuple[int, int] | Sequence[int] = (1, 2), size: float = 0.8, variable_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', color_low: str = '#e6e6e6', color_mid: str | None = None, color_high: str = '#377eb8', mid_point: Literal['mean', 'median', 'mid'] | float = 'median', axis_type: Literal['axis', 'arrow'] | None = None, arrow_length: float = 0.25, arrow_size: float = 1, arrow_color: str = '#3f3f3f', arrow_angle: float = 10, legend_ondata: bool = False, ondata_size: float = 12, ondata_color: str = '#3f3f3f', ondata_fontface: str = 'bold', ondata_family: str = 'sans', ondata_alpha: float = 1, ondata_weighted: bool = True, share_labels: bool = True, share_axis: bool = False, layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, ncol: int | None = None, sharex: str | None = None, sharey: str | None = None, widths: list[float] | None = None, heights: list[float] | None = None, hspace: float | None = None, vspace: float | None = None, fit: bool | None = None, align: bool | None = None, guides: str = 'auto', **point_kwargs) SupPlotsSpec[source]#
-

Grid of dimensionality reduction plots.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • keys (list[str] | tuple[str] | Sequence[str]) – The keys (cell features) to color the points by. -e.g., ‘leiden’ or ‘louvain’ to color by clusters or gene name for expression.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • xy (tuple[int, int] | Sequence[int], default (1, 2)) – The x and y axes to use for the plot. -e.g., (1, 2) for UMAP1 and UMAP2.

  • -
  • use_key (str, default None) – The specific key to use for the desired dimensions. -e.g., ‘X_umap_2d’ or ‘X_pca_2d’. -Otherwise, the function will decide on the key based on the dimensions.

  • -
  • size (float, default 0.8) – The size of the points.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • cluster_name (str, default 'Cluster') – The name to overwrite the clustering key in the dataframe and the plot.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • color_low (str, default '#e6e6e6') –

    The color to use for the low end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_mid (str, default None) –

    The color to use for the middle part of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_high (str, default '#377EB8') –

    The color to use for the high end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • mid_point (Literal[``’mean’, ``'median', 'mid'] | float, default 'median') – The midpoint (in data value) of the color gradient. -Can be ‘mean’, ‘median’ and ‘mid’ or a number (float or int). -- If ‘mean’, the midpoint is the mean of the data. -- If ‘median’, the midpoint is the median of the data. -- If ‘mid’, the midpoint is the mean of ‘min’ and ‘max’ of the data.

  • -
  • axis_type (Literal[``’axis’, ``'arrow'] | None) – Whether to use regular axis or arrows as the axis.

  • -
  • arrow_length (float, default 0.25) – Length of the arrow head (px).

  • -
  • arrow_size (float, default 1) – Size of the arrow.

  • -
  • arrow_color (str, default '#3f3f3f') –

    Color of the arrows. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • arrow_angle (float, default 10) – Angle of the arrow head in degrees.

  • -
  • legend_ondata (bool, default False) – whether to show legend on data

  • -
  • ondata_size (float, default 12) – size of the legend (text) on data.

  • -
  • ondata_color (str, default '#3f3f3f') – color of the legend (text) on data

  • -
  • ondata_fontface (str, default 'bold') – fontface of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-face

  • -
  • ondata_family (str, default 'sans') – family of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-family

  • -
  • ondata_alpha (float, default 1) – alpha (transparency) of the legend on data.

  • -
  • ondata_weighted (bool, default True) – whether to use weighted mean for the legend on data. -If True, the weighted mean of the group means is used. -If False, the arithmetic mean of the group means is used.

  • -
  • share_labels (bool, default True) – Whether to share the labels across all plots. -If True, only X labels on bottom row and Y labels on left column are shown.

  • -
  • share_axis (bool, default False) – Whether to share the axis across all plots. -If True, only X axis on bottom row and Y axis on left column is shown.

  • -
  • layers (Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default None) – Layers to add to all the plots in the grid.

  • -
  • ncol (int, default None) – Number of columns in grid. If not specified, shows plots horizontally, in one row.

  • -
  • sharex (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • sharey (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • widths (list[float], default None) – Relative width of each column of grid, left to right.

  • -
  • heights (list[float], default None) – Relative height of each row of grid, top-down.

  • -
  • hspace (float | None = None) – Cell horizontal spacing in px.

  • -
  • vspace (float | None = None) – Cell vertical spacing in px.

  • -
  • fit (bool, default True) – Whether to stretch each plot to match the aspect ratio of its cell (fit=True), -or to preserve the original aspect ratio of plots (fit=False).

  • -
  • align (bool, default False) – If True, align inner areas (i.e. “geom” bounds) of plots. -However, cells containing other (sub)grids are not participating -in the plot “inner areas” layouting.

  • -
  • guides (str, default 'auto') –

    -
    Specifies how guides (legends and colorbars) should be treated in the layout.
      -
    • ’collect’ collect guides from all subplots, removing duplicates.

    • -
    • ’keep’ keep guides in their original subplots; do not collect at this level.

    • -
    • ’auto’ allow guides to be collected if an upper-level layout uses guides=’collect’;

    • -
    -
    -
    -

    otherwise, keep them in subplots. -Duplicates are identified by comparing visual properties: -For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). -For colorbars: title, domain limits, breaks, and color gradient.

    -

    For more information on gggrid parameters: -https://lets-plot.org/python/pages/api/lets_plot.gggrid.html

    -

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

SupPlotsSpec – Grid of dimensionality reduction plots.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.core.subdimensionals.umaps.html b/docs/_build/generated/cellestial.single.core.subdimensionals.umaps.html deleted file mode 100644 index 5283c22..0000000 --- a/docs/_build/generated/cellestial.single.core.subdimensionals.umaps.html +++ /dev/null @@ -1,614 +0,0 @@ - - - - - - - - - - - cellestial.single.core.subdimensionals.umaps - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.core.subdimensionals.umaps#

-
-
-umaps(data: AnnData, keys: Sequence[str], *, mapping: FeatureSpec | None = None, use_key: str | None = None, xy: tuple[int, int] | Sequence[int] = (1, 2), size: float = 0.8, variable_keys: Sequence[str] | str | None = None, tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, observations_name: str = 'Barcode', color_low: str = '#e6e6e6', color_mid: str | None = None, color_high: str = '#377eb8', mid_point: Literal['mean', 'median', 'mid'] | float = 'median', axis_type: Literal['axis', 'arrow'] | None = None, arrow_length: float = 0.25, arrow_size: float = 1, arrow_color: str = '#3f3f3f', arrow_angle: float = 10, legend_ondata: bool = False, ondata_size: float = 12, ondata_color: str = '#3f3f3f', ondata_fontface: str = 'bold', ondata_family: str = 'sans', ondata_alpha: float = 1, ondata_weighted: bool = True, share_labels: bool = True, share_axis: bool = False, layers: Sequence[FeatureSpec | LayerSpec] | FeatureSpec | LayerSpec | None = None, ncol: int | None = None, sharex: str | None = None, sharey: str | None = None, widths: list[float] | None = None, heights: list[float] | None = None, hspace: float | None = None, vspace: float | None = None, fit: bool | None = None, align: bool | None = None, guides: str = 'auto', **point_kwargs) SupPlotsSpec[source]#
-

Grid of dimensionality reduction plots.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • keys (list[str] | tuple[str] | Sequence[str]) – The keys (cell features) to color the points by. -e.g., ‘leiden’ or ‘louvain’ to color by clusters or gene name for expression.

  • -
  • mapping (FeatureSpec | None, default None) – Additional aesthetic mappings for the plot, the result of aes().

  • -
  • xy (tuple[int, int] | Sequence[int], default (1, 2)) – The x and y axes to use for the plot. -e.g., (1, 2) for UMAP1 and UMAP2.

  • -
  • use_key (str, default None) – The specific key to use for the desired dimensions. -e.g., ‘X_umap_2d’ or ‘X_pca_2d’. -Otherwise, the function will decide on the key based on the dimensions.

  • -
  • size (float, default 0.8) – The size of the points.

  • -
  • variable_keys (str | Sequence[str] | None, default None) – Variable keys to add to the DataFrame. If None, no additional keys are added.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • cluster_name (str, default 'Cluster') – The name to overwrite the clustering key in the dataframe and the plot.

  • -
  • observations_name (str, default 'Barcode') – The name to give to barcode (or index) column in the dataframe.

  • -
  • color_low (str, default '#e6e6e6') –

    The color to use for the low end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_mid (str, default None) –

    The color to use for the middle part of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • color_high (str, default '#377EB8') –

    The color to use for the high end of the color gradient. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • mid_point (Literal[``’mean’, ``'median', 'mid'] | float, default 'median') – The midpoint (in data value) of the color gradient. -Can be ‘mean’, ‘median’ and ‘mid’ or a number (float or int). -- If ‘mean’, the midpoint is the mean of the data. -- If ‘median’, the midpoint is the median of the data. -- If ‘mid’, the midpoint is the mean of ‘min’ and ‘max’ of the data.

  • -
  • axis_type (Literal[``’axis’, ``'arrow'] | None) – Whether to use regular axis or arrows as the axis.

  • -
  • arrow_length (float, default 0.25) – Length of the arrow head (px).

  • -
  • arrow_size (float, default 1) – Size of the arrow.

  • -
  • arrow_color (str, default '#3f3f3f') –

    Color of the arrows. -- Accepts:

    -
    -
      -
    • hex code e.g. ‘#f1f1f1’

    • -
    • color name (of a limited set of colors).

    • -
    • RGB/RGBA e.g. ‘rgb(0, 0, 255)’, ‘rgba(0, 0, 255, 0.5)’.

    • -
    -
    -
      -
    • Applies to continuous (non-categorical) data.

    • -
    -

  • -
  • arrow_angle (float, default 10) – Angle of the arrow head in degrees.

  • -
  • legend_ondata (bool, default False) – whether to show legend on data

  • -
  • ondata_size (float, default 12) – size of the legend (text) on data.

  • -
  • ondata_color (str, default '#3f3f3f') – color of the legend (text) on data

  • -
  • ondata_fontface (str, default 'bold') – fontface of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-face

  • -
  • ondata_family (str, default 'sans') – family of the legend (text) on data. -https://lets-plot.org/python/pages/aesthetics.html#font-family

  • -
  • ondata_alpha (float, default 1) – alpha (transparency) of the legend on data.

  • -
  • ondata_weighted (bool, default True) – whether to use weighted mean for the legend on data. -If True, the weighted mean of the group means is used. -If False, the arithmetic mean of the group means is used.

  • -
  • share_labels (bool, default True) – Whether to share the labels across all plots. -If True, only X labels on bottom row and Y labels on left column are shown.

  • -
  • share_axis (bool, default False) – Whether to share the axis across all plots. -If True, only X axis on bottom row and Y axis on left column is shown.

  • -
  • layers (Sequence[FeatureSpec|LayerSpec] | FeatureSpec | LayerSpec | None, default None) – Layers to add to all the plots in the grid.

  • -
  • ncol (int, default None) – Number of columns in grid. If not specified, shows plots horizontally, in one row.

  • -
  • sharex (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • sharey (bool, default None) – Controls sharing of axis limits between subplots in the grid. -all/True - share limits between all subplots. -none/False - do not share limits between subplots. -row - share limits between subplots in the same row. -col - share limits between subplots in the same column.

  • -
  • widths (list[float], default None) – Relative width of each column of grid, left to right.

  • -
  • heights (list[float], default None) – Relative height of each row of grid, top-down.

  • -
  • hspace (float | None = None) – Cell horizontal spacing in px.

  • -
  • vspace (float | None = None) – Cell vertical spacing in px.

  • -
  • fit (bool, default True) – Whether to stretch each plot to match the aspect ratio of its cell (fit=True), -or to preserve the original aspect ratio of plots (fit=False).

  • -
  • align (bool, default False) – If True, align inner areas (i.e. “geom” bounds) of plots. -However, cells containing other (sub)grids are not participating -in the plot “inner areas” layouting.

  • -
  • guides (str, default 'auto') –

    -
    Specifies how guides (legends and colorbars) should be treated in the layout.
      -
    • ’collect’ collect guides from all subplots, removing duplicates.

    • -
    • ’keep’ keep guides in their original subplots; do not collect at this level.

    • -
    • ’auto’ allow guides to be collected if an upper-level layout uses guides=’collect’;

    • -
    -
    -
    -

    otherwise, keep them in subplots. -Duplicates are identified by comparing visual properties: -For legends: title, labels, and all aesthetic values (colors, shapes, sizes, etc.). -For colorbars: title, domain limits, breaks, and color gradient.

    -

    For more information on gggrid parameters: -https://lets-plot.org/python/pages/api/lets_plot.gggrid.html

    -

  • -
  • **point_kwargs – Additional parameters for the geom_point layer. -For more information on geom_point parameters, see: -https://lets-plot.org/python/pages/api/lets_plot.geom_point.html

  • -
-
-
Returns:
-

SupPlotsSpec – Grid of dimensionality reduction plots.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.single.special.dotplot.dotplot.html b/docs/_build/generated/cellestial.single.special.dotplot.dotplot.html deleted file mode 100644 index 041a9d3..0000000 --- a/docs/_build/generated/cellestial.single.special.dotplot.dotplot.html +++ /dev/null @@ -1,501 +0,0 @@ - - - - - - - - - - - cellestial.single.special.dotplot.dotplot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.single.special.dotplot.dotplot#

-
-
-dotplot(data: AnnData, keys: Sequence[str], group_by: str, *, threshold: float = 0, variables_name: str = 'gene', value_name: str = 'expression', color_low: str = '#e6e6e6', color_high: str = '#D2042D', fill: bool = False, sort_by: str | Sequence[str] | None = None, sort_order: Literal['ascending', 'descending'] = 'descending', percentage_key: str = 'pct_exp', mean_key: str = 'avg_exp', tooltips: Literal['none'] | Sequence[str] | FeatureSpec | None = None, interactive: bool = False, **geom_kwargs) PlotSpec[source]#
-

Dotplot.

-
-
Parameters:
-
    -
  • data (AnnData) – The AnnData object of the single cell data.

  • -
  • keys (Sequence[str]) – The variable keys or names to include in the dotplot.

  • -
  • group_by (str) – The key to group the data by.

  • -
  • threshold (float, default 0) – The expression threshold to consider a gene as expressed.

  • -
  • variables_name (str, default 'gene') – The name of the variable column in the long format.

  • -
  • value_name (str, default 'expression') – The name of the value column in the long format.

  • -
  • color_low (str, default '#e6e6e6') – The low color for the gradient.

  • -
  • color_high (str, default '#D2042D') – The high color for the gradient.

  • -
  • fill (bool, optional) – Whether to use fill aesthetic instead of color, by default False.

  • -
  • sort_by (str | None) – The column to sort the results by, by default None.

  • -
  • sort_order (str, default 'descending') – The sort order, either ‘ascending’ or ‘descending’.

  • -
  • percentage_key (str, default 'pct_exp') – The name of the percentage column.

  • -
  • mean_key (str, default 'avg_exp') – The name of the mean expression column.

  • -
  • tooltips (Literal[``’none’``] | Sequence[str] | FeatureSpec | None, default None) – Tooltips to show when hovering over the geom. -Accepts Sequence[str] or result of layer_tooltips() for more complex tooltips. -Use ‘none’ to disable tooltips.

  • -
  • show_tooltips (bool, default True) – Whether to show tooltips.

  • -
  • interactive (bool, default False) – Whether to make the plot interactive.

  • -
  • **geom_kwargs (Any) – Additional keyword arguments for the geom_point layer.

  • -
-
-
Returns:
-

PlotSpec – Dotplot.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.util.colors.show_colors.html b/docs/_build/generated/cellestial.util.colors.show_colors.html deleted file mode 100644 index 1135cf5..0000000 --- a/docs/_build/generated/cellestial.util.colors.show_colors.html +++ /dev/null @@ -1,473 +0,0 @@ - - - - - - - - - - - cellestial.util.colors.show_colors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.util.colors.show_colors#

-
-
-show_colors()[source]#
-

Show a grid of hand-picked colors.

-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.util.get_mapping.html b/docs/_build/generated/cellestial.util.get_mapping.html deleted file mode 100644 index 8793fa2..0000000 --- a/docs/_build/generated/cellestial.util.get_mapping.html +++ /dev/null @@ -1,473 +0,0 @@ - - - - - - - - - - - cellestial.util.get_mapping - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.util.get_mapping#

-
-
-get_mapping()#
-

Returns the mapping of the plot as a dict.

-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.util.utilities.get_mapping.html b/docs/_build/generated/cellestial.util.utilities.get_mapping.html deleted file mode 100644 index 01af23f..0000000 --- a/docs/_build/generated/cellestial.util.utilities.get_mapping.html +++ /dev/null @@ -1,473 +0,0 @@ - - - - - - - - - - - cellestial.util.utilities.get_mapping - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.util.utilities.get_mapping#

-
-
-get_mapping()#
-

Returns the mapping of the plot as a dict.

-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.util.utilities.retrieve.html b/docs/_build/generated/cellestial.util.utilities.retrieve.html deleted file mode 100644 index 2d3a9d9..0000000 --- a/docs/_build/generated/cellestial.util.utilities.retrieve.html +++ /dev/null @@ -1,487 +0,0 @@ - - - - - - - - - - - cellestial.util.utilities.retrieve - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.util.utilities.retrieve#

-
-
-retrieve(plot: PlotSpec | SupPlotsSpec, index: int = 0) pl.DataFrame[source]#
-

Retrieves the dataframe from a PlotSpec or SupPlotsSpec using the index.

-
-
plotPlotSpec | SupPlotsSpec

The plot to retrieve the dataframe from.

-
-
indexint, optional

The index of the figure to retrieve the dataframe from, by default 0

-
-
-
-
Returns:
-

pl.DataFrame – The dataframe utilized in the plot.

-
-
Raises:
-

TypeError – If the plot is not a PlotSpec or SupPlotsSpec object.

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/generated/cellestial.util.utilities.slice.html b/docs/_build/generated/cellestial.util.utilities.slice.html deleted file mode 100644 index c76422c..0000000 --- a/docs/_build/generated/cellestial.util.utilities.slice.html +++ /dev/null @@ -1,490 +0,0 @@ - - - - - - - - - - - cellestial.util.utilities.slice - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- -
- - - - - -
-
- - - - - - -
- - - - - - - - - -
- -
- - -
-
- -
-
- -
- -
- - -
- -
- - -
-
- - - - - -
- -
-

cellestial.util.utilities.slice#

-
-
-slice()[source]#
-

Slice a ggrid (SupPlotsSpec) objects with given index.

-
-
Parameters:
-
-
-
Returns:
-

PlotSpec | SupPlotsSpec – The sliced grid.

-
-
Raises:
-

TypeError – If the grid is not a SupPlotsSpec object. - If the index is not an int or Sequence[int].

-
-
-
- -
- - -
- - - - - -
- - - - -
- - -
-
- -
- -
-
-
- - - - - -
- - -
- - \ No newline at end of file diff --git a/docs/_build/searchindex.js b/docs/_build/searchindex.js deleted file mode 100644 index 6f93188..0000000 --- a/docs/_build/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({"alltitles":{"API Reference":[[0,null]],"About Lets-Plot":[[30,"about-lets-plot"]],"Base":[[0,"base"]],"Basic":[[0,"basic"]],"Cellestial":[[30,null]],"Common":[[0,"common"]],"Content":[[30,"content"]],"Data Frames":[[0,"data-frames"]],"Design Philosophy":[[32,null]],"Dimensionality Reduction":[[0,"dimensionality-reduction"]],"Distributions":[[0,"distributions"]],"Example":[[30,"example"]],"Example: 100k cells":[[31,"example-100k-cells"]],"Explicitness over implicitness":[[32,"explicitness-over-implicitness"]],"Installation":[[30,"installation"]],"Layers":[[0,"layers"]],"Modularity over abstraction":[[32,"modularity-over-abstraction"]],"Performance & Scalability":[[31,null]],"Predictability over flexibility":[[32,"predictability-over-flexibility"]],"Simplicity & Expressiveness":[[32,"simplicity-expressiveness"]],"Special":[[0,"special"]],"Utility":[[0,"utility"]],"cellestial.bar":[[3,null]],"cellestial.boxplot":[[4,null]],"cellestial.boxplots":[[5,null]],"cellestial.build_frame":[[6,null]],"cellestial.cluster_outlines":[[7,null]],"cellestial.dimensional":[[8,null]],"cellestial.dimensionals":[[9,null]],"cellestial.dotplot":[[10,null]],"cellestial.expression":[[11,null]],"cellestial.expressions":[[12,null]],"cellestial.get_mapping":[[13,null]],"cellestial.heatmap":[[14,null]],"cellestial.pca":[[15,null]],"cellestial.pcas":[[16,null]],"cellestial.plot":[[17,null]],"cellestial.retrieve":[[18,null]],"cellestial.scatter":[[19,null]],"cellestial.show_colors":[[20,null]],"cellestial.slice":[[21,null]],"cellestial.tsne":[[22,null]],"cellestial.tsnes":[[23,null]],"cellestial.umap":[[24,null]],"cellestial.umaps":[[25,null]],"cellestial.violin":[[26,null]],"cellestial.violins":[[27,null]],"cellestial.xyplot":[[28,null]],"cellestial.xyplots":[[29,null]]},"docnames":["API","_templates/autoapi/python/module","_templates/autosummary/table","generated/cellestial.bar","generated/cellestial.boxplot","generated/cellestial.boxplots","generated/cellestial.build_frame","generated/cellestial.cluster_outlines","generated/cellestial.dimensional","generated/cellestial.dimensionals","generated/cellestial.dotplot","generated/cellestial.expression","generated/cellestial.expressions","generated/cellestial.get_mapping","generated/cellestial.heatmap","generated/cellestial.pca","generated/cellestial.pcas","generated/cellestial.plot","generated/cellestial.retrieve","generated/cellestial.scatter","generated/cellestial.show_colors","generated/cellestial.slice","generated/cellestial.tsne","generated/cellestial.tsnes","generated/cellestial.umap","generated/cellestial.umaps","generated/cellestial.violin","generated/cellestial.violins","generated/cellestial.xyplot","generated/cellestial.xyplots","index","performance","philosophy"],"envversion":{"sphinx":66,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["API.rst","_templates/autoapi/python/module.rst","_templates/autosummary/table.rst","generated/cellestial.bar.rst","generated/cellestial.boxplot.rst","generated/cellestial.boxplots.rst","generated/cellestial.build_frame.rst","generated/cellestial.cluster_outlines.rst","generated/cellestial.dimensional.rst","generated/cellestial.dimensionals.rst","generated/cellestial.dotplot.rst","generated/cellestial.expression.rst","generated/cellestial.expressions.rst","generated/cellestial.get_mapping.rst","generated/cellestial.heatmap.rst","generated/cellestial.pca.rst","generated/cellestial.pcas.rst","generated/cellestial.plot.rst","generated/cellestial.retrieve.rst","generated/cellestial.scatter.rst","generated/cellestial.show_colors.rst","generated/cellestial.slice.rst","generated/cellestial.tsne.rst","generated/cellestial.tsnes.rst","generated/cellestial.umap.rst","generated/cellestial.umaps.rst","generated/cellestial.violin.rst","generated/cellestial.violins.rst","generated/cellestial.xyplot.rst","generated/cellestial.xyplots.rst","index.rst","performance.rst","philosophy.rst"],"indexentries":{"bar() (in module cellestial)":[[3,"cellestial.bar",false]],"boxplot() (in module cellestial)":[[4,"cellestial.boxplot",false]],"boxplots() (in module cellestial)":[[5,"cellestial.boxplots",false]],"build_frame() (in module cellestial)":[[6,"cellestial.build_frame",false]],"cluster_outlines() (in module cellestial)":[[7,"cellestial.cluster_outlines",false]],"dimensional() (in module cellestial)":[[8,"cellestial.dimensional",false]],"dimensionals() (in module cellestial)":[[9,"cellestial.dimensionals",false]],"dotplot() (in module cellestial)":[[10,"cellestial.dotplot",false]],"expression() (in module cellestial)":[[11,"cellestial.expression",false]],"expressions() (in module cellestial)":[[12,"cellestial.expressions",false]],"get_mapping() (in module cellestial)":[[13,"cellestial.get_mapping",false]],"heatmap() (in module cellestial)":[[14,"cellestial.heatmap",false]],"pca() (in module cellestial)":[[15,"cellestial.pca",false]],"pcas() (in module cellestial)":[[16,"cellestial.pcas",false]],"plot() (in module cellestial)":[[17,"cellestial.plot",false]],"retrieve() (in module cellestial)":[[18,"cellestial.retrieve",false]],"scatter() (in module cellestial)":[[19,"cellestial.scatter",false]],"show_colors() (in module cellestial)":[[20,"cellestial.show_colors",false]],"slice() (in module cellestial)":[[21,"cellestial.slice",false]],"tsne() (in module cellestial)":[[22,"cellestial.tsne",false]],"tsnes() (in module cellestial)":[[23,"cellestial.tsnes",false]],"umap() (in module cellestial)":[[24,"cellestial.umap",false]],"umaps() (in module cellestial)":[[25,"cellestial.umaps",false]],"violin() (in module cellestial)":[[26,"cellestial.violin",false]],"violins() (in module cellestial)":[[27,"cellestial.violins",false]],"xyplot() (in module cellestial)":[[28,"cellestial.xyplot",false]],"xyplots() (in module cellestial)":[[29,"cellestial.xyplots",false]]},"objects":{"cellestial":[[3,0,1,"","bar"],[4,0,1,"","boxplot"],[5,0,1,"","boxplots"],[6,0,1,"","build_frame"],[7,0,1,"","cluster_outlines"],[8,0,1,"","dimensional"],[9,0,1,"","dimensionals"],[10,0,1,"","dotplot"],[11,0,1,"","expression"],[12,0,1,"","expressions"],[13,0,1,"","get_mapping"],[14,0,1,"","heatmap"],[15,0,1,"","pca"],[16,0,1,"","pcas"],[17,0,1,"","plot"],[18,0,1,"","retrieve"],[19,0,1,"","scatter"],[20,0,1,"","show_colors"],[21,0,1,"","slice"],[22,0,1,"","tsne"],[23,0,1,"","tsnes"],[24,0,1,"","umap"],[25,0,1,"","umaps"],[26,0,1,"","violin"],[27,0,1,"","violins"],[28,0,1,"","xyplot"],[29,0,1,"","xyplots"]]},"objnames":{"0":["py","function","Python function"]},"objtypes":{"0":"py:function"},"terms":{"0x120b72270":[],"0x120ba1f20":[],"0x120d9a270":[],"0x120dc5f20":[],"0x120e2a270":[],"0x120e59f20":[],"0x120f620d0":[],"0x120ffe270":[],"0x12102df20":[],"0x12102e0d0":[],"0x1211acef0":[],"0x121278ef0":[],"0x1213020d0":[],"0x12141e270":[],"0x12143e0d0":[],"0x12144df20":[],"0x121548ef0":[],"0x1215fa270":[],"0x121629f20":[],"0x121684ef0":[],"0x1218aa0d0":[],"0x121af4ef0":[],"0x122a460d0":[],"0x122b62270":[],"0x122b8df20":[],"0x122c8cef0":[],"0x122f46270":[],"0x122f75f20":[],"0x12324a270":[],"0x123279f20":[],"0x1235960d0":3,"0x1237b2270":[],"0x1237e0ef0":3,"0x1237e1f20":[],"0x124a360d0":[],"0x124dc60d0":[],"0x12500cef0":[],"0x1250ca0d0":[],"0x125152270":[],"0x125181f20":[],"0x1251c60d0":[],"0x125310ef0":[],"0x125410ef0":[],"0x1254e2270":[],"0x125511f20":[],"0x12577e270":[],"0x1257a9f20":[],"0x129d3a270":[],"0x129d6df20":[],"0x129e6a270":[],"0x129e95f20":[],"0x129e9e0d0":[],"0x129ec60d0":[],"0x129f4a0d0":[],"0x12a0720d0":[],"0x12a08e0d0":[],"0x12a0e8ef0":[],"0x12a10cef0":[],"0x12a194ef0":[],"0x12a2160d0":[],"0x12a24e270":[],"0x12a279f20":[],"0x12a2860d0":[],"0x12a2bcef0":[],"0x12a2d8ef0":[],"0x12a3ee0d0":[],"0x12a460ef0":[],"0x12a49e0d0":[],"0x12a4ccef0":[],"0x12a56a270":[],"0x12a595f20":[],"0x12a638ef0":[],"0x12a63e270":[],"0x12a64e0d0":[],"0x12a66df20":[],"0x12a6e4ef0":[],"0x12a73e270":[],"0x12a76df20":[],"0x12a7b60d0":[],"0x12a890ef0":[],"0x12a9960d0":[],"0x12a9fcef0":[],"0x12ab2e0d0":[],"0x12ab8e270":[],"0x12abbdf20":[],"0x12abe0ef0":[],"0x12ad78ef0":[],"0x12bd3e270":[],"0x12bd6df20":[],"0x12bd9e0d0":[],"0x12be3e270":[],"0x12be42270":[],"0x12be6df20":[],"0x12bec60d0":[],"0x12bf3e270":[],"0x12bf4a0d0":[],"0x12bf6df20":[],"0x12bfe8ef0":[],"0x12c09e0d0":[],"0x12c10cef0":[],"0x12c194ef0":[],"0x12c1a2270":[],"0x12c1ba270":[],"0x12c1d5f20":[],"0x12c1e5f20":[],"0x12c2e4ef0":[],"0x12c2ee0d0":[],"0x12c33e0d0":[],"0x12c43e270":[],"0x12c46df20":[],"0x12c530ef0":[],"0x12c588ef0":[],"0x12c74e0d0":[],"0x12c79e0d0":[],"0x12c81a270":[],"0x12c845f20":[],"0x12c88e0d0":[],"0x12c8ee270":[],"0x12c91df20":[],"0x12c94e0d0":[],"0x12c998ef0":[],"0x12c9e8ef0":[],"0x12ca42270":[],"0x12ca71f20":[],"0x12caaa0d0":[],"0x12cad4ef0":[],"0x12cb98ef0":[],"0x12cc7e0d0":[],"0x12ccf4ef0":[],"0x12cec8ef0":[],"0x12dd3e270":17,"0x12dd6df20":17,"0x12dee8ef0":[],"0x12df1a270":[],"0x12df45f20":[],"0x12df9e0d0":[],"0x12dff2270":[],"0x12e01df20":[],"0x12e1660d0":[],"0x12e172270":[],"0x12e1a5f20":[],"0x12e1b6270":[],"0x12e1e4ef0":[],"0x12e1e5f20":[],"0x12e1f2270":[],"0x12e21df20":[],"0x12e2ba270":[],"0x12e2e5f20":[],"0x12e3160d0":[],"0x12e32e0d0":[],"0x12e3acef0":[],"0x12e558ef0":[],"0x12e560ef0":[],"0x12e578ef0":[],"0x12e642270":[],"0x12e66df20":[],"0x12e6ee270":[],"0x12e71df20":[],"0x12e73e270":[],"0x12e771f20":[],"0x12e7e20d0":[],"0x12e9f2270":[],"0x12ea1df20":[],"0x12ea28ef0":[],"0x12eb92270":[],"0x12ebbdf20":[],"0x12ec760d0":[],"0x12eebcef0":[],"1f1f1f":[4,5,7,26,27],"2f2f2f":[4,5,26,27],"377eb8":[8,9,11,12,15,16,22,23,24,25],"3f3f3f":[8,9,11,12,15,16,22,23,24,25],"A":[6,7],"For":[3,4,5,7,8,9,11,12,14,15,16,19,22,23,24,25,26,27,28,29,32],"If":[3,5,6,7,8,9,11,12,14,15,16,17,18,19,21,22,23,24,25,27,29,32],"In":32,"It":30,"On":32,"The":[3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,30,31,32],"These":32,"This":32,"While":32,"abc":[],"abov":30,"accept":[4,5,8,9,10,11,12,15,16,22,23,24,25,26,27,28,29,32],"across":[5,9,12,16,23,25,27],"add":[3,5,6,7,8,9,11,12,14,15,16,17,19,22,23,24,25,27,29],"add_key":[4,5,26,27],"addit":[3,4,5,6,7,8,9,10,11,12,14,15,16,17,19,21,22,23,24,25,26,27,28,29,30],"ae":[3,4,5,7,8,9,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"aesthet":[3,4,5,7,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29,32],"algorithm":7,"align":[5,9,12,16,23,25,27,29],"allow":[5,7,9,12,16,23,25,27,29,31,32],"alpha":[4,5,8,9,11,12,15,16,22,23,24,25,26,27],"analysi":32,"angl":[8,9,11,12,15,16,22,23,24,25],"ani":[4,5,10,21,26,27,32],"anndata":[3,4,5,6,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29,31],"api":[3,4,5,7,8,9,11,12,14,15,16,19,21,22,23,24,25,26,27,28,29,30,32],"appear":7,"appli":[8,9,11,12,15,16,22,23,24,25,32],"approach":32,"area":[5,9,12,16,23,25,27,29],"argument":[10,21,32],"arithmet":[8,9,11,12,15,16,22,23,24,25],"around":7,"arrow":[8,9,11,12,15,16,22,23,24,25],"arrow_angl":[8,9,11,12,15,16,22,23,24,25],"arrow_color":[8,9,11,12,15,16,22,23,24,25],"arrow_length":[8,9,11,12,15,16,22,23,24,25],"arrow_s":[8,9,11,12,15,16,22,23,24,25],"ascend":10,"aspect":[5,9,12,16,23,25,27,29],"atlas":31,"auto":[5,9,12,16,23,25,27,29],"avail":32,"avg_exp":10,"avoid":31,"awar":32,"axe":[8,9,11,12,15,16,22,23,24,25],"axi":[3,4,5,6,7,8,9,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"axis_typ":[8,9,11,12,15,16,22,23,24,25],"b":7,"barcod":[3,4,5,6,8,9,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"base":[8,9,11,12,15,16,17,22,23,24,25],"befor":7,"best":30,"bettermock":[],"blank":[],"blaze":31,"bold":[8,9,11,12,15,16,22,23,24,25],"bool":[3,4,5,6,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"border":[4,5,26,27],"borrow":32,"bottom":[5,9,12,16,23,25,27],"bound":[5,7,9,12,16,23,25,27,29],"boundari":7,"box":7,"boxplot":32,"break":[5,9,12,16,23,25,27,29],"breast":31,"bubbl":7,"buffer":7,"build":[3,6,19,31],"built":30,"calcul":7,"call":32,"can":[7,8,9,11,12,15,16,22,23,24,25,32],"cancer":31,"captur":7,"case":32,"categor":[4,5,8,9,11,12,15,16,22,23,24,25,26,27],"cell":[3,4,5,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29,30],"cell_typ":[4,5,7,26,27],"cell_type_lvl1":[3,17],"cellesti":[31,32],"chang":32,"chose":32,"cl":[3,17,32],"class":[4,5,26,27],"cloud":7,"cluster":[7,8,9,12,15,16,22,23,24,25],"cluster_nam":[9,12,16,23,25],"code":[4,5,8,9,11,12,15,16,22,23,24,25,26,27],"col":[5,9,12,16,23,25,27,29],"collect":[5,9,12,16,23,25,27,29],"color":[4,5,7,8,9,10,11,12,15,16,20,22,23,24,25,26,27,29],"color_high":[8,9,10,11,12,15,16,22,23,24,25],"color_low":[8,9,10,11,12,15,16,22,23,24,25],"color_mid":[8,9,11,12,15,16,22,23,24,25],"colorbar":[5,9,12,16,23,25,27,29],"column":[3,4,5,6,7,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29,31],"combin":7,"compar":[5,9,12,16,23,25,27,29],"complex":[4,5,8,9,10,11,12,15,16,22,23,24,25,26,27,28,29,32],"conflict":32,"consid":10,"contain":[5,6,9,12,16,23,25,27,29],"continu":[8,9,11,12,15,16,22,23,24,25],"control":[5,9,12,16,23,25,27,29],"conveni":32,"convent":32,"coordin":7,"core":[3,7,17,31],"creat":7,"curv":7,"curvi":7,"custom":2,"customiz":32,"d2042d":10,"dash":7,"data":[3,4,5,6,7,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29,31,32],"datafram":[3,4,5,6,8,9,11,12,14,15,16,17,18,19,22,23,24,25,26,27,28,29,31],"decid":[8,9,11,12,15,16,22,23,24,25],"default":[3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,22,23,24,25,26,27,28,29],"degre":[8,9,11,12,15,16,22,23,24,25],"densiti":7,"descend":10,"design":30,"desir":[8,9,11,12,15,16,22,23,24,25],"dict":[4,5,13,21,26,27],"differ":32,"dimens":[3,6,8,9,11,12,14,15,16,17,19,22,23,24,25,28,29],"dimension":[11,12,15,16,22,23,24,25],"direct":[3,31],"disabl":[4,5,8,9,10,11,12,15,16,22,23,24,25,26,27,28,29],"display":1,"docstr":1,"domain":[5,9,12,16,23,25,27,29],"dot":7,"dotdash":[],"duplic":[5,9,12,16,23,25,27,29],"e":[4,5,7,8,9,11,12,15,16,22,23,24,25,26,27,29,31,32],"e6e6e6":[8,9,10,11,12,15,16,22,23,24,25],"easier":32,"eda":32,"edg":7,"either":[10,31],"elimin":32,"end":[8,9,11,12,15,16,22,23,24,25],"endfor":[1,2],"endif":1,"enough":32,"ensur":[7,31,32],"etc":[5,9,12,16,23,25,27,29],"exact":32,"exampl":[3,17],"expand":7,"exploratori":32,"express":[7,8,9,10,15,16,22,23,24,25],"extract":7,"f1f1f1":[4,5,8,9,11,12,15,16,22,23,24,25,26,27],"face":[8,9,11,12,15,16,22,23,24,25],"fals":[3,4,5,6,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"famili":[8,9,11,12,15,16,22,23,24,25],"fast":31,"featur":[8,9,15,16,22,23,24,25,30],"featurespec":[3,4,5,7,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"ff00ff":[4,5,26,27],"figur":[18,32],"fill":[3,4,5,10,17,26,27],"fit":[5,9,12,16,23,25,27,29],"float":[4,5,7,8,9,10,11,12,15,16,22,23,24,25,26,27,29],"follow":32,"font":[8,9,11,12,15,16,22,23,24,25],"fontfac":[8,9,11,12,15,16,22,23,24,25],"format":10,"former":32,"fraction":7,"frame":[3,6,19],"fulli":32,"function":[1,8,9,11,12,15,16,21,22,23,24,25,32],"g":[4,5,7,8,9,11,12,15,16,22,23,24,25,26,27,31],"gene":[4,5,8,9,10,11,12,15,16,22,23,24,25,26,27],"geom":[4,5,8,9,10,11,12,15,16,22,23,24,25,26,27,28,29,30,32],"geom_bar":[3,14],"geom_boxplot":[4,5,17],"geom_color":[4,5,26,27],"geom_fil":[4,5,26,27],"geom_jitt":[4,5,26,27],"geom_kwarg":[3,4,5,7,10,14,19,26,27],"geom_path":7,"geom_point":[4,5,8,9,10,11,12,15,16,19,22,23,24,25,26,27,28,29],"geom_violin":[17,26,27],"get":[4,5,26,27],"gggrid":[5,9,12,16,21,23,25,27,29],"ggplot":[17,31,32],"ggplot2":30,"ggrid":21,"ggsize":32,"give":[4,5,8,9,11,12,15,16,22,23,24,25,26,27,28,29],"given":[3,6,7,14,17,19,21,28,29],"gradient":[5,8,9,10,11,12,15,16,22,23,24,25,27,29],"grammar":30,"graphic":30,"grid":[5,7,9,12,16,20,21,23,25,27,29,32],"grid_siz":7,"group":[7,8,9,10,11,12,15,16,22,23,24,25],"group_bi":[7,10],"guarante":32,"guid":[5,9,12,16,23,25,27,29],"h5ad":[3,17],"hand":20,"handl":31,"head":[8,9,11,12,15,16,22,23,24,25],"height":[5,9,12,16,23,25,27,29,32],"hex":[4,5,8,9,11,12,15,16,22,23,24,25,26,27],"high":[8,9,10,11,12,15,16,22,23,24,25],"higher":7,"horizont":[5,9,12,16,23,25,27,29],"hover":[4,5,8,9,10,11,12,15,16,22,23,24,25,26,27,28,29,30],"howev":[5,9,12,16,23,25,27,29,32],"hspace":[5,9,12,16,23,25,27,29],"html":[3,4,5,7,8,9,11,12,14,15,16,19,21,22,23,24,25,26,27,28,29],"https":[3,4,5,7,8,9,11,12,14,15,16,19,21,22,23,24,25,26,27,28,29],"identifi":[5,9,12,16,23,25,27,29],"implement":30,"import":[3,17],"improv":7,"inc_dim":32,"includ":[3,4,5,6,10,14,17,19,26,27,28,29,32],"include_dimens":[3,6,14,17,19,28,29,32],"inclus":7,"increas":7,"index":[3,4,5,6,8,9,11,12,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29],"indic":21,"infer":7,"inform":[3,4,5,7,8,9,11,12,14,15,16,19,22,23,24,25,26,27,28,29],"inner":[5,9,12,16,23,25,27,29],"instanc":32,"instead":[10,32],"int":[3,5,6,7,8,9,11,12,14,15,16,17,18,19,21,22,23,24,25,27,28,29],"integ":[3,6,14,17,19,28,29],"interact":[3,4,5,8,9,10,11,12,14,15,16,19,22,23,24,25,26,27,28,29],"intern":7,"interpol":7,"intuit":32,"item":2,"jag":7,"jitter":[4,5,26,27],"keep":[5,9,12,16,23,25,27,29],"key":[3,4,5,6,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29,32],"keyword":[10,32],"know":32,"kwarg":21,"label":[5,9,12,16,23,25,27,29],"larger":7,"layer":[3,4,5,7,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29,32],"layer_tooltip":[4,5,8,9,10,11,12,15,16,22,23,24,25,26,27,28,29],"layerspec":[5,7,9,12,16,23,25,27,29],"layout":[5,9,12,16,23,25,27,29],"left":[5,9,12,16,23,25,27,29],"legend":[5,8,9,11,12,15,16,22,23,24,25,27,29],"legend_ondata":[8,9,11,12,15,16,22,23,24,25],"leiden":[3,4,5,8,9,15,16,22,23,24,25,26,27],"length":[1,8,9,11,12,15,16,22,23,24,25],"less":32,"let":[3,4,5,7,8,9,11,12,14,15,16,19,21,22,23,24,25,26,27,28,29,31],"lets_plot":[3,4,5,7,8,9,11,12,14,15,16,17,19,21,22,23,24,25,26,27,28,29],"letsplot":[3,17],"level":[5,7,9,12,16,23,25,27,29],"leverag":31,"librari":[30,32],"limit":[3,4,5,6,8,9,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"linetyp":7,"list":[5,7,9,12,16,23,25,27,29],"liter":[3,4,5,6,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"long":10,"longdash":[],"louvain":[8,9,15,16,22,23,24,25],"low":[8,9,10,11,12,15,16,22,23,24,25],"lower":7,"main":32,"make":[3,4,5,8,9,10,11,12,14,15,16,19,22,23,24,25,26,27,28,29],"mani":32,"map":[3,4,5,7,8,9,11,12,13,14,15,16,17,19,22,23,24,25,26,27,28,29],"march":7,"match":[5,9,12,16,23,25,27,29],"max":[8,9,11,12,15,16,22,23,24,25],"may":7,"mean":[8,9,10,11,12,15,16,22,23,24,25],"mean_key":10,"median":[8,9,11,12,15,16,22,23,24,25],"member":1,"memori":31,"merg":32,"method":[8,9,11,12],"mid":[8,9,11,12,15,16,22,23,24,25],"mid_point":[8,9,11,12,15,16,22,23,24,25],"middl":[8,9,11,12,15,16,22,23,24,25],"midpoint":[8,9,11,12,15,16,22,23,24,25],"min":[8,9,11,12,15,16,22,23,24,25],"minim":31,"mostly":31,"multipl":32,"n_gene":17,"name":[1,3,4,5,6,7,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29,32],"namespac":32,"natur":31,"ncol":[5,9,12,16,23,25,27,29],"necessari":31,"need":32,"nest":7,"nice":32,"non":[8,9,11,12,15,16,22,23,24,25],"none":[3,4,5,6,7,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"notebook":32,"number":[3,5,6,7,8,9,11,12,14,15,16,17,19,22,23,24,25,27,28,29],"numer":[4,5,26,27],"obj":1,"object":[3,4,5,6,8,9,10,11,12,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29],"observ":[3,4,5,6,14,17,19,26,27,28,29],"observations_nam":[3,4,5,6,8,9,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"omic":30,"ondata_alpha":[8,9,11,12,15,16,22,23,24,25],"ondata_color":[8,9,11,12,15,16,22,23,24,25],"ondata_famili":[8,9,11,12,15,16,22,23,24,25],"ondata_fontfac":[8,9,11,12,15,16,22,23,24,25],"ondata_s":[8,9,11,12,15,16,22,23,24,25],"ondata_weight":[8,9,11,12,15,16,22,23,24,25],"one":[5,7,9,12,16,23,25,27,29],"onli":[5,9,12,16,23,25,27,32],"option":[10,18,30],"order":10,"org":[3,4,5,7,8,9,11,12,14,15,16,19,21,22,23,24,25,26,27,28,29],"origin":[5,9,12,16,23,25,27,29],"otherwis":[5,8,9,11,12,15,16,22,23,24,25,27,29],"outermost":7,"outlier":7,"outlier_s":17,"outlin":7,"overwrit":[9,12,16,23,25],"p1":[3,17],"p2":[3,17],"pad":7,"page":[3,4,5,7,8,9,11,12,14,15,16,19,21,22,23,24,25,26,27,28,29],"palett":3,"pan":30,"paramet":[3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,32],"part":[8,9,11,12,15,16,22,23,24,25],"particip":[5,9,12,16,23,25,27,29],"particular":32,"pass":31,"path":7,"pbmc3k_pped":[3,17],"pca":[8,9,11,12],"pct_counts_in_top_50_gen":[5,27],"pct_exp":10,"peak":7,"percentag":10,"percentage_key":10,"perform":30,"philosophi":30,"pick":20,"pip":30,"pixel":7,"pl":[6,18],"plot":[3,4,5,7,8,9,10,11,12,13,14,15,16,18,19,21,22,23,24,25,26,27,28,29,31,32],"plotspec":[3,4,7,8,10,11,14,15,17,18,19,21,22,24,26,28,29,32],"plural":32,"point":[4,5,7,8,9,11,12,15,16,22,23,24,25,26,27,32],"point_alpha":[4,5,26,27],"point_color":[4,5,26,27],"point_geom":[4,5,26,27],"point_kwarg":[4,5,8,9,11,12,15,16,22,23,24,25,26,27,28,29],"point_siz":[4,5,26,27],"polar":[6,31],"possibl":32,"power":30,"predicted_doublet":3,"preserv":[5,9,12,16,23,25,27,29],"process":31,"produc":[7,32],"programm":32,"properti":[5,9,12,16,23,25,27,29],"provid":[3,6,7,14,17,19,28,29,32],"px":[5,8,9,11,12,15,16,22,23,24,25,27,29],"py":[4,5,26,27],"python":[3,4,5,7,8,9,11,12,14,15,16,19,21,22,23,24,25,26,27,28,29,30,32],"rais":[18,21],"ratio":[5,9,12,16,23,25,27,29],"read_h5ad":[3,17],"reduct":[8,9,11,12,15,16,22,23,24,25],"refer":30,"regular":[8,9,11,12,15,16,22,23,24,25],"relat":[5,9,12,16,23,25,27,29],"rememb":32,"remov":[5,9,12,16,23,25,27,29],"render":1,"reproduc":32,"requir":32,"resolut":7,"result":[3,4,5,7,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"return":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,32],"rgb":[4,5,8,9,11,12,15,16,22,23,24,25,26,27],"rgba":[4,5,8,9,11,12,15,16,22,23,24,25,26,27],"right":[5,9,12,16,23,25,27,29],"risk":32,"row":[5,9,12,16,23,25,27,29],"rust":32,"s":[4,7,26,29],"sacrific":32,"sampl":7,"san":[8,9,11,12,15,16,22,23,24,25],"sc":[3,17],"scalabl":30,"scale":17,"scale_fill_brew":3,"scale_fill_viridi":17,"scanpi":[3,17],"scatter":[28,29],"see":[3,4,5,7,8,9,11,12,14,15,16,19,21,22,23,24,25,26,27,28,29,30],"sequenc":[3,4,5,6,7,8,9,10,11,12,14,15,16,17,19,21,22,23,24,25,26,27,28,29,32],"set":[4,5,8,9,11,12,15,16,22,23,24,25,26,27],"set2":3,"setup_html":[3,17],"shape":[5,9,12,16,23,25,27,29],"share":[5,9,12,16,23,25,27,29],"share_axi":[5,9,12,16,23,25,27],"share_label":[9,12,16,23,25],"share_tick":[5,27],"sharex":[5,9,12,16,23,25,27,29],"sharey":[5,9,12,16,23,25,27,29],"shorten":32,"show":[4,5,8,9,10,11,12,15,16,20,22,23,24,25,26,27,28,29],"show_point":[4,5,26,27],"show_tooltip":10,"shown":[5,9,12,16,23,25,27],"simpl":32,"simpli":32,"sina":[4,5,26,27],"singl":[3,4,5,7,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29,30,31,32],"size":[4,5,7,8,9,11,12,15,16,22,23,24,25,26,27,29,32],"smooth":7,"smoother":7,"solid":[],"sort":10,"sort_bi":10,"sort_ord":10,"space":[5,9,12,16,23,25,27,29],"spatial":7,"specif":[8,9,11,12,15,16,22,23,24,25],"specifi":[5,9,12,16,23,25,27,29],"speed":7,"split":[2,4,5,26,27],"squar":7,"step":31,"str":[3,4,5,6,7,8,9,10,11,12,14,15,16,17,19,21,22,23,24,25,26,27,28,29,32],"stretch":[5,9,12,16,23,25,27,29],"strict":32,"string":[7,32],"sub":[5,9,12,16,23,25,27,29],"subplot":[5,9,12,16,23,25,27,29],"supplotsspec":[5,9,12,16,18,21,23,25,27,29,32],"sure":32,"tabl":2,"text":[5,8,9,11,12,15,16,22,23,24,25,27],"therefor":32,"threshold":[7,10],"tick":[5,27],"tighter":7,"titl":[5,9,12,16,23,25,27,29],"toolbar":30,"tooltip":[4,5,8,9,10,11,12,15,16,22,23,24,25,26,27,28,29,30],"top":[5,9,12,16,23,25,27,29,30,32],"total":32,"total_count":[4,5,26,27],"transpar":[4,5,8,9,11,12,15,16,22,23,24,25,26,27],"treat":[5,9,12,16,23,25,27,29],"trim":27,"true":[4,5,8,9,10,11,12,15,16,22,23,24,25,26,27,29],"truncat":7,"tsne":[8,9,11,12],"tupl":[5,8,9,11,12,15,16,22,23,24,25,27],"two":32,"twodash":[],"type":[1,4,5,26,27,31,32],"typealiasforwardref":[],"typeerror":[18,21],"umap":[8,9,11,12,32],"umap1":[8,9,11,12,15,16,22,23,24,25],"umap2":[8,9,11,12,15,16,22,23,24,25],"unnecessari":[31,32],"upper":[5,9,12,16,23,25,27,29],"usag":31,"use":[4,5,7,8,9,10,11,12,15,16,18,22,23,24,25,26,27,28,29,30,31,32],"use_key":[8,9,11,12,15,16,22,23,24,25],"user":32,"util":18,"valu":[4,5,7,8,9,10,11,12,15,16,22,23,24,25,26,27,29],"value_column":[4,5,26,27],"value_nam":10,"variabl":[3,4,5,6,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"variable_column":[4,5,26,27],"variable_key":[3,6,8,9,11,12,14,15,16,17,19,22,23,24,25],"variables_nam":[3,4,5,6,10,14,17,19,26,27,28,29],"version":32,"vertic":[5,9,12,16,23,25,27,29],"violin":32,"visual":[5,9,12,16,23,25,27,29,32],"vln":32,"vs":32,"vspace":[5,9,12,16,23,25,27,29],"want":32,"weight":[8,9,11,12,15,16,22,23,24,25],"whether":[3,4,5,6,8,9,10,11,12,14,15,16,17,19,22,23,24,25,26,27,28,29],"width":[5,9,12,16,17,23,25,27,29,32],"will":[3,6,7,8,9,11,12,14,15,16,17,19,22,23,24,25,28,29],"without":17,"word":32,"workflow":32,"wrangl":17,"write":32,"x":[5,7,8,9,11,12,15,16,17,22,23,24,25,27,28,29],"x_pca_2d":[8,9,11,12,15,16,22,23,24,25],"x_umap1":7,"x_umap2":7,"x_umap_2d":[8,9,11,12,15,16,22,23,24,25],"xy":[8,9,11,12,15,16,22,23,24,25],"y":[5,7,8,9,11,12,15,16,17,22,23,24,25,27,28,29],"yet":32,"zen":32,"zoom":30},"titles":["API Reference","","","cellestial.bar","cellestial.boxplot","cellestial.boxplots","cellestial.build_frame","cellestial.cluster_outlines","cellestial.dimensional","cellestial.dimensionals","cellestial.dotplot","cellestial.expression","cellestial.expressions","cellestial.get_mapping","cellestial.heatmap","cellestial.pca","cellestial.pcas","cellestial.plot","cellestial.retrieve","cellestial.scatter","cellestial.show_colors","cellestial.slice","cellestial.tsne","cellestial.tsnes","cellestial.umap","cellestial.umaps","cellestial.violin","cellestial.violins","cellestial.xyplot","cellestial.xyplots","Cellestial","Performance & Scalability","Design Philosophy"],"titleterms":{"100k":31,"About":30,"abstract":32,"api":0,"bar":3,"base":0,"basic":0,"boxplot":[4,5],"build_fram":6,"cell":31,"cellesti":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],"cluster_outlin":7,"common":0,"content":30,"data":0,"design":32,"dimension":[0,8,9],"distribut":0,"dotplot":10,"exampl":[30,31],"explicit":32,"express":[11,12,32],"flexibl":32,"frame":0,"get_map":13,"heatmap":14,"implicit":32,"instal":30,"layer":0,"let":30,"modular":32,"pca":15,"pcas":16,"perform":31,"philosophi":32,"plot":[17,30],"predict":32,"reduct":0,"refer":0,"retriev":18,"scalabl":31,"scatter":19,"show_color":20,"simplic":32,"slice":21,"special":0,"tsne":22,"tsnes":23,"umap":[24,25],"util":0,"violin":[26,27],"xyplot":[28,29]}}) \ No newline at end of file diff --git a/docs/_build/_images/breast_cancer_atlas_umap.png b/docs/_images/breast_cancer_atlas_umap.png similarity index 100% rename from docs/_build/_images/breast_cancer_atlas_umap.png rename to docs/_images/breast_cancer_atlas_umap.png diff --git a/docs/_build/_sources/API.rst.txt b/docs/_sources/API.rst.txt similarity index 100% rename from docs/_build/_sources/API.rst.txt rename to docs/_sources/API.rst.txt diff --git a/docs/_build/_sources/_templates/autoapi/python/module.rst.txt b/docs/_sources/_templates/autoapi/python/module.rst.txt similarity index 100% rename from docs/_build/_sources/_templates/autoapi/python/module.rst.txt rename to docs/_sources/_templates/autoapi/python/module.rst.txt diff --git a/docs/_build/_sources/_templates/autosummary/table.rst.txt b/docs/_sources/_templates/autosummary/table.rst.txt similarity index 100% rename from docs/_build/_sources/_templates/autosummary/table.rst.txt rename to docs/_sources/_templates/autosummary/table.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.bar.rst.txt b/docs/_sources/generated/cellestial.bar.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.bar.rst.txt rename to docs/_sources/generated/cellestial.bar.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.boxplot.rst.txt b/docs/_sources/generated/cellestial.boxplot.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.boxplot.rst.txt rename to docs/_sources/generated/cellestial.boxplot.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.boxplots.rst.txt b/docs/_sources/generated/cellestial.boxplots.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.boxplots.rst.txt rename to docs/_sources/generated/cellestial.boxplots.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.build_frame.rst.txt b/docs/_sources/generated/cellestial.build_frame.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.build_frame.rst.txt rename to docs/_sources/generated/cellestial.build_frame.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.cluster_outlines.rst.txt b/docs/_sources/generated/cellestial.cluster_outlines.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.cluster_outlines.rst.txt rename to docs/_sources/generated/cellestial.cluster_outlines.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.dimensional.rst.txt b/docs/_sources/generated/cellestial.dimensional.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.dimensional.rst.txt rename to docs/_sources/generated/cellestial.dimensional.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.dimensionals.rst.txt b/docs/_sources/generated/cellestial.dimensionals.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.dimensionals.rst.txt rename to docs/_sources/generated/cellestial.dimensionals.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.dotplot.rst.txt b/docs/_sources/generated/cellestial.dotplot.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.dotplot.rst.txt rename to docs/_sources/generated/cellestial.dotplot.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.expression.rst.txt b/docs/_sources/generated/cellestial.expression.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.expression.rst.txt rename to docs/_sources/generated/cellestial.expression.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.expressions.rst.txt b/docs/_sources/generated/cellestial.expressions.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.expressions.rst.txt rename to docs/_sources/generated/cellestial.expressions.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.get_mapping.rst.txt b/docs/_sources/generated/cellestial.get_mapping.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.get_mapping.rst.txt rename to docs/_sources/generated/cellestial.get_mapping.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.heatmap.rst.txt b/docs/_sources/generated/cellestial.heatmap.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.heatmap.rst.txt rename to docs/_sources/generated/cellestial.heatmap.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.pca.rst.txt b/docs/_sources/generated/cellestial.pca.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.pca.rst.txt rename to docs/_sources/generated/cellestial.pca.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.pcas.rst.txt b/docs/_sources/generated/cellestial.pcas.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.pcas.rst.txt rename to docs/_sources/generated/cellestial.pcas.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.plot.rst.txt b/docs/_sources/generated/cellestial.plot.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.plot.rst.txt rename to docs/_sources/generated/cellestial.plot.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.retrieve.rst.txt b/docs/_sources/generated/cellestial.retrieve.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.retrieve.rst.txt rename to docs/_sources/generated/cellestial.retrieve.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.scatter.rst.txt b/docs/_sources/generated/cellestial.scatter.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.scatter.rst.txt rename to docs/_sources/generated/cellestial.scatter.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.show_colors.rst.txt b/docs/_sources/generated/cellestial.show_colors.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.show_colors.rst.txt rename to docs/_sources/generated/cellestial.show_colors.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.slice.rst.txt b/docs/_sources/generated/cellestial.slice.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.slice.rst.txt rename to docs/_sources/generated/cellestial.slice.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.tsne.rst.txt b/docs/_sources/generated/cellestial.tsne.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.tsne.rst.txt rename to docs/_sources/generated/cellestial.tsne.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.tsnes.rst.txt b/docs/_sources/generated/cellestial.tsnes.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.tsnes.rst.txt rename to docs/_sources/generated/cellestial.tsnes.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.umap.rst.txt b/docs/_sources/generated/cellestial.umap.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.umap.rst.txt rename to docs/_sources/generated/cellestial.umap.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.umaps.rst.txt b/docs/_sources/generated/cellestial.umaps.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.umaps.rst.txt rename to docs/_sources/generated/cellestial.umaps.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.violin.rst.txt b/docs/_sources/generated/cellestial.violin.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.violin.rst.txt rename to docs/_sources/generated/cellestial.violin.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.violins.rst.txt b/docs/_sources/generated/cellestial.violins.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.violins.rst.txt rename to docs/_sources/generated/cellestial.violins.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.xyplot.rst.txt b/docs/_sources/generated/cellestial.xyplot.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.xyplot.rst.txt rename to docs/_sources/generated/cellestial.xyplot.rst.txt diff --git a/docs/_build/_sources/generated/cellestial.xyplots.rst.txt b/docs/_sources/generated/cellestial.xyplots.rst.txt similarity index 100% rename from docs/_build/_sources/generated/cellestial.xyplots.rst.txt rename to docs/_sources/generated/cellestial.xyplots.rst.txt diff --git a/docs/_build/_sources/index.rst.txt b/docs/_sources/index.rst.txt similarity index 100% rename from docs/_build/_sources/index.rst.txt rename to docs/_sources/index.rst.txt diff --git a/docs/_build/_sources/performance.rst.txt b/docs/_sources/performance.rst.txt similarity index 100% rename from docs/_build/_sources/performance.rst.txt rename to docs/_sources/performance.rst.txt diff --git a/docs/_build/_sources/philosophy.rst.txt b/docs/_sources/philosophy.rst.txt similarity index 100% rename from docs/_build/_sources/philosophy.rst.txt rename to docs/_sources/philosophy.rst.txt diff --git a/docs/_build/_static/base-stemmer.js b/docs/_static/base-stemmer.js similarity index 100% rename from docs/_build/_static/base-stemmer.js rename to docs/_static/base-stemmer.js diff --git a/docs/_build/_static/basic.css b/docs/_static/basic.css similarity index 100% rename from docs/_build/_static/basic.css rename to docs/_static/basic.css diff --git a/docs/_build/_static/doctools.js b/docs/_static/doctools.js similarity index 100% rename from docs/_build/_static/doctools.js rename to docs/_static/doctools.js diff --git a/docs/_build/_static/documentation_options.js b/docs/_static/documentation_options.js similarity index 100% rename from docs/_build/_static/documentation_options.js rename to docs/_static/documentation_options.js diff --git a/docs/_build/_static/english-stemmer.js b/docs/_static/english-stemmer.js similarity index 100% rename from docs/_build/_static/english-stemmer.js rename to docs/_static/english-stemmer.js diff --git a/docs/_build/_static/file.png b/docs/_static/file.png similarity index 100% rename from docs/_build/_static/file.png rename to docs/_static/file.png diff --git a/docs/_build/_static/jupyter-sphinx.css b/docs/_static/jupyter-sphinx.css similarity index 100% rename from docs/_build/_static/jupyter-sphinx.css rename to docs/_static/jupyter-sphinx.css diff --git a/docs/_build/_static/language_data.js b/docs/_static/language_data.js similarity index 100% rename from docs/_build/_static/language_data.js rename to docs/_static/language_data.js diff --git a/docs/_build/_static/minus.png b/docs/_static/minus.png similarity index 100% rename from docs/_build/_static/minus.png rename to docs/_static/minus.png diff --git a/docs/_build/_static/plus.png b/docs/_static/plus.png similarity index 100% rename from docs/_build/_static/plus.png rename to docs/_static/plus.png diff --git a/docs/_build/_static/pygments.css b/docs/_static/pygments.css similarity index 100% rename from docs/_build/_static/pygments.css rename to docs/_static/pygments.css diff --git a/docs/_build/_static/scripts/bootstrap.js b/docs/_static/scripts/bootstrap.js similarity index 100% rename from docs/_build/_static/scripts/bootstrap.js rename to docs/_static/scripts/bootstrap.js diff --git a/docs/_build/_static/scripts/bootstrap.js.LICENSE.txt b/docs/_static/scripts/bootstrap.js.LICENSE.txt similarity index 100% rename from docs/_build/_static/scripts/bootstrap.js.LICENSE.txt rename to docs/_static/scripts/bootstrap.js.LICENSE.txt diff --git a/docs/_build/_static/scripts/bootstrap.js.map b/docs/_static/scripts/bootstrap.js.map similarity index 100% rename from docs/_build/_static/scripts/bootstrap.js.map rename to docs/_static/scripts/bootstrap.js.map diff --git a/docs/_build/_static/scripts/fontawesome.js b/docs/_static/scripts/fontawesome.js similarity index 100% rename from docs/_build/_static/scripts/fontawesome.js rename to docs/_static/scripts/fontawesome.js diff --git a/docs/_build/_static/scripts/fontawesome.js.LICENSE.txt b/docs/_static/scripts/fontawesome.js.LICENSE.txt similarity index 100% rename from docs/_build/_static/scripts/fontawesome.js.LICENSE.txt rename to docs/_static/scripts/fontawesome.js.LICENSE.txt diff --git a/docs/_build/_static/scripts/fontawesome.js.map b/docs/_static/scripts/fontawesome.js.map similarity index 100% rename from docs/_build/_static/scripts/fontawesome.js.map rename to docs/_static/scripts/fontawesome.js.map diff --git a/docs/_build/_static/scripts/pydata-sphinx-theme.js b/docs/_static/scripts/pydata-sphinx-theme.js similarity index 100% rename from docs/_build/_static/scripts/pydata-sphinx-theme.js rename to docs/_static/scripts/pydata-sphinx-theme.js diff --git a/docs/_build/_static/scripts/pydata-sphinx-theme.js.map b/docs/_static/scripts/pydata-sphinx-theme.js.map similarity index 100% rename from docs/_build/_static/scripts/pydata-sphinx-theme.js.map rename to docs/_static/scripts/pydata-sphinx-theme.js.map diff --git a/docs/_build/_static/searchtools.js b/docs/_static/searchtools.js similarity index 100% rename from docs/_build/_static/searchtools.js rename to docs/_static/searchtools.js diff --git a/docs/_build/_static/sphinx_highlight.js b/docs/_static/sphinx_highlight.js similarity index 100% rename from docs/_build/_static/sphinx_highlight.js rename to docs/_static/sphinx_highlight.js diff --git a/docs/_build/_static/styles/pydata-sphinx-theme.css b/docs/_static/styles/pydata-sphinx-theme.css similarity index 100% rename from docs/_build/_static/styles/pydata-sphinx-theme.css rename to docs/_static/styles/pydata-sphinx-theme.css diff --git a/docs/_build/_static/styles/pydata-sphinx-theme.css.map b/docs/_static/styles/pydata-sphinx-theme.css.map similarity index 100% rename from docs/_build/_static/styles/pydata-sphinx-theme.css.map rename to docs/_static/styles/pydata-sphinx-theme.css.map diff --git a/docs/_build/_static/styles/theme.css b/docs/_static/styles/theme.css similarity index 100% rename from docs/_build/_static/styles/theme.css rename to docs/_static/styles/theme.css diff --git a/docs/_build/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf b/docs/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf similarity index 100% rename from docs/_build/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf rename to docs/_static/vendor/fontawesome/webfonts/fa-brands-400.ttf diff --git a/docs/_build/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2 b/docs/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2 similarity index 100% rename from docs/_build/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2 rename to docs/_static/vendor/fontawesome/webfonts/fa-brands-400.woff2 diff --git a/docs/_build/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf b/docs/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf similarity index 100% rename from docs/_build/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf rename to docs/_static/vendor/fontawesome/webfonts/fa-regular-400.ttf diff --git a/docs/_build/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2 b/docs/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2 similarity index 100% rename from docs/_build/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2 rename to docs/_static/vendor/fontawesome/webfonts/fa-regular-400.woff2 diff --git a/docs/_build/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf b/docs/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf similarity index 100% rename from docs/_build/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf rename to docs/_static/vendor/fontawesome/webfonts/fa-solid-900.ttf diff --git a/docs/_build/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2 b/docs/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2 similarity index 100% rename from docs/_build/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2 rename to docs/_static/vendor/fontawesome/webfonts/fa-solid-900.woff2 diff --git a/docs/_build/_static/webpack-macros.html b/docs/_static/webpack-macros.html similarity index 100% rename from docs/_build/_static/webpack-macros.html rename to docs/_static/webpack-macros.html diff --git a/docs/_build/_templates/autoapi/python/module.html b/docs/_templates/autoapi/python/module.html similarity index 99% rename from docs/_build/_templates/autoapi/python/module.html rename to docs/_templates/autoapi/python/module.html index 99c7932..8f0ea04 100644 --- a/docs/_build/_templates/autoapi/python/module.html +++ b/docs/_templates/autoapi/python/module.html @@ -31,7 +31,7 @@ - + diff --git a/docs/_build/_templates/autosummary/table.html b/docs/_templates/autosummary/table.html similarity index 99% rename from docs/_build/_templates/autosummary/table.html rename to docs/_templates/autosummary/table.html index 2049bb6..c4113f3 100644 --- a/docs/_build/_templates/autosummary/table.html +++ b/docs/_templates/autosummary/table.html @@ -31,7 +31,7 @@ - + diff --git a/docs/_build/generated/cellestial.bar.html b/docs/generated/cellestial.bar.html similarity index 98% rename from docs/_build/generated/cellestial.bar.html rename to docs/generated/cellestial.bar.html index aef5856..f97a275 100644 --- a/docs/_build/generated/cellestial.bar.html +++ b/docs/generated/cellestial.bar.html @@ -31,7 +31,7 @@ - + @@ -424,7 +424,7 @@

cellestial.bar
-
+
-
+
-
+
-
+
-
+
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from lets_plot import *\n", + "LetsPlot.setup_html()\n", + "\n", + "import cellestial as cl\n", + "import scanpy as sc\n", + "\n", + "data = sc.read_h5ad('data/pbmc3k_pped.h5ad')\n", + "\n", + "p1 = (\n", + " cl.bar(data, mapping=aes('leiden', fill='predicted_doublet'))\n", + " + scale_fill_brewer(palette='Set2', direction=-1)\n", + ")\n", + "p1" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "fbe932ed", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-05T10:19:44.278907Z", + "iopub.status.busy": "2026-03-05T10:19:44.278767Z", + "iopub.status.idle": "2026-03-05T10:19:44.578700Z", + "shell.execute_reply": "2026-03-05T10:19:44.578306Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from lets_plot import *\n", + "LetsPlot.setup_html()\n", + "\n", + "import cellestial as cl\n", + "import scanpy as sc\n", + "\n", + "data = sc.read_h5ad('data/pbmc3k_pped.h5ad')\n", + "\n", + "p2 = (\n", + " cl.bar(data, mapping=aes('cell_type_lvl1', fill='leiden'))\n", + " + scale_fill_brewer(palette='Set2')\n", + ")\n", + "p2" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.14.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/docs/jupyter_execute/generated/cellestial.bar.py b/jupyter_execute/generated/cellestial.bar.py similarity index 100% rename from docs/jupyter_execute/generated/cellestial.bar.py rename to jupyter_execute/generated/cellestial.bar.py diff --git a/jupyter_execute/generated/cellestial.plot.ipynb b/jupyter_execute/generated/cellestial.plot.ipynb new file mode 100644 index 0000000..4dad547 --- /dev/null +++ b/jupyter_execute/generated/cellestial.plot.ipynb @@ -0,0 +1,574 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "f729552c", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-05T10:19:45.917850Z", + "iopub.status.busy": "2026-03-05T10:19:45.917602Z", + "iopub.status.idle": "2026-03-05T10:19:47.153791Z", + "shell.execute_reply": "2026-03-05T10:19:47.153433Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from lets_plot import *\n", + "LetsPlot.setup_html()\n", + "\n", + "import cellestial as cl\n", + "import scanpy as sc\n", + "\n", + "data = sc.read_h5ad('data/pbmc3k_pped.h5ad')\n", + "\n", + "p1 = (\n", + " cl.plot(data, aes(x='cell_type_lvl1', y='n_genes'))\n", + ")\n", + "p1 # plot object without layers" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "be37152f", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-05T10:19:47.154934Z", + "iopub.status.busy": "2026-03-05T10:19:47.154791Z", + "iopub.status.idle": "2026-03-05T10:19:47.613438Z", + "shell.execute_reply": "2026-03-05T10:19:47.613109Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from lets_plot import *\n", + "LetsPlot.setup_html()\n", + "\n", + "import cellestial as cl\n", + "import scanpy as sc\n", + "\n", + "data = sc.read_h5ad('data/pbmc3k_pped.h5ad')\n", + "\n", + "p2 = (\n", + " cl.plot(data, aes(x='cell_type_lvl1', y='n_genes'))\n", + " + geom_violin(aes(fill='cell_type_lvl1'), scale='width')\n", + " + geom_boxplot(width=0.2,outlier_size=0)\n", + " + scale_fill_viridis()\n", + ")\n", + "p2" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.14.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/docs/jupyter_execute/generated/cellestial.plot.py b/jupyter_execute/generated/cellestial.plot.py similarity index 100% rename from docs/jupyter_execute/generated/cellestial.plot.py rename to jupyter_execute/generated/cellestial.plot.py diff --git a/docs/API.rst b/sphinx/API.rst similarity index 100% rename from docs/API.rst rename to sphinx/API.rst diff --git a/docs/_build/_static/breast_cancer_atlas_umap.png b/sphinx/_static/breast_cancer_atlas_umap.png similarity index 100% rename from docs/_build/_static/breast_cancer_atlas_umap.png rename to sphinx/_static/breast_cancer_atlas_umap.png diff --git a/docs/_build/_static/custom.css b/sphinx/_static/custom.css similarity index 100% rename from docs/_build/_static/custom.css rename to sphinx/_static/custom.css diff --git a/docs/_build/_static/custom.js b/sphinx/_static/custom.js similarity index 100% rename from docs/_build/_static/custom.js rename to sphinx/_static/custom.js diff --git a/docs/_build/_static/overall.ggtb.html b/sphinx/_static/overall.ggtb.html similarity index 100% rename from docs/_build/_static/overall.ggtb.html rename to sphinx/_static/overall.ggtb.html diff --git a/docs/_build/_static/pypi.svg b/sphinx/_static/pypi.svg similarity index 100% rename from docs/_build/_static/pypi.svg rename to sphinx/_static/pypi.svg diff --git a/docs/_templates/autoapi/python/module.rst b/sphinx/_templates/autoapi/python/module.rst similarity index 100% rename from docs/_templates/autoapi/python/module.rst rename to sphinx/_templates/autoapi/python/module.rst diff --git a/docs/_templates/autosummary/table.rst b/sphinx/_templates/autosummary/table.rst similarity index 100% rename from docs/_templates/autosummary/table.rst rename to sphinx/_templates/autosummary/table.rst diff --git a/docs/conf.py b/sphinx/conf.py similarity index 100% rename from docs/conf.py rename to sphinx/conf.py diff --git a/docs/generated/cellestial.bar.rst b/sphinx/generated/cellestial.bar.rst similarity index 100% rename from docs/generated/cellestial.bar.rst rename to sphinx/generated/cellestial.bar.rst diff --git a/docs/generated/cellestial.boxplot.rst b/sphinx/generated/cellestial.boxplot.rst similarity index 100% rename from docs/generated/cellestial.boxplot.rst rename to sphinx/generated/cellestial.boxplot.rst diff --git a/docs/generated/cellestial.boxplots.rst b/sphinx/generated/cellestial.boxplots.rst similarity index 100% rename from docs/generated/cellestial.boxplots.rst rename to sphinx/generated/cellestial.boxplots.rst diff --git a/docs/generated/cellestial.build_frame.rst b/sphinx/generated/cellestial.build_frame.rst similarity index 100% rename from docs/generated/cellestial.build_frame.rst rename to sphinx/generated/cellestial.build_frame.rst diff --git a/docs/generated/cellestial.cluster_outlines.rst b/sphinx/generated/cellestial.cluster_outlines.rst similarity index 100% rename from docs/generated/cellestial.cluster_outlines.rst rename to sphinx/generated/cellestial.cluster_outlines.rst diff --git a/docs/generated/cellestial.dimensional.rst b/sphinx/generated/cellestial.dimensional.rst similarity index 100% rename from docs/generated/cellestial.dimensional.rst rename to sphinx/generated/cellestial.dimensional.rst diff --git a/docs/generated/cellestial.dimensionals.rst b/sphinx/generated/cellestial.dimensionals.rst similarity index 100% rename from docs/generated/cellestial.dimensionals.rst rename to sphinx/generated/cellestial.dimensionals.rst diff --git a/docs/generated/cellestial.dotplot.rst b/sphinx/generated/cellestial.dotplot.rst similarity index 100% rename from docs/generated/cellestial.dotplot.rst rename to sphinx/generated/cellestial.dotplot.rst diff --git a/docs/generated/cellestial.expression.rst b/sphinx/generated/cellestial.expression.rst similarity index 100% rename from docs/generated/cellestial.expression.rst rename to sphinx/generated/cellestial.expression.rst diff --git a/docs/generated/cellestial.expressions.rst b/sphinx/generated/cellestial.expressions.rst similarity index 100% rename from docs/generated/cellestial.expressions.rst rename to sphinx/generated/cellestial.expressions.rst diff --git a/docs/generated/cellestial.get_mapping.rst b/sphinx/generated/cellestial.get_mapping.rst similarity index 100% rename from docs/generated/cellestial.get_mapping.rst rename to sphinx/generated/cellestial.get_mapping.rst diff --git a/docs/generated/cellestial.heatmap.rst b/sphinx/generated/cellestial.heatmap.rst similarity index 100% rename from docs/generated/cellestial.heatmap.rst rename to sphinx/generated/cellestial.heatmap.rst diff --git a/docs/generated/cellestial.pca.rst b/sphinx/generated/cellestial.pca.rst similarity index 100% rename from docs/generated/cellestial.pca.rst rename to sphinx/generated/cellestial.pca.rst diff --git a/docs/generated/cellestial.pcas.rst b/sphinx/generated/cellestial.pcas.rst similarity index 100% rename from docs/generated/cellestial.pcas.rst rename to sphinx/generated/cellestial.pcas.rst diff --git a/docs/generated/cellestial.plot.rst b/sphinx/generated/cellestial.plot.rst similarity index 100% rename from docs/generated/cellestial.plot.rst rename to sphinx/generated/cellestial.plot.rst diff --git a/docs/generated/cellestial.retrieve.rst b/sphinx/generated/cellestial.retrieve.rst similarity index 100% rename from docs/generated/cellestial.retrieve.rst rename to sphinx/generated/cellestial.retrieve.rst diff --git a/docs/generated/cellestial.scatter.rst b/sphinx/generated/cellestial.scatter.rst similarity index 100% rename from docs/generated/cellestial.scatter.rst rename to sphinx/generated/cellestial.scatter.rst diff --git a/docs/generated/cellestial.show_colors.rst b/sphinx/generated/cellestial.show_colors.rst similarity index 100% rename from docs/generated/cellestial.show_colors.rst rename to sphinx/generated/cellestial.show_colors.rst diff --git a/docs/generated/cellestial.slice.rst b/sphinx/generated/cellestial.slice.rst similarity index 100% rename from docs/generated/cellestial.slice.rst rename to sphinx/generated/cellestial.slice.rst diff --git a/docs/generated/cellestial.tsne.rst b/sphinx/generated/cellestial.tsne.rst similarity index 100% rename from docs/generated/cellestial.tsne.rst rename to sphinx/generated/cellestial.tsne.rst diff --git a/docs/generated/cellestial.tsnes.rst b/sphinx/generated/cellestial.tsnes.rst similarity index 100% rename from docs/generated/cellestial.tsnes.rst rename to sphinx/generated/cellestial.tsnes.rst diff --git a/docs/generated/cellestial.umap.rst b/sphinx/generated/cellestial.umap.rst similarity index 100% rename from docs/generated/cellestial.umap.rst rename to sphinx/generated/cellestial.umap.rst diff --git a/docs/generated/cellestial.umaps.rst b/sphinx/generated/cellestial.umaps.rst similarity index 100% rename from docs/generated/cellestial.umaps.rst rename to sphinx/generated/cellestial.umaps.rst diff --git a/docs/generated/cellestial.violin.rst b/sphinx/generated/cellestial.violin.rst similarity index 100% rename from docs/generated/cellestial.violin.rst rename to sphinx/generated/cellestial.violin.rst diff --git a/docs/generated/cellestial.violins.rst b/sphinx/generated/cellestial.violins.rst similarity index 100% rename from docs/generated/cellestial.violins.rst rename to sphinx/generated/cellestial.violins.rst diff --git a/docs/generated/cellestial.xyplot.rst b/sphinx/generated/cellestial.xyplot.rst similarity index 100% rename from docs/generated/cellestial.xyplot.rst rename to sphinx/generated/cellestial.xyplot.rst diff --git a/docs/generated/cellestial.xyplots.rst b/sphinx/generated/cellestial.xyplots.rst similarity index 100% rename from docs/generated/cellestial.xyplots.rst rename to sphinx/generated/cellestial.xyplots.rst diff --git a/docs/index.rst b/sphinx/index.rst similarity index 100% rename from docs/index.rst rename to sphinx/index.rst diff --git a/docs/jupyter_execute/generated/bar.ipynb b/sphinx/jupyter_execute/generated/bar.ipynb similarity index 100% rename from docs/jupyter_execute/generated/bar.ipynb rename to sphinx/jupyter_execute/generated/bar.ipynb diff --git a/docs/jupyter_execute/generated/bar.py b/sphinx/jupyter_execute/generated/bar.py similarity index 100% rename from docs/jupyter_execute/generated/bar.py rename to sphinx/jupyter_execute/generated/bar.py diff --git a/docs/jupyter_execute/generated/cellestial.bar.ipynb b/sphinx/jupyter_execute/generated/cellestial.bar.ipynb similarity index 100% rename from docs/jupyter_execute/generated/cellestial.bar.ipynb rename to sphinx/jupyter_execute/generated/cellestial.bar.ipynb diff --git a/sphinx/jupyter_execute/generated/cellestial.bar.py b/sphinx/jupyter_execute/generated/cellestial.bar.py new file mode 100644 index 0000000..c6f9a41 --- /dev/null +++ b/sphinx/jupyter_execute/generated/cellestial.bar.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[1]: + + +from lets_plot import * +LetsPlot.setup_html() + +import cellestial as cl +import scanpy as sc + +data = sc.read_h5ad('data/pbmc3k_pped.h5ad') + +p1 = ( + cl.bar(data, mapping=aes('leiden', fill='predicted_doublet')) + + scale_fill_brewer(palette='Set2', direction=-1) +) +p1 + + +# In[2]: + + +from lets_plot import * +LetsPlot.setup_html() + +import cellestial as cl +import scanpy as sc + +data = sc.read_h5ad('data/pbmc3k_pped.h5ad') + +p2 = ( + cl.bar(data, mapping=aes('cell_type_lvl1', fill='leiden')) + + scale_fill_brewer(palette='Set2') +) +p2 + diff --git a/docs/jupyter_execute/generated/cellestial.plot.ipynb b/sphinx/jupyter_execute/generated/cellestial.plot.ipynb similarity index 100% rename from docs/jupyter_execute/generated/cellestial.plot.ipynb rename to sphinx/jupyter_execute/generated/cellestial.plot.ipynb diff --git a/sphinx/jupyter_execute/generated/cellestial.plot.py b/sphinx/jupyter_execute/generated/cellestial.plot.py new file mode 100644 index 0000000..ca0c759 --- /dev/null +++ b/sphinx/jupyter_execute/generated/cellestial.plot.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[1]: + + +from lets_plot import * +LetsPlot.setup_html() + +import cellestial as cl +import scanpy as sc + +data = sc.read_h5ad('data/pbmc3k_pped.h5ad') + +p1 = ( + cl.plot(data, aes(x='cell_type_lvl1', y='n_genes')) +) +p1 # plot object without layers + + +# In[2]: + + +from lets_plot import * +LetsPlot.setup_html() + +import cellestial as cl +import scanpy as sc + +data = sc.read_h5ad('data/pbmc3k_pped.h5ad') + +p2 = ( + cl.plot(data, aes(x='cell_type_lvl1', y='n_genes')) + + geom_violin(aes(fill='cell_type_lvl1'), scale='width') + + geom_boxplot(width=0.2,outlier_size=0) + + scale_fill_viridis() +) +p2 + diff --git a/docs/jupyter_execute/generated/cellestial.single.basic.bar.bar.ipynb b/sphinx/jupyter_execute/generated/cellestial.single.basic.bar.bar.ipynb similarity index 100% rename from docs/jupyter_execute/generated/cellestial.single.basic.bar.bar.ipynb rename to sphinx/jupyter_execute/generated/cellestial.single.basic.bar.bar.ipynb diff --git a/docs/jupyter_execute/generated/cellestial.single.basic.bar.bar.py b/sphinx/jupyter_execute/generated/cellestial.single.basic.bar.bar.py similarity index 100% rename from docs/jupyter_execute/generated/cellestial.single.basic.bar.bar.py rename to sphinx/jupyter_execute/generated/cellestial.single.basic.bar.bar.py diff --git a/docs/jupyter_execute/generated/plot.ipynb b/sphinx/jupyter_execute/generated/plot.ipynb similarity index 100% rename from docs/jupyter_execute/generated/plot.ipynb rename to sphinx/jupyter_execute/generated/plot.ipynb diff --git a/docs/jupyter_execute/generated/plot.py b/sphinx/jupyter_execute/generated/plot.py similarity index 100% rename from docs/jupyter_execute/generated/plot.py rename to sphinx/jupyter_execute/generated/plot.py diff --git a/docs/performance.rst b/sphinx/performance.rst similarity index 100% rename from docs/performance.rst rename to sphinx/performance.rst diff --git a/docs/philosophy.rst b/sphinx/philosophy.rst similarity index 100% rename from docs/philosophy.rst rename to sphinx/philosophy.rst diff --git a/docs/requirements.txt b/sphinx/requirements.txt similarity index 100% rename from docs/requirements.txt rename to sphinx/requirements.txt