Source code for campa.pl._object_features

from copy import copy, deepcopy

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt


[docs]def plot_object_stats(adata, group_key, features=None, clusters=None, figsize_mult=(2, 2), **kwargs): """ Barplot of object statistics. Parameters ---------- adata Adata containing object statistics in ``adata.obsm['object_stats_agg']``. E.g. result of :meth:`FeatureExtractor.get_object_stats`. group_key Categorical value in ``adata.obs`` to group by. features List of features to display. Must be columns of ``adata.obsm['object_stats_agg']``. If None, all features are displayed. clusters List of clusters to display. Must be columns of ``adata.obsm['object_stats_agg']``. If None, all clusters are displayed. kwargs Keyword arguments passed to :meth:`sns.boxplot`. """ agg_stats = deepcopy(adata.obsm["object_stats_agg"]) if not isinstance(agg_stats.columns, pd.MultiIndex): # restore multiindex for easier access agg_stats.columns = pd.MultiIndex.from_tuples([tuple(i.split("|")) for i in agg_stats.columns]) if features is None: features = agg_stats.columns.levels[0] if clusters is None: clusters = agg_stats.columns.levels[1] fig, axes = plt.subplots( len(clusters), len(features), figsize=(len(features) * figsize_mult[0], len(clusters) * figsize_mult[1]), sharex=True, squeeze=False, ) for i, row in enumerate(axes): for j, ax in enumerate(row): cluster = clusters[i] feature = features[j] df = copy(agg_stats[feature]) df[group_key] = adata.obs[group_key] sns.boxplot(data=df, y=cluster, x=group_key, ax=ax, **kwargs) ax.set_title(feature) plt.tight_layout()