Spatial Metabolite Analysis

[2]:
%load_ext autoreload
%autoreload
import scanpy as sc
import spmetatme.plotting as pl
from spmetatme.utils import get_metabolite_adata

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
warnings.filterwarnings("ignore")

c:\Users\suraj\anaconda3\envs\spatialEnv\Lib\site-packages\tqdm\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm

Load Spatial metabolic fluxes

Structure of the loaded AnnData object:

  • ``.X``: Reaction fluxes matrix (rows = spatial spots, columns = reactions)

  • ``.obs``: Metadata for each spot (metabolic domains)

  • ``.var``: Metadata for each reaction (‘rxn_id’, ‘rxn_names’, ‘rxn_full_names’, ‘ex_rxns’, ‘subsystems’)

  • ``.obsm[‘metabolites’]``: The key data! A matrix of net metabolite balance (rows = spots, columns = metabolites)

  • ``.uns``: Unstructured metadata including ‘TME_metabolites’, ‘met_names’, ‘moranI’, ‘neighbors’, ‘spatial’

[3]:
adata = sc.read_h5ad(r"output/metabolic_Breast_cancer_Block_A.h5ad")
adata
[3]:
AnnData object with n_obs × n_vars = 3798 × 6561
    obs: 'domain'
    var: 'rxn_id', 'rxn_names', 'rxn_full_names', 'ex_rxns', 'subsystems'
    uns: 'TME_metabolites', 'met_names', 'moranI', 'neighbors', 'spatial'
    obsm: 'ex_rxns', 'metabolites', 'spatial'
    obsp: 'communication', 'connectivities', 'distances'

From spatial metabolic adata inferred by spMetaTME, get metabolite level adata object

  • n_obs: Number of spatial spots (same as before)

  • n_vars: Number of metabolites

  • ``.X``: net metabolite balance (spots × metabolites)

  • ``.obs``: spot metadata (domain)

  • ``.var``: metabolite information:

    • metabolite_names: Common name (e.g., “glucose”, “L-lactate”)

    • Compartment: Where metabolite is located (code: c, e, m, p)

    • Compartment_name: Full compartment name (e.g., “Cytoplasm”, “Extracellular”)

    • moran_score: Spatial autocorrelation metric (high = spatially clustered, low = randomly distributed)

[4]:
metabolite_adata = get_metabolite_adata(adata)
metabolite_adata
[4]:
AnnData object with n_obs × n_vars = 3798 × 2919
    obs: 'domain'
    var: 'Compartment', 'Compartment_name', 'metabolite_names'
    uns: 'TME_metabolites', 'met_names', 'moranI', 'neighbors', 'spatial'
    obsm: 'ex_rxns', 'metabolites', 'spatial'
    obsp: 'distances', 'connectivities'

Spatial Maps of Metabolites

Parameters:

  • metabolite_names: List of metabolite names in human-readable format

  • metabolites: List of metabolite model IDs (alternative way to specify metabolites)

  • img_key: Which image to use as background (default: “hires” for high-resolution image)

  • size: Size of spots in the plot (adjust for visibility)

  • figsize_per_row: Dimensions of figure per metabolite row

  • file_name (optional): filename to save the plot

[5]:
pl.plot_spatial_metabolites(metabolite_adata, metabolite_names=['glucose','pyruvate','L-lactate'])
_images/Metabolite_analysis_7_0.png

Plot spatial metabolite distribution by metabolite id

[6]:
pl.plot_spatial_metabolites(metabolite_adata, metabolites=['MAM02403c','MAM02403e'])
_images/Metabolite_analysis_9_0.png

Metabolite distribution across compartments and domains

[7]:
pl.metabolite_ridges_plot(metabolite_adata, n_cols=3)
_images/Metabolite_analysis_11_0.png

Identify differentially enriched metabolites

[8]:
df = pl.plot_differential_metabolite_heatmap(metabolite_adata, top_n=5, return_marker_df=True)
df
_images/Metabolite_analysis_13_0.png
[8]:
group names scores logfoldchanges pvals pvals_adj
0 0 ornithine [c] 43.213764 0.265625 0.000000e+00 0.000000e+00
1 0 palmitolate [c] 43.115639 0.349242 0.000000e+00 0.000000e+00
133 0 NADP+ [m] 30.568985 0.787096 3.163521e-205 2.798278e-204
302 0 sphinganine [c] 23.213366 -0.841104 3.337094e-119 1.245649e-118
385 0 tyrosine [e] 20.521523 -1.777718 1.383148e-93 4.103057e-93
... ... ... ... ... ... ...
14445 4 NADP+ [m] -33.108196 -0.761299 2.265194e-240 2.755042e-239
14488 4 palmitate [r] -33.682312 -0.325301 1.049550e-248 1.730868e-247
14591 4 sphinganine [c] -42.286964 1.775674 0.000000e+00 0.000000e+00
14592 4 1-phosphatidyl-1D-myo-inositol-4-phosphate [c] -42.633022 2.909879 0.000000e+00 0.000000e+00
14593 4 cys-gly [e] -42.761959 -1.398427 0.000000e+00 0.000000e+00

115 rows × 6 columns