"""Object-oriented convenience wrapper around the functional plotting API."""
from __future__ import annotations
from pathlib import Path
from . import composition, embeddings, enrichment, markers, overview, pseudobulk, ridgeline, sankey
from ._config import PlotConfig
from ._style import apply_style
[docs]
class ScPlotter:
"""Stateful convenience wrapper that remembers your config and output directory.
Every method mirrors a function of the same name in the corresponding
``scplotkit`` submodule (:mod:`~scplotkit.embeddings`,
:mod:`~scplotkit.composition`, :mod:`~scplotkit.overview`,
:mod:`~scplotkit.markers`, :mod:`~scplotkit.sankey`) and simply forwards
to it with ``config`` and ``output_dir`` pre-filled. Prefer calling the
module functions directly if you don't need the shared state.
Examples
--------
>>> plotter = ScPlotter(output_dir="figures")
>>> plotter.masked_umap(adata, color_by="cell_type", figure_name="T cells",
... mask_values=["CD4 T", "CD8 T"])
"""
def __init__(self, config: PlotConfig | dict | str | Path | None = None, output_dir: str | Path = "figures"):
self.config = PlotConfig.load(config)
self.output_dir = Path(output_dir)
self.output_dir.mkdir(parents=True, exist_ok=True)
apply_style(self.config)
# -- embeddings ---------------------------------------------------
[docs]
def masked_umap(self, adata, **kwargs):
return embeddings.masked_umap(adata, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def masked_umap_highlight(self, adata, **kwargs):
return embeddings.masked_umap_highlight(adata, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def gene_expression_umap(self, adata, **kwargs):
return embeddings.gene_expression_umap(adata, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def gene_coexpression_umap(self, adata, **kwargs):
return embeddings.gene_coexpression_umap(adata, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def embedding_density(self, adata, **kwargs):
return embeddings.embedding_density(adata, config=self.config, output_dir=self.output_dir, **kwargs)
# -- composition ----------------------------------------------------
[docs]
def stacked_barplots(self, adata, **kwargs):
return composition.stacked_barplots(adata, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def composition_heatmap(self, adata, **kwargs):
return composition.composition_heatmap(adata, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def abundance_bubble_grid(self, adata, **kwargs):
return composition.abundance_bubble_grid(adata, config=self.config, output_dir=self.output_dir, **kwargs)
# -- overview ---------------------------------------------------------
[docs]
def sample_and_cell_counts_barplot(self, adata, **kwargs):
return overview.sample_and_cell_counts_barplot(adata, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def sample_and_cell_counts_barplot_break_axis(self, adata, **kwargs):
return overview.sample_and_cell_counts_barplot_break_axis(
adata, config=self.config, output_dir=self.output_dir, **kwargs
)
[docs]
def cells_per_patient_boxplot(self, adata, **kwargs):
return overview.cells_per_patient_boxplot(adata, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def cell_abundance_barplot(self, adata, **kwargs):
return overview.cell_abundance_barplot(adata, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def compare_cell_abundance_barplot(self, adata1, adata2, **kwargs):
return overview.compare_cell_abundance_barplot(
adata1, adata2, config=self.config, output_dir=self.output_dir, **kwargs
)
[docs]
def compare_cell_abundance_boxplot(self, adata1, adata2, **kwargs):
return overview.compare_cell_abundance_boxplot(
adata1, adata2, config=self.config, output_dir=self.output_dir, **kwargs
)
# -- pseudobulk -------------------------------------------------------
[docs]
def pseudobulk_boxplot(self, adata, **kwargs):
return pseudobulk.pseudobulk_boxplot(adata, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def pseudobulk_multigene_boxplot(self, adata, **kwargs):
return pseudobulk.pseudobulk_multigene_boxplot(adata, config=self.config, output_dir=self.output_dir, **kwargs)
# -- markers ------------------------------------------------------------
[docs]
def rank_genes_matrix_and_dot(self, adata, groupby_column, **kwargs):
return markers.rank_genes_matrix_and_dot(
adata, groupby_column, config=self.config, output_dir=self.output_dir, **kwargs
)
[docs]
def annotation_marker_matrixplot(self, adata, markers_dict, groupby_column, **kwargs):
return markers.annotation_marker_matrixplot(
adata, markers_dict, groupby_column, config=self.config, output_dir=self.output_dir, **kwargs
)
[docs]
def annotation_marker_stacked_violin(self, adata, markers_dict, groupby_column, **kwargs):
return markers.annotation_marker_stacked_violin(
adata, markers_dict, groupby_column, config=self.config, output_dir=self.output_dir, **kwargs
)
# -- ridgeline --------------------------------------------------------
[docs]
def ridgeline_plot(self, adata, **kwargs):
return ridgeline.ridgeline_plot(adata, config=self.config, output_dir=self.output_dir, **kwargs)
# -- enrichment -------------------------------------------------------
[docs]
def ora_dotplot(self, csv_path, **kwargs):
return enrichment.ora_dotplot(csv_path, config=self.config, output_dir=self.output_dir, **kwargs)
# -- sankey ---------------------------------------------------------
[docs]
def sankey_plot(self, adata, levels, **kwargs):
return sankey.sankey_plot(adata, levels, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def sunburst_plot(self, adata, levels, **kwargs):
return sankey.sunburst_plot(adata, levels, config=self.config, output_dir=self.output_dir, **kwargs)
[docs]
def treemap_plot(self, adata, levels, **kwargs):
return sankey.treemap_plot(adata, levels, config=self.config, output_dir=self.output_dir, **kwargs)