Source code for scrnatools.plotting._isoform_qc_plot
"""
Plots qc metrics for kallisto isoform data.
From scrnatools package
Created on Mon Jan 10 15:57:46 2022
@author: joe germino (joe.germino@ucsf.edu)
"""
# external imports
import matplotlib.pyplot as plt
import seaborn as sns
import scanpy as sc
import numpy as np
from anndata import AnnData
from matplotlib.patches import Patch
# scrnatools package imports
from scrnatools._configs import configs
logger = configs.create_logger(__name__.split('_', 1)[1])
# -------------------------------------------------------function----------------------------------------------------- #
[docs]def isoform_qc_plot(
adata: AnnData,
batch_key: str = None,
):
"""Plots qc metrics for kallisto isoform data.
Args:
adata (AnnData): The dataset containing isoform data to plot.
batch_key (str, optional): An obs column identifying batches to plot separately. Defaults to None.
Raises:
ValueError: If the batch key provided is not a column in in 'adata.obs'
"""
if batch_key not in adata.obs.columns:
raise ValueError(f"{batch_key} is not a valid column in 'adata.obs'")
sc.set_figure_params(figsize=(6, 6), dpi=80, dpi_save=300,
facecolor="white", frameon=False)
sns.set_context("notebook")
plt.rcParams["axes.grid"] = False
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22',
'#17becf']
if len(adata.obs[batch_key].unique()) > len(colors):
logger.info(
f"Too many batches in adata.obs.{batch_key}, colors will overlap")
if batch_key is None:
adata.obs["qc_plot_batch"] = "all_cells"
batch_key = "qc_plot_batch"
# Counts per ec plot
fig = plt.figure(figsize=(12, 6))
fig.add_subplot(1, 2, 1)
plt.semilogy(np.sort(adata.var['total_counts'].values)[::-1])
plt.ylabel("total_counts")
plt.xlabel("ec")
# Knee plot (all ec counts per barcode)
fig.add_subplot(1, 2, 2)
legend_elements = []
for i, batch in enumerate(adata.obs[batch_key].unique()):
q = np.sort(
np.array(adata[adata.obs[batch_key] == batch].X.sum(axis=1)).reshape(-1)
)[::-1]
plt.loglog(q, linewidth=1)
plt.ylabel("UMI Counts")
plt.xlabel("Barcodes")
legend_elements.append(Patch(facecolor=colors[i], label=batch))
plt.legend(handles=legend_elements)
plt.show()