Spatial Transcriptomics Analysis

Visium HD

[2]:
from stLENS import stLENS
stlens = stLENS()
/home/l202255179/micromamba/envs/test2/lib/python3.10/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 data

[ ]:
!wget https://public.pnucolab.com/spatial-omics-tutorials/visiumhd_sdata_cropped.zarr.tar.gz
!tar xvz -f visiumhd_sdata_cropped.zarr.tar.gz
[3]:
import spatialdata as sd
sdata = sd.read_zarr("visiumhd_sdata_cropped.zarr")
sdata
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/dask/dataframe/__init__.py:31: FutureWarning: The legacy Dask DataFrame implementation is deprecated and will be removed in a future version. Set the configuration option `dataframe.query-planning` to `True` or None to enable the new Dask Dataframe implementation and silence this warning.
  warnings.warn(
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/xarray_schema/__init__.py:1: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
  from pkg_resources import DistributionNotFound, get_distribution
version mismatch: detected: RasterFormatV02, requested: FormatV04
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
version mismatch: detected: RasterFormatV02, requested: FormatV04
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
[3]:
SpatialData object, with associated Zarr store: /bce/groups/pnucolab/analysis/scLENS/visiumhd_sdata_cropped.zarr
├── Images
│     ├── 'Visium_HD_Human_Colon_Cancer_P1_hires_image': DataArray[cyx] (3, 843, 844)
│     └── 'Visium_HD_Human_Colon_Cancer_P1_lowres_image': DataArray[cyx] (3, 84, 84)
├── Shapes
│     ├── 'Visium_HD_Human_Colon_Cancer_P1_square_002um': GeoDataFrame shape: (1849989, 1) (2D shapes)
│     ├── 'Visium_HD_Human_Colon_Cancer_P1_square_008um': GeoDataFrame shape: (116132, 1) (2D shapes)
│     └── 'Visium_HD_Human_Colon_Cancer_P1_square_016um': GeoDataFrame shape: (29232, 1) (2D shapes)
└── Tables
      ├── 'square_002um': AnnData (1849989, 18085)
      ├── 'square_008um': AnnData (116132, 18085)
      └── 'square_016um': AnnData (29232, 18085)
with coordinate systems:
    ▸ 'Visium_HD_Human_Colon_Cancer_P1', with elements:
        Visium_HD_Human_Colon_Cancer_P1_hires_image (Images), Visium_HD_Human_Colon_Cancer_P1_lowres_image (Images), Visium_HD_Human_Colon_Cancer_P1_square_002um (Shapes), Visium_HD_Human_Colon_Cancer_P1_square_008um (Shapes), Visium_HD_Human_Colon_Cancer_P1_square_016um (Shapes)
    ▸ 'Visium_HD_Human_Colon_Cancer_P1_downscaled_hires', with elements:
        Visium_HD_Human_Colon_Cancer_P1_hires_image (Images), Visium_HD_Human_Colon_Cancer_P1_square_002um (Shapes), Visium_HD_Human_Colon_Cancer_P1_square_008um (Shapes), Visium_HD_Human_Colon_Cancer_P1_square_016um (Shapes)
    ▸ 'Visium_HD_Human_Colon_Cancer_P1_downscaled_lowres', with elements:
        Visium_HD_Human_Colon_Cancer_P1_lowres_image (Images), Visium_HD_Human_Colon_Cancer_P1_square_002um (Shapes), Visium_HD_Human_Colon_Cancer_P1_square_008um (Shapes), Visium_HD_Human_Colon_Cancer_P1_square_016um (Shapes)
[4]:
import scanpy as sc
adata = sdata.tables['square_008um']
adata
[4]:
AnnData object with n_obs × n_vars = 116132 × 18085
    obs: 'in_tissue', 'array_row', 'array_col', 'location_id', 'region', 'DeconvolutionClass', 'DeconvolutionLabel1', 'DeconvolutionLabel2'
    var: 'gene_ids', 'feature_types', 'genome'
    uns: 'DeconvolutionLabel1_colors', 'region_colors', 'spatialdata_attrs'
    obsm: 'spatial'
[5]:
sc.pl.spatial(adata, color='DeconvolutionLabel1', spot_size=100)
/tmp/ipykernel_2914654/3159902038.py:1: FutureWarning: Use `squidpy.pl.spatial_scatter` instead.
  sc.pl.spatial(adata, color='DeconvolutionLabel1', spot_size=100)
../_images/tutorials_spatial_transcriptomics_analysis_7_1.png

Quality Control

[6]:
# Data Filtering with Scanpy

adata.layers["counts"] = adata.X.copy()
sc.pp.filter_cells(adata, min_genes=200)
sc.pp.filter_genes(adata, min_cells=15)
adata
[6]:
AnnData object with n_obs × n_vars = 29802 × 14002
    obs: 'in_tissue', 'array_row', 'array_col', 'location_id', 'region', 'DeconvolutionClass', 'DeconvolutionLabel1', 'DeconvolutionLabel2', 'n_genes'
    var: 'gene_ids', 'feature_types', 'genome', 'n_cells'
    uns: 'DeconvolutionLabel1_colors', 'region_colors', 'spatialdata_attrs'
    obsm: 'spatial'
    layers: 'counts'

Normalization & PCA

[7]:
stlens.find_optimal_pc(adata, plot_mp = True, device='gpu')
adata
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
sparsity_th: 0.034593353579203366
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Initial sparse: 0.999, threshold: 0.9
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.046408239752054214, sparsity: 0.999
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.039304468780756, sparsity: 0.998
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.036328356713056564, sparsity: 0.997
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.035046592354774475, sparsity: 0.996
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.033546384423971176, sparsity: 0.995
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.032259270548820496, sparsity: 0.994
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.03210741654038429, sparsity: 0.993
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.031749412417411804, sparsity: 0.992
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.03166336566209793, sparsity: 0.991
Sparsity calculation completed: 0.995
Max interactions exceeded!
lambda_c: 5.696695
Number of signal: 68
../_images/tutorials_spatial_transcriptomics_analysis_11_22.png
  0%|          | 0/20 [00:00<?, ?it/s]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
  5%|▌         | 1/20 [00:15<04:49, 15.26s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 10%|█         | 2/20 [00:30<04:37, 15.44s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 15%|█▌        | 3/20 [00:45<04:19, 15.27s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 20%|██        | 4/20 [01:01<04:08, 15.53s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 25%|██▌       | 5/20 [01:17<03:52, 15.51s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 30%|███       | 6/20 [01:32<03:35, 15.41s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 35%|███▌      | 7/20 [01:47<03:19, 15.35s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 40%|████      | 8/20 [02:02<03:02, 15.24s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 45%|████▌     | 9/20 [02:17<02:46, 15.13s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 50%|█████     | 10/20 [02:32<02:31, 15.11s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 55%|█████▌    | 11/20 [02:47<02:15, 15.10s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 60%|██████    | 12/20 [03:02<02:00, 15.09s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 65%|██████▌   | 13/20 [03:17<01:45, 15.04s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 70%|███████   | 14/20 [03:32<01:29, 14.97s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 75%|███████▌  | 15/20 [03:47<01:14, 14.93s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 80%|████████  | 16/20 [04:02<00:59, 14.98s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 85%|████████▌ | 17/20 [04:17<00:45, 15.03s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 90%|█████████ | 18/20 [04:32<00:30, 15.02s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 95%|█████████▌| 19/20 [04:47<00:15, 15.06s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
100%|██████████| 20/20 [05:02<00:00, 15.14s/it]
number of filtered signals: 26
[7]:
AnnData object with n_obs × n_vars = 29802 × 14002
    obs: 'in_tissue', 'array_row', 'array_col', 'location_id', 'region', 'DeconvolutionClass', 'DeconvolutionLabel1', 'DeconvolutionLabel2', 'n_genes'
    var: 'gene_ids', 'feature_types', 'genome', 'n_cells'
    uns: 'DeconvolutionLabel1_colors', 'region_colors', 'spatialdata_attrs', 'stlens'
    obsm: 'spatial'
    layers: 'counts'
[8]:
n_comps = adata.uns['stlens']['optimal_pc_count']
print("Optimal number of PCs:", n_comps)
Optimal number of PCs: 26
[9]:
# PCA transformation using stLENS’s pca function
# Note that the PCA result is l2 normalized - thus all the downstream analyses should use cosine distance as the metric.
stlens.pca(adata)
adata
[9]:
AnnData object with n_obs × n_vars = 29802 × 14002
    obs: 'in_tissue', 'array_row', 'array_col', 'location_id', 'region', 'DeconvolutionClass', 'DeconvolutionLabel1', 'DeconvolutionLabel2', 'n_genes'
    var: 'gene_ids', 'feature_types', 'genome', 'n_cells'
    uns: 'DeconvolutionLabel1_colors', 'region_colors', 'spatialdata_attrs', 'stlens'
    obsm: 'spatial', 'X_pca_stlens'
    layers: 'counts'
[10]:
adata.obsm['X_pca_stlens']
[10]:
array([[-0.00766407, -0.00677196,  0.01544071, ..., -0.00440689,
        -0.10307089,  0.01268619],
       [-0.00215036, -0.005794  ,  0.01203247, ...,  0.00906448,
        -0.05090332,  0.00488052],
       [ 0.00963686, -0.00426296, -0.00664283, ...,  0.090253  ,
         0.00809249, -0.05909142],
       ...,
       [-0.0100454 ,  0.00954647,  0.00192717, ...,  0.00374383,
        -0.05160753,  0.00448453],
       [-0.0060095 ,  0.019509  ,  0.00448853, ..., -0.04540766,
         0.06335371, -0.09322847],
       [ 0.00534162, -0.00894247,  0.01311174, ...,  0.02205605,
        -0.0471961 , -0.00931266]], shape=(29802, 26))

Plot

[11]:
stlens.plot_robust_score(adata)
../_images/tutorials_spatial_transcriptomics_analysis_16_0.png

Clean Temp Files

[ ]:
#optinal
stlens.clean_tempfiles()

Downstream Analysis

[14]:
# Find clusters using stLENS PCA result
sc.pp.neighbors(adata, use_rep='X_pca_stlens', metric='cosine')
sc.tl.leiden(adata)
/tmp/ipykernel_2914654/3467744858.py:1: FutureWarning: In the future, the default backend for leiden will be igraph instead of leidenalg.

 To achieve the future defaults please pass: flavor="igraph" and n_iterations=2.  directed must also be False to work with igraph's implementation.
  sc.tl.leiden(adata)
[138]:
# Comparing the clustering results with the ground truth
import matplotlib.pyplot as plt

fig, axs = plt.subplots(1,2, figsize=(20, 5))
sc.pl.spatial(adata, color='DeconvolutionLabel1', spot_size=100, ax=axs[0], show=False)
axs[0].set_title("Ground Truth")

sc.pl.spatial(adata, color='leiden', spot_size=100, ax=axs[1], show=False)
axs[1].set_title("stLENS clustering")

plt.tight_layout()
/tmp/ipykernel_2914654/4070911133.py:4: FutureWarning: Use `squidpy.pl.spatial_scatter` instead.
  sc.pl.spatial(adata, color='DeconvolutionLabel1', spot_size=100, ax=axs[0], show=False)
/tmp/ipykernel_2914654/4070911133.py:7: FutureWarning: Use `squidpy.pl.spatial_scatter` instead.
  sc.pl.spatial(adata, color='leiden', spot_size=100, ax=axs[1], show=False)
../_images/tutorials_spatial_transcriptomics_analysis_21_1.png

STOmics

[ ]:
from stLENS import stLENS
stlens = stLENS()

Load data

[139]:
!wget -P ./data/stomics https://ftp.cngb.org/pub/SciRAID/stomics/STDS0000058/stomics/E16.5_E1S3_cell_bin_whole_brain.h5ad
--2025-07-29 18:35:40--  https://ftp.cngb.org/pub/SciRAID/stomics/STDS0000058/stomics/E16.5_E1S3_cell_bin_whole_brain.h5ad
Resolving ftp.cngb.org (ftp.cngb.org)... 101.126.80.204
Connecting to ftp.cngb.org (ftp.cngb.org)|101.126.80.204|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 732847864 (699M) [application/octet-stream]
Saving to: ‘./data/stomics/E16.5_E1S3_cell_bin_whole_brain.h5ad.1’

E16.5_E1S3_cell_bin 100%[===================>] 698.90M  4.81MB/s    in 2m 31s

2025-07-29 18:38:12 (4.62 MB/s) - ‘./data/stomics/E16.5_E1S3_cell_bin_whole_brain.h5ad.1’ saved [732847864/732847864]

[1]:
import scanpy as sc
adata = sc.read_h5ad('./data/stomics/E16.5_E1S3_cell_bin_whole_brain.h5ad')
adata
[1]:
AnnData object with n_obs × n_vars = 65303 × 23368
    obs: 'Slice', 'region', 'sim anno', 'n_genes_by_counts', 'total_counts', 'annotation'
    var: 'Gene', 'n_cells_by_counts', 'mean_counts', 'log1p_mean_counts', 'total_counts', 'log1p_total_counts'
    uns: 'sim anno_colors'
    obsm: 'spatial'
    layers: 'counts'

Quality Control

[3]:
# Data Filtering with Scanpy

adata.X = adata.layers["counts"].copy()
sc.pp.filter_cells(adata, min_genes=200)
sc.pp.filter_genes(adata, min_cells=15)
adata
[3]:
AnnData object with n_obs × n_vars = 65303 × 19182
    obs: 'Slice', 'region', 'sim anno', 'n_genes_by_counts', 'total_counts', 'annotation', 'n_genes'
    var: 'Gene', 'n_cells_by_counts', 'mean_counts', 'log1p_mean_counts', 'total_counts', 'log1p_total_counts', 'n_cells'
    uns: 'sim anno_colors'
    obsm: 'spatial'
    layers: 'counts'

Normalization & PCA

[4]:
stlens.find_optimal_pc(adata, plot_mp = True, device='gpu')
adata
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
sparsity_th: 0.03007698664917274
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Initial sparse: 0.999, threshold: 0.9
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.033152446150779724, sparsity: 0.999
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.030330311506986618, sparsity: 0.998
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.02929278276860714, sparsity: 0.997
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.02806856483221054, sparsity: 0.996
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.027880672365427017, sparsity: 0.995
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.027227669954299927, sparsity: 0.994
/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
Min(corr): 0.026560813188552856, sparsity: 0.993
Sparsity calculation completed: 0.997
Max interactions exceeded!
lambda_c: 7.377504879789683
Number of signal: 195
../_images/tutorials_spatial_transcriptomics_analysis_30_18.png
  0%|          | 0/20 [00:00<?, ?it/s]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
  5%|▌         | 1/20 [00:38<12:15, 38.68s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 10%|█         | 2/20 [01:16<11:32, 38.46s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 15%|█▌        | 3/20 [01:55<10:50, 38.26s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 20%|██        | 4/20 [02:33<10:15, 38.46s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 25%|██▌       | 5/20 [03:12<09:38, 38.56s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 30%|███       | 6/20 [03:50<08:59, 38.51s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 35%|███▌      | 7/20 [04:29<08:21, 38.54s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 40%|████      | 8/20 [05:07<07:39, 38.30s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 45%|████▌     | 9/20 [05:45<07:00, 38.22s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 50%|█████     | 10/20 [06:23<06:21, 38.19s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 55%|█████▌    | 11/20 [07:01<05:42, 38.06s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 60%|██████    | 12/20 [07:39<05:04, 38.10s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 65%|██████▌   | 13/20 [08:18<04:28, 38.29s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 70%|███████   | 14/20 [08:56<03:49, 38.27s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 75%|███████▌  | 15/20 [09:34<03:11, 38.20s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 80%|████████  | 16/20 [10:12<02:32, 38.14s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 85%|████████▌ | 17/20 [10:50<01:54, 38.12s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 90%|█████████ | 18/20 [11:28<01:16, 38.12s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
 95%|█████████▌| 19/20 [12:06<00:38, 38.05s/it]/home/l202255179/micromamba/envs/test2/lib/python3.10/site-packages/zarr/creation.py:614: UserWarning: ignoring keyword argument 'read_only'
  compressor, fill_value = _kwargs_compat(compressor, fill_value, kwargs)
100%|██████████| 20/20 [12:44<00:00, 38.22s/it]
number of filtered signals: 37
[4]:
AnnData object with n_obs × n_vars = 65303 × 19182
    obs: 'Slice', 'region', 'sim anno', 'n_genes_by_counts', 'total_counts', 'annotation', 'n_genes'
    var: 'Gene', 'n_cells_by_counts', 'mean_counts', 'log1p_mean_counts', 'total_counts', 'log1p_total_counts', 'n_cells'
    uns: 'sim anno_colors', 'stlens'
    obsm: 'spatial'
    layers: 'counts'
[5]:
# PCA transformation using stLENS’s pca function
# Note that the PCA result is l2 normalized - thus all the downstream analyses should use cosine distance as the metric.
stlens.pca(adata)
adata
[5]:
AnnData object with n_obs × n_vars = 65303 × 19182
    obs: 'Slice', 'region', 'sim anno', 'n_genes_by_counts', 'total_counts', 'annotation', 'n_genes'
    var: 'Gene', 'n_cells_by_counts', 'mean_counts', 'log1p_mean_counts', 'total_counts', 'log1p_total_counts', 'n_cells'
    uns: 'sim anno_colors', 'stlens'
    obsm: 'spatial', 'X_pca_stlens'
    layers: 'counts'

Plot

[6]:
stlens.plot_robust_score(adata)
../_images/tutorials_spatial_transcriptomics_analysis_33_0.png

Clean Temp Files

[ ]:
#optinal
stlens.clean_tempfiles()

Downstream Analysis

[7]:
# Find clusters using stLENS PCA result
sc.pp.neighbors(adata, use_rep='X_pca_stlens', metric='cosine')
sc.tl.leiden(adata)
/tmp/ipykernel_2918715/664060405.py:3: FutureWarning: In the future, the default backend for leiden will be igraph instead of leidenalg.

 To achieve the future defaults please pass: flavor="igraph" and n_iterations=2.  directed must also be False to work with igraph's implementation.
  sc.tl.leiden(adata)
[10]:
# Comparing the clustering results with the ground truth
import matplotlib.pyplot as plt

fig, axs = plt.subplots(1,2, figsize=(25, 5))
sc.pl.spatial(adata, color='annotation', spot_size=100, ax=axs[0], show=False)
axs[0].set_title("Ground Truth")

sc.pl.spatial(adata, color='leiden', spot_size=100, ax=axs[1], show=False)
axs[1].set_title("stLENS clustering")

plt.tight_layout()
/tmp/ipykernel_2918715/1186066510.py:5: FutureWarning: Use `squidpy.pl.spatial_scatter` instead.
  sc.pl.spatial(adata, color='annotation', spot_size=100, ax=axs[0], show=False)
/tmp/ipykernel_2918715/1186066510.py:8: FutureWarning: Use `squidpy.pl.spatial_scatter` instead.
  sc.pl.spatial(adata, color='leiden', spot_size=100, ax=axs[1], show=False)
../_images/tutorials_spatial_transcriptomics_analysis_38_1.png