├── .gitignore ├── LICENSE ├── README.md ├── SpaceFlow ├── SpaceFlow.py ├── __init__.py └── util.py ├── images ├── annotation.png ├── domain_segmentation.png └── pSM.png ├── pyproject.toml ├── requirements.txt ├── setup.cfg ├── test.py └── tutorials └── seqfish_mouse_embryogenesis.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | test/ 3 | .idea 4 | __pycache__/ 5 | *.py[cod] 6 | *$py.class 7 | 8 | # C extensions 9 | *.so 10 | 11 | # Distribution / packaging 12 | .Python 13 | build/ 14 | develop-eggs/ 15 | dist/ 16 | downloads/ 17 | eggs/ 18 | .eggs/ 19 | lib/ 20 | lib64/ 21 | parts/ 22 | sdist/ 23 | var/ 24 | wheels/ 25 | pip-wheel-metadata/ 26 | share/python-wheels/ 27 | *.egg-info/ 28 | .installed.cfg 29 | *.egg 30 | MANIFEST 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .nox/ 46 | .coverage 47 | .coverage.* 48 | .cache 49 | nosetests.xml 50 | coverage.xml 51 | *.cover 52 | *.py,cover 53 | .hypothesis/ 54 | .pytest_cache/ 55 | 56 | # Translations 57 | *.mo 58 | *.pot 59 | 60 | # Django stuff: 61 | *.log 62 | local_settings.py 63 | db.sqlite3 64 | db.sqlite3-journal 65 | 66 | # Flask stuff: 67 | instance/ 68 | .webassets-cache 69 | 70 | # Scrapy stuff: 71 | .scrapy 72 | 73 | # Sphinx documentation 74 | docs/_build/ 75 | 76 | # PyBuilder 77 | target/ 78 | 79 | # Jupyter Notebook 80 | .ipynb_checkpoints 81 | 82 | # IPython 83 | profile_default/ 84 | ipython_config.py 85 | 86 | # pyenv 87 | .python-version 88 | 89 | # pipenv 90 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 91 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 92 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 93 | # install all needed dependencies. 94 | #Pipfile.lock 95 | 96 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 97 | __pypackages__/ 98 | 99 | # Celery stuff 100 | celerybeat-schedule 101 | celerybeat.pid 102 | 103 | # SageMath parsed files 104 | *.sage.py 105 | 106 | # Environments 107 | .env 108 | .venv 109 | env/ 110 | venv/ 111 | ENV/ 112 | env.bak/ 113 | venv.bak/ 114 | 115 | # Spyder project settings 116 | .spyderproject 117 | .spyproject 118 | 119 | # Rope project settings 120 | .ropeproject 121 | 122 | # mkdocs documentation 123 | /site 124 | 125 | # mypy 126 | .mypy_cache/ 127 | .dmypy.json 128 | dmypy.json 129 | 130 | # Pyre type checker 131 | .pyre/ 132 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Honglei 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![DOI](https://zenodo.org/badge/476440894.svg)](https://zenodo.org/badge/latestdoi/476440894) 2 | 3 | # SpaceFlow: Identifying Multicellular Spatiotemporal Organization of Cells using Spatial Transcriptome Data 4 | 5 | SpaceFlow is Python package for identifying spatiotemporal patterns and spatial domains from Spatial Transcriptomic (ST) Data. Based on deep graph network, SpaceFlow provides the following functions: 6 | 1. Encodes the ST data into **low-dimensional embeddings** that reflecting both expression similarity and the spatial proximity of cells in ST data. 7 | 2. Incorporates **spatiotemporal** relationships of cells or spots in ST data through a **pseudo-Spatiotemporal Map (pSM)** derived from the embeddings. 8 | 3. Identifies **spatial domains** with spatially-coherent expression patterns. 9 | 10 | Check out [our paper (Ren et al., Nature Communications, 2022)](https://www.nature.com/articles/s41467-022-31739-w) for the detailed methods and applications. 11 | 12 | SpaceFlow was developed in `Python 3.7` with `Pytorch 1.9.0`. Specific package versions are available in `requirements.txt`. The marker gene identification analysis is performed using `Scanpy 1.8.1` package. The cell-cell communication inference is performed through `CellChat v1.1.3` in a `R v4.1.2` environment. 13 | 14 | ## Installation 15 | 16 | ### 1. Prepare environment 17 | To install SpaceFlow, we recommend using the [Anaconda Python Distribution](https://anaconda.org/) and creating an isolated environment, so that the SpaceFlow and dependencies don't conflict or interfere with other packages or applications. To create the environment, run the following script in command line: 18 | 19 | ```bash 20 | conda create -n spaceflow_env python=3.7 21 | ``` 22 | 23 | After create the environment, you can activate the `spaceflow_env` environment by: 24 | ```bash 25 | conda activate spaceflow_env 26 | ``` 27 | 28 | ### 2. Install `Pytorch` 29 | Please install `Pytorch` that match your machine and environment first by following the instructions on : 30 | [https://pytorch.org/get-started/locally/](https://pytorch.org/get-started/locally/) 31 | 32 | Note that if you want to install `Pytorch` on a `GPU` machine, you need to install **CUDA** first, see guide here for installing **CUDA** [https://developer.nvidia.com/cuda-downloads](https://developer.nvidia.com/cuda-downloads). 33 | 34 | ### 3. Install SpaceFlow 35 | After successfully installed `Pytorch` with the version that `>=1.9.0`, install the SpaceFlow package using `pip` by: 36 | ```bash 37 | pip install SpaceFlow 38 | ``` 39 | 40 | If the installation is still not successful, try to install the required packages in `requirements.txt` by: 41 | 42 | ```bash 43 | pip install -r requirements.txt 44 | ``` 45 | 46 | ## Usage 47 | 48 | ### Quick Start by Example ([Jupyter Notebook](tutorials/seqfish_mouse_embryogenesis.ipynb)) 49 | 50 | We will use the mouse organogenesis ST data from [(Lohoff, T. et al. 2022)](https://doi.org/10.1038/s41587-021-01006-2) generated by [seqFISH](https://spatial.caltech.edu/seqfish/) to demonstrate the usage of SpaceFlow. 51 | 52 | The data is available in [squidpy](https://squidpy.readthedocs.io/en/stable/) package, so we first import the `squidpy` package and load the data. If `squidpy` is not installed. Please run `pip install squidpy` to install. 53 | 54 | #### 1. Import SpaceFlow and squidpy package 55 | 56 | ```python 57 | import squidpy as sq 58 | import scanpy as sc 59 | from SpaceFlow import SpaceFlow 60 | ``` 61 | 62 | #### 2. Load the ST data from squidpy package 63 | ```python 64 | adata = sq.datasets.seqfish() 65 | sc.pp.filter_genes(adata, min_cells=3) 66 | ``` 67 | 68 | #### 3. Create SpaceFlow Object 69 | We can create a SpaceFlow object through either `anndata.AnnData` object or the count matrix as input: 70 | 71 | To construct SpaceFlow object by inputting an `anndata.AnnData` object: 72 | ```python 73 | sf = SpaceFlow.SpaceFlow(adata=adata) 74 | ``` 75 | Parameters: 76 | - `adata`: the count matrix of gene expression, 2D numpy array of size (# of cells, # of genes), type `anndata.AnnData`, see `https://anndata.readthedocs.io/en/latest/` for more info about`anndata`. 77 | 78 | To SpaceFlow object by raw count matrix: 79 | ```python 80 | sf = SpaceFlow.SpaceFlow(count_matrix=adata.X, spatial_locs=adata.obsm['spatial'], sample_names=adata.obs_names, gene_names=adata.var_names) 81 | ``` 82 | Parameters: 83 | - `count_matrix`: the count matrix of gene expression, 2D numpy array of size (# of cells, # of genes), type `numpy.ndarray`, optional 84 | - `spatial_locs`: spatial locations of cells (or spots) match to rows of the count matrix, 1D numpy array of size (n_locations,), type `numpy.ndarray`, optional 85 | - `sample_names`: list of sample names in 1D numpy str array of size (n_cells,), optional 86 | - `gene_names`: list of gene names in 1D numpy str array of size (n_genes,), optional 87 | 88 | 89 | #### 4. Preprocessing the ST Data 90 | Next, we preprocess the ST data by run: 91 | 92 | ```python 93 | sf.preprocessing_data(n_top_genes=3000) 94 | ``` 95 | Parameters: 96 | - `n_top_genes`: the number of the top highly variable genes. 97 | 98 | The preprocessing includes the normalization and log-transformation of the expression count matrix, the selection of highly variable genes, and the construction of spatial proximity graph using spatial coordinates. (Details see the `preprocessing_data` function in `SpaceFlow/SpaceFlow.py`) 99 | 100 | #### 5. Train the deep graph network model 101 | 102 | We then train a spatially regularized deep graph network model to learn a low-dimensional embedding that reflecting both expression similarity and the spatial proximity of cells in ST data. 103 | 104 | ```python 105 | sf.train(spatial_regularization_strength=0.1, z_dim=50, lr=1e-3, epochs=1000, max_patience=50, min_stop=100, random_seed=42, gpu=0, regularization_acceleration=True, edge_subset_sz=1000000) 106 | ``` 107 | 108 | Parameters: 109 | - `spatial_regularization_strength`: the strength of spatial regularization, the larger the more of the spatial coherence in the identified spatial domains and spatiotemporal patterns. (default: 0.1) 110 | - `z_dim`: the target size of the learned embedding. (default: 50) 111 | - `lr`: learning rate for optimizing the model. (default: 1e-3) 112 | - `epochs`: the max number of the epochs for model training. (default: 1000) 113 | - `max_patience`: the max number of the epoch for waiting the loss decreasing. If loss does not decrease for epochs larger than this threshold, the learning will stop, and the model with the parameters that shows the minimal loss are kept as the best model. (default: 50) 114 | - `min_stop`: the earliest epoch the learning can stop if no decrease in loss for epochs larger than the `max_patience`. (default: 100) 115 | - `random_seed`: the random seed set to the random generators of the `random`, `numpy`, `torch` packages. (default: 42) 116 | - `gpu`: the index of the Nvidia GPU, if no GPU, the model will be trained via CPU, which is slower than the GPU training time. (default: 0) 117 | - `regularization_acceleration`: whether or not accelerate the calculation of regularization loss using edge subsetting strategy (default: True) 118 | - `edge_subset_sz`: the edge subset size for regularization acceleration (default: 1000000) 119 | 120 | #### 6. Domain segmentation of the ST data 121 | 122 | After the model training, the learned low-dimensional embedding can be accessed through `sf.embedding`. 123 | 124 | SpaceFlow will use this learned embedding to identify the spatial domains based on [Leiden](https://www.nature.com/articles/s41598-019-41695-z) algorithm. 125 | 126 | ```python 127 | sf.segmentation(domain_label_save_filepath="./domains.tsv", n_neighbors=50, resolution=1.0) 128 | ``` 129 | Parameters: 130 | 131 | - `domain_label_save_filepath`: the file path for saving the identified domain labels. (default: "./domains.tsv") 132 | - `n_neighbors`: the number of the nearest neighbors for each cell for constructing the graph for Leiden using the embedding as input. (default: 50) 133 | - `resolution`: the resolution of the Leiden clustering, the larger the coarser of the domains. (default: 1.0) 134 | 135 | #### 7. Visualization of the annotation and the identified spatial domains 136 | 137 | We next plot the spatial domains using the identified domain labels and spatial coordinates of cells. 138 | 139 | ```python 140 | sf.plot_segmentation(segmentation_figure_save_filepath="./domain_segmentation.pdf", colormap="tab20", scatter_sz=1., rsz=4., csz=4., wspace=.4, hspace=.5, left=0.125, right=0.9, bottom=0.1, top=0.9) 141 | ``` 142 | 143 | The expected output is: 144 | 145 | ![Domain Segmentation](images/domain_segmentation.png) 146 | 147 | Parameters: 148 | - `segmentation_figure_save_filepath`: optional, type: str, the file path for saving the figure of the spatial domain visualization. (default: "./domain_segmentation.pdf") 149 | - `colormap`: optional, type: str, the colormap of the different domains, full colormap options see [matplotlib](https://matplotlib.org/3.5.1/tutorials/colors/colormaps.html) 150 | - `scatter_sz`: optional, type: float, the marker size in points. (default: 1.0) 151 | - `rsz`: optional, type: float, row size of the figure in inches, (default: 4.0) 152 | - `csz`: optional, type: float, column size of the figure in inches, (default: 4.0) 153 | - `wspace`: optional, type: float, the amount of width reserved for space between subplots, expressed as a fraction of the average axis width (default: 0.4) 154 | - `hspace`: optional, type: float,the amount of height reserved for space between subplots, expressed as a fraction of the average axis height (default: 0.4) 155 | - `left`: optional, type: float, the leftmost position of the subplots of the figure in fraction (default: 0.125) 156 | - `right`: optional, type: float, the rightmost position of the subplots of the figure in fraction (default: 0.9) 157 | - `bottom`: optional, type: float, the bottom position of the subplots of the figure in fraction (default: 0.1) 158 | - `top`: optional, type: float, the top position of the subplots of the figure in fraction (default: 0.9) 159 | 160 | We can also visualize the expert annotation for comparison by: 161 | 162 | ```python 163 | import scanpy as sc 164 | sc.pl.spatial(adata, color="celltype_mapped_refined", spot_size=0.03) 165 | ``` 166 | 167 | The expected output is: 168 | 169 | ![Expert Annotation](images/annotation.png) 170 | 171 | #### 8. Idenfify the spatiotemporal patterns of the ST data through pseudo-Spatiotemporal Map (pSM) 172 | 173 | Next, we apply the diffusion pseudotime (dpt) algorithm to the learned spatially-consistent embedding to generate a pseudo-Spatiotemporal Map (pSM). This pSM represents a spatially-coherent pseudotime ordering of cells that encodes biological relationships between cells, such as developmental trajectories and cancer progression 174 | 175 | ```python 176 | sf.pseudo_Spatiotemporal_Map(pSM_values_save_filepath="./pSM_values.tsv", n_neighbors=20, resolution=1.0) 177 | ``` 178 | Parameters: 179 | - `pSM_values_save_filepath` : the file path for saving the inferred pSM values. 180 | - `n_neighbors`: the number of the nearest neighbors for each cell for constructing the graph for Leiden using the embedding as input. (default: 20) 181 | - `resolution`: the resolution of the Leiden clustering, the larger the coarser of the domains. (default: 1.0) 182 | 183 | #### 9. Visualization of the identified pseudo-Spatiotemporal Map (pSM) 184 | 185 | We next visualize the identified pseudo-Spatiotemporal Map (pSM). 186 | 187 | ```python 188 | sf.plot_pSM(pSM_figure_save_filepath="./pseudo-Spatiotemporal-Map.pdf", colormap="roma", scatter_sz=1., rsz=4., csz=4., wspace=.4, hspace=.5, left=0.125, right=0.9, bottom=0.1, top=0.9) 189 | ``` 190 | 191 | The expected output is: 192 | 193 | ![pSM](images/pSM.png) 194 | 195 | Parameters: 196 | - `pSM_figure_save_filepath`: optional, type: str, the file path for saving the figure of the pSM visualization. (default: "./pseudo-Spatiotemporal-Map.pdf") 197 | - `colormap`: optional, type: str, the colormap of the pSM (default: 'roma'), full colormap options see [Scientific Colormaps](https://www.fabiocrameri.ch/colourmaps-userguide/) 198 | - `scatter_sz`:optional, type: float, the marker size in points. (default: 1.0) 199 | - `rsz`: optional, type: float, row size of the figure in inches, (default: 4.0) 200 | - `csz`: optional, type: float, column size of the figure in inches, (default: 4.0) 201 | - `wspace`: optional, type: float, the amount of width reserved for space between subplots, expressed as a fraction of the average axis width (default: 0.4) 202 | - `hspace`: optional, type: float,the amount of height reserved for space between subplots, expressed as a fraction of the average axis height (default: 0.4) 203 | - `left`: optional, type: float, the leftmost position of the subplots of the figure in fraction (default: 0.125) 204 | - `right`: optional, type: float, the rightmost position of the subplots of the figure in fraction (default: 0.9) 205 | - `bottom`: optional, type: float, the bottom position of the subplots of the figure in fraction (default: 0.1) 206 | - `top`: optional, type: float, the top position of the subplots of the figure in fraction (default: 0.9) 207 | 208 | ## Please cite 209 | 210 | Ren, Honglei, et al. "Identifying multicellular spatiotemporal organization of cells with SpaceFlow." Nature Communications 13.1 (2022): 1-14. https://www.nature.com/articles/s41467-022-31739-w 211 | 212 | ## Contact 213 | If you have any questions or found any issues, please contact: [hongleir@uci.edu](mailto:hongleir@uci.edu). 214 | -------------------------------------------------------------------------------- /SpaceFlow/SpaceFlow.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import math 3 | import os 4 | import torch 5 | import random 6 | import gudhi 7 | import anndata 8 | import cmcrameri 9 | import numpy as np 10 | import scanpy as sc 11 | import networkx as nx 12 | import torch.nn as nn 13 | import matplotlib.pyplot as plt 14 | from scipy.spatial import distance_matrix 15 | from torch_geometric.nn import GCNConv, DeepGraphInfomax 16 | from sklearn.neighbors import kneighbors_graph 17 | from SpaceFlow.util import sparse_mx_to_torch_edge_list, corruption 18 | 19 | class SpaceFlow(object): 20 | """An object for analysis of spatial transcriptomics data. 21 | 22 | :param adata: the `anndata.AnnData` object as input, see `https://anndata.readthedocs.io/en/latest/` for more info about`anndata`. 23 | :type adata: class:`anndata.AnnData` 24 | :param count_matrix: count matrix of gene expression, 2D numpy array of size (n_cells, n_genes) 25 | :type count_matrix: class:`numpy.ndarray` 26 | :param spatial_locs: spatial locations of cells (or spots) match to rows of the count matrix, 1D numpy array of size (n_cells,) 27 | :type spatial_locs: class:`numpy.ndarray` 28 | :param sample_names: list of sample names in 1D numpy str array of size (n_cells,), optional 29 | :type sample_names: class:`numpy.ndarray` or `list` of `str` 30 | :param gene_names: list of gene names in 1D numpy str array of size (n_genes,), optional 31 | :type gene_names: class:`numpy.ndarray` or `list` of `str` 32 | 33 | """ 34 | 35 | def __init__(self, adata=None, count_matrix=None, spatial_locs=None, sample_names=None, gene_names=None): 36 | """ 37 | Inputs 38 | ------ 39 | adata: an anndata.AnnData type object, optional (either input `adata` or both `count_matrix` and `spatial_locs`) 40 | count_matrix : count matrix of gene expression, 2D numpy array of size (n_cells, n_genes) 41 | spatial_locs : spatial locations of cells (or spots) match to rows of the count matrix, 1D numpy array of size (n_cells,) 42 | sample_names : list of sample names in 1D numpy str array of size (n_cells,), optional 43 | gene_names : list of gene names in 1D numpy str array of size (n_genes,), optional 44 | """ 45 | if adata and isinstance(adata, anndata.AnnData): 46 | self.adata = adata 47 | elif count_matrix is not None and spatial_locs is not None: 48 | self.adata = anndata.AnnData(count_matrix.astype(float)) 49 | self.adata.obsm['spatial'] = spatial_locs.astype(float) 50 | if gene_names: 51 | self.adata.var_names = np.array(gene_names).astype(str) 52 | if sample_names: 53 | self.adata.obs_names = np.array(sample_names).astype(str) 54 | else: 55 | print("Please input either an anndata.AnnData or both the count_matrix (count matrix of gene expression, 2D int numpy array of size (n_cells, n_genes)) and spatial_locs (spatial locations of cells (or spots) in 1D float numpy array of size (n_locations,)) to initiate SpaceFlow object.") 56 | exit(1) 57 | 58 | def plt_setting(self, fig_title_sz=30, font_sz=12, font_weight="bold", axes_title_sz=12, axes_label_sz=12, xtick_sz=10, ytick_sz=10, legend_font_sz=10): 59 | """ 60 | Setting the plotting configuration 61 | :param fig_title_sz: fontsize of the figure title, default: 30 62 | :type fig_title_sz: int, optional 63 | :param font_sz: controls default text sizes, default: 12 64 | :type font_sz: int, optional 65 | :param font_weight: controls default text weights, default: 'bold' 66 | :type font_weight: str, optional 67 | :param axes_title_sz: fontsize of the axes title, default: 12 68 | :type axes_title_sz: int, optional 69 | :param axes_label_sz: fontsize of the x and y labels, default 12 70 | :type axes_label_sz: int, optional 71 | :param xtick_sz: fontsize of the x tick label, default 10 72 | :type xtick_sz: int, optional 73 | :param ytick_sz: fontsize of the y tick label, default 10 74 | :type ytick_sz: int, optional 75 | :param legend_font_sz: legend fontsize, default 10 76 | :type legend_font_sz: int, optional 77 | """ 78 | plt.rc('figure', titlesize=fig_title_sz) # fontsize of the figure title 79 | plt.rc('font', size=font_sz, weight=font_weight) # controls default text sizes 80 | plt.rc('axes', titlesize=axes_title_sz) # fontsize of the axes title 81 | plt.rc('axes', labelsize=axes_label_sz) # fontsize of the x and y labels 82 | plt.rc('xtick', labelsize=xtick_sz) # fontsize of the x tick label 83 | plt.rc('ytick', labelsize=ytick_sz) # fontsize of the y tick label 84 | plt.rc('legend', fontsize=legend_font_sz) # legend fontsize 85 | 86 | def prepare_figure(self, rsz=4., csz=4., wspace=.4, hspace=.5, left=0.125, right=0.9, bottom=0.1, top=0.9): 87 | """ 88 | Prepare the figure and axes given the configuration 89 | :param rsz: row size of the figure in inches, default: 4.0 90 | :type rsz: float, optional 91 | :param csz: column size of the figure in inches, default: 4.0 92 | :type csz: float, optional 93 | :param wspace: the amount of width reserved for space between subplots, expressed as a fraction of the average axis width, default: 0.4 94 | :type wspace: float, optional 95 | :param hspace: the amount of height reserved for space between subplots, expressed as a fraction of the average axis width, default: 0.4 96 | :type hspace: float, optional 97 | :param left: the leftmost position of the subplots of the figure in fraction, default: 0.125 98 | :type left: float, optional 99 | :param right: the rightmost position of the subplots of the figure in fraction, default: 0.9 100 | :type right: float, optional 101 | :param bottom: the bottom position of the subplots of the figure in fraction, default: 0.1 102 | :type bottom: float, optional 103 | :param top: the top position of the subplots of the figure in fraction, default: 0.9 104 | :type top: float, optional 105 | """ 106 | fig, axs = plt.subplots(1, 1, figsize=(csz, rsz)) 107 | plt.subplots_adjust(wspace=wspace, hspace=hspace, left=left, right=right, bottom=bottom, top=top) 108 | return fig, axs 109 | 110 | def preprocessing_data(self, n_top_genes=None, n_neighbors=10): 111 | """ 112 | Preprocessing the spatial transcriptomics data 113 | Generates: `self.adata_filtered`: (n_cells, n_locations) `numpy.ndarray` 114 | `self.spatial_graph`: (n_cells, n_locations) `numpy.ndarray` 115 | :param adata: the annData object for spatial transcriptomics data with adata.obsm['spatial'] set to be the spatial locations. 116 | :type adata: class:`anndata.annData` 117 | :param n_top_genes: the number of top highly variable genes 118 | :type n_top_genes: int, optional 119 | :param n_neighbors: the number of nearest neighbors for building spatial neighbor graph 120 | :type n_neighbors: int, optional 121 | :return: a preprocessed annData object of the spatial transcriptomics data 122 | :rtype: class:`anndata.annData` 123 | :return: a geometry-aware spatial proximity graph of the spatial spots of cells 124 | :rtype: class:`scipy.sparse.csr_matrix` 125 | """ 126 | adata = self.adata 127 | if not adata: 128 | print("No annData object found, please run SpaceFlow.SpaceFlow(expr_data, spatial_locs) first!") 129 | return 130 | sc.pp.normalize_total(adata, target_sum=1e4) 131 | sc.pp.log1p(adata) 132 | sc.pp.highly_variable_genes(adata, n_top_genes=n_top_genes, flavor='cell_ranger', subset=True) 133 | sc.pp.pca(adata) 134 | spatial_locs = adata.obsm['spatial'] 135 | spatial_graph = self.graph_alpha(spatial_locs, n_neighbors=n_neighbors) 136 | 137 | self.adata_preprocessed = adata 138 | self.spatial_graph = spatial_graph 139 | 140 | def graph_alpha(self, spatial_locs, n_neighbors=10): 141 | """ 142 | Construct a geometry-aware spatial proximity graph of the spatial spots of cells by using alpha complex. 143 | :param adata: the annData object for spatial transcriptomics data with adata.obsm['spatial'] set to be the spatial locations. 144 | :type adata: class:`anndata.annData` 145 | :param n_neighbors: the number of nearest neighbors for building spatial neighbor graph based on Alpha Complex 146 | :type n_neighbors: int, optional, default: 10 147 | :return: a spatial neighbor graph 148 | :rtype: class:`scipy.sparse.csr_matrix` 149 | """ 150 | A_knn = kneighbors_graph(spatial_locs, n_neighbors=n_neighbors, mode='distance') 151 | estimated_graph_cut = A_knn.sum() / float(A_knn.count_nonzero()) 152 | spatial_locs_list = spatial_locs.tolist() 153 | n_node = len(spatial_locs_list) 154 | alpha_complex = gudhi.AlphaComplex(points=spatial_locs_list) 155 | simplex_tree = alpha_complex.create_simplex_tree(max_alpha_square=estimated_graph_cut ** 2) 156 | skeleton = simplex_tree.get_skeleton(1) 157 | initial_graph = nx.Graph() 158 | initial_graph.add_nodes_from([i for i in range(n_node)]) 159 | for s in skeleton: 160 | if len(s[0]) == 2: 161 | initial_graph.add_edge(s[0][0], s[0][1]) 162 | 163 | extended_graph = nx.Graph() 164 | extended_graph.add_nodes_from(initial_graph) 165 | extended_graph.add_edges_from(initial_graph.edges) 166 | 167 | # Remove self edges 168 | for i in range(n_node): 169 | try: 170 | extended_graph.remove_edge(i, i) 171 | except: 172 | pass 173 | 174 | return nx.to_scipy_sparse_matrix(extended_graph, format='csr') 175 | 176 | def train(self, embedding_save_filepath="./embedding.tsv", spatial_regularization_strength=0.1, z_dim=50, lr=1e-3, epochs=1000, max_patience=50, min_stop=100, random_seed=42, gpu=0, regularization_acceleration=True, edge_subset_sz=1000000): 177 | adata_preprocessed, spatial_graph = self.adata_preprocessed, self.spatial_graph 178 | """ 179 | Training the Deep GraphInfomax Model 180 | :param embedding_save_filepath: the default save path for the low-dimensional embeddings 181 | :type embedding_save_filepath: class:`str` 182 | :param spatial_regularization_strength: the strength for spatial regularization 183 | :type spatial_regularization_strength: float, optional, default: 0.1 184 | :param z_dim: the size of latent dimension 185 | :type z_dim: int, optional, default: 50 186 | :param lr: the learning rate for model optimization 187 | :type lr: float, optional, default: 1e-3 188 | :param epochs: the max epoch number 189 | :type epochs: int, optional, default: 1000 190 | :param max_patience: the tolerance epoch number without training loss decrease 191 | :type max_patience: int, optional, default: 50 192 | :param min_stop: the minimum epoch number for training before any early stop 193 | :type min_stop: int, optional, default: 100 194 | :param random_seed: the random seed 195 | :type random_seed: int, optional, default: 42 196 | :param gpu: the index for gpu device that will be used for model training, if no gpu detected, cpu will be used. 197 | :type gpu: int, optional, default: 0 198 | :param regularization_acceleration: whether or not accelerate the calculation of regularization loss using edge subsetting strategy 199 | :type regularization_acceleration: bool, optional, default: True 200 | :param edge_subset_sz: the edge subset size for regularization acceleration 201 | :type edge_subset_sz: int, optional, default: 1000000 202 | :return: low dimensional embeddings for the ST data, shape: n_cells x z_dim 203 | :rtype: class:`numpy.ndarray` 204 | """ 205 | if not adata_preprocessed: 206 | print("The data has not been preprocessed, please run preprocessing_data() method first!") 207 | return 208 | torch.manual_seed(random_seed) 209 | random.seed(random_seed) 210 | np.random.seed(random_seed) 211 | 212 | device = f"cuda:{gpu}" if torch.cuda.is_available() else 'cpu' 213 | model = DeepGraphInfomax( 214 | hidden_channels=z_dim, encoder=GraphEncoder(adata_preprocessed.shape[1], z_dim), 215 | summary=lambda z, *args, **kwargs: torch.sigmoid(z.mean(dim=0)), 216 | corruption=corruption).to(device) 217 | 218 | expr = adata_preprocessed.X.todense() if type(adata_preprocessed.X).__module__ != np.__name__ else adata_preprocessed.X 219 | expr = torch.tensor(expr).float().to(device) 220 | 221 | edge_list = sparse_mx_to_torch_edge_list(spatial_graph).to(device) 222 | 223 | model.train() 224 | min_loss = np.inf 225 | patience = 0 226 | optimizer = torch.optim.Adam(model.parameters(), lr=lr) 227 | best_params = model.state_dict() 228 | 229 | for epoch in range(epochs): 230 | train_loss = 0.0 231 | torch.set_grad_enabled(True) 232 | optimizer.zero_grad() 233 | z, neg_z, summary = model(expr, edge_list) 234 | loss = model.loss(z, neg_z, summary) 235 | 236 | coords = torch.tensor(adata_preprocessed.obsm['spatial']).float().to(device) 237 | if regularization_acceleration or adata_preprocessed.shape[0] > 5000: 238 | cell_random_subset_1, cell_random_subset_2 = torch.randint(0, z.shape[0], (edge_subset_sz,)).to( 239 | device), torch.randint(0, z.shape[0], (edge_subset_sz,)).to(device) 240 | z1, z2 = torch.index_select(z, 0, cell_random_subset_1), torch.index_select(z, 0, cell_random_subset_2) 241 | c1, c2 = torch.index_select(coords, 0, cell_random_subset_1), torch.index_select(coords, 0, 242 | cell_random_subset_1) 243 | pdist = torch.nn.PairwiseDistance(p=2) 244 | 245 | z_dists = pdist(z1, z2) 246 | z_dists = z_dists / torch.max(z_dists) 247 | 248 | sp_dists = pdist(c1, c2) 249 | sp_dists = sp_dists / torch.max(sp_dists) 250 | n_items = z_dists.size(dim=0) 251 | else: 252 | z_dists = torch.cdist(z, z, p=2) 253 | z_dists = torch.div(z_dists, torch.max(z_dists)).to(device) 254 | sp_dists = torch.cdist(coords, coords, p=2) 255 | sp_dists = torch.div(sp_dists, torch.max(sp_dists)).to(device) 256 | n_items = z.size(dim=0) * z.size(dim=0) 257 | 258 | penalty_1 = torch.div(torch.sum(torch.mul(1.0 - z_dists, sp_dists)), n_items).to(device) 259 | loss = loss + spatial_regularization_strength * penalty_1 260 | 261 | loss.backward() 262 | optimizer.step() 263 | train_loss += loss.item() 264 | 265 | if train_loss > min_loss: 266 | patience += 1 267 | else: 268 | patience = 0 269 | min_loss = train_loss 270 | best_params = model.state_dict() 271 | if epoch % 10 == 1: 272 | print(f"Epoch {epoch + 1}/{epochs}, Loss: {str(train_loss)}") 273 | if patience > max_patience and epoch > min_stop: 274 | break 275 | 276 | model.load_state_dict(best_params) 277 | 278 | z, _, _ = model(expr, edge_list) 279 | embedding = z.cpu().detach().numpy() 280 | save_dir = os.path.dirname(embedding_save_filepath) 281 | if not os.path.exists(save_dir): 282 | os.makedirs(save_dir) 283 | np.savetxt(embedding_save_filepath, embedding[:, :], delimiter="\t") 284 | print(f"Training complete!\nEmbedding is saved at {embedding_save_filepath}") 285 | 286 | self.embedding = embedding 287 | return embedding 288 | 289 | def segmentation(self, domain_label_save_filepath="./domains.tsv", n_neighbors=50, resolution=1.0): 290 | """ 291 | Perform domain segmentation for ST data using Leiden clustering with low-dimensional embeddings as input 292 | :param domain_label_save_filepath: the default save path for the domain labels 293 | :type domain_label_save_filepath: class:`str`, optional, default: "./domains.tsv" 294 | :param n_neighbors: The size of local neighborhood (in terms of number of neighboring data 295 | points) used for manifold approximation. See `https://scanpy.readthedocs.io/en/stable/generated/scanpy.pp.neighbors.html` for detail 296 | :type n_neighbors: int, optional, default: 50 297 | :param resolution: A parameter value controlling the coarseness of the clustering. 298 | Higher values lead to more clusters. See `https://scanpy.readthedocs.io/en/stable/generated/scanpy.tl.leiden.html` for detail 299 | :type resolution: float, optional, default: 1.0 300 | """ 301 | error_message = "No embedding found, please ensure you have run train() method before segmentation!" 302 | try: 303 | print("Performing domain segmentation") 304 | embedding_adata = anndata.AnnData(self.embedding) 305 | sc.pp.neighbors(embedding_adata, n_neighbors=n_neighbors, use_rep='X') 306 | sc.tl.leiden(embedding_adata, resolution=float(resolution)) 307 | domains = embedding_adata.obs["leiden"].cat.codes 308 | 309 | save_dir = os.path.dirname(domain_label_save_filepath) 310 | if not os.path.exists(save_dir): 311 | os.makedirs(save_dir) 312 | np.savetxt(domain_label_save_filepath, domains, fmt='%d', header='', footer='', comments='') 313 | print(f"Segmentation complete, domain labels of cells or spots saved at {domain_label_save_filepath} !") 314 | self.domains = domains 315 | 316 | except NameError: 317 | print(error_message) 318 | except AttributeError: 319 | print(error_message) 320 | 321 | def plot_segmentation(self, segmentation_figure_save_filepath="./domain_segmentation.pdf", colormap="tab20", scatter_sz=1., rsz=4., csz=4., wspace=.4, hspace=.5, left=0.125, right=0.9, bottom=0.1, top=0.9): 322 | """ 323 | Plot the domain segmentation for ST data in spatial 324 | :param segmentation_figure_save_filepath: the default save path for the figure 325 | :type segmentation_figure_save_filepath: class:`str`, optional, default: "./domain_segmentation.pdf" 326 | :param colormap: The colormap to use. See `https://matplotlib.org/stable/tutorials/colors/colormaps.html` for full list of colormaps 327 | :type colormap: str, optional, default: tab20 328 | :param scatter_sz: The marker size in points**2 329 | :type scatter_sz: float, optional, default: 1.0 330 | :param rsz: row size of the figure in inches, default: 4.0 331 | :type rsz: float, optional 332 | :param csz: column size of the figure in inches, default: 4.0 333 | :type csz: float, optional 334 | :param wspace: the amount of width reserved for space between subplots, expressed as a fraction of the average axis width, default: 0.4 335 | :type wspace: float, optional 336 | :param hspace: the amount of height reserved for space between subplots, expressed as a fraction of the average axis width, default: 0.4 337 | :type hspace: float, optional 338 | :param left: the leftmost position of the subplots of the figure in fraction, default: 0.125 339 | :type left: float, optional 340 | :param right: the rightmost position of the subplots of the figure in fraction, default: 0.9 341 | :type right: float, optional 342 | :param bottom: the bottom position of the subplots of the figure in fraction, default: 0.1 343 | :type bottom: float, optional 344 | :param top: the top position of the subplots of the figure in fraction, default: 0.9 345 | :type top: float, optional 346 | """ 347 | error_message = "No segmentation data found, please ensure you have run the segmentation() method." 348 | try: 349 | fig, ax = self.prepare_figure(rsz=rsz, csz=csz, wspace=wspace, hspace=hspace, left=left, right=right, bottom=bottom, top=top) 350 | 351 | pred_clusters = np.array(self.domains).astype(int) 352 | uniq_pred = np.unique(pred_clusters) 353 | n_cluster = len(uniq_pred) 354 | x, y = self.adata_preprocessed.obsm["spatial"][:, 0], self.adata_preprocessed.obsm["spatial"][:, 1] 355 | cmap = plt.get_cmap(colormap) 356 | for cid, cluster in enumerate(uniq_pred): 357 | color = cmap((cid * (n_cluster / (n_cluster - 1.0))) / n_cluster) 358 | ind = pred_clusters == cluster 359 | ax.scatter(x[ind], y[ind], s=scatter_sz, color=color, label=cluster, marker=".") 360 | ax.set_facecolor("none") 361 | ax.invert_yaxis() 362 | ax.set_title("Domain Segmentation", fontsize=14) 363 | box = ax.get_position() 364 | height_ratio = .8 365 | ax.set_position([box.x0, box.y0, box.width * 0.8, box.height * height_ratio]) 366 | lgnd = ax.legend(loc='center left', fontsize=8, bbox_to_anchor=(1, 0.5), scatterpoints=1, handletextpad=0.1, 367 | borderaxespad=.1, ncol=int(math.ceil(n_cluster/10))) 368 | for handle in lgnd.legendHandles: 369 | handle._sizes = [8] 370 | 371 | save_dir = os.path.dirname(segmentation_figure_save_filepath) 372 | if not os.path.exists(save_dir): 373 | os.makedirs(save_dir) 374 | plt.savefig(segmentation_figure_save_filepath, dpi=300) 375 | print(f"Plotting complete, segmentation figure saved at {segmentation_figure_save_filepath} !") 376 | plt.close('all') 377 | except NameError: 378 | print(error_message) 379 | except AttributeError: 380 | print(error_message) 381 | 382 | def pseudo_Spatiotemporal_Map(self, pSM_values_save_filepath="./pSM_values.tsv", n_neighbors=20, resolution=1.0): 383 | """ 384 | Perform pseudo-Spatiotemporal Map for ST data 385 | :param pSM_values_save_filepath: the default save path for the pSM values 386 | :type pSM_values_save_filepath: class:`str`, optional, default: "./pSM_values.tsv" 387 | :param n_neighbors: The size of local neighborhood (in terms of number of neighboring data 388 | points) used for manifold approximation. See `https://scanpy.readthedocs.io/en/stable/generated/scanpy.pp.neighbors.html` for detail 389 | :type n_neighbors: int, optional, default: 20 390 | :param resolution: A parameter value controlling the coarseness of the clustering. 391 | Higher values lead to more clusters. See `https://scanpy.readthedocs.io/en/stable/generated/scanpy.tl.leiden.html` for detail 392 | :type resolution: float, optional, default: 1.0 393 | """ 394 | error_message = "No embedding found, please ensure you have run train() method before calculating pseudo-Spatiotemporal Map!" 395 | max_cell_for_subsampling = 5000 396 | try: 397 | print("Performing pseudo-Spatiotemporal Map") 398 | adata = anndata.AnnData(self.embedding) 399 | sc.pp.neighbors(adata, n_neighbors=n_neighbors, use_rep='X') 400 | sc.tl.umap(adata) 401 | sc.tl.leiden(adata, resolution=resolution) 402 | sc.tl.paga(adata) 403 | if adata.shape[0] < max_cell_for_subsampling: 404 | sub_adata_x = adata.X 405 | else: 406 | indices = np.arange(adata.shape[0]) 407 | selected_ind = np.random.choice(indices, max_cell_for_subsampling, False) 408 | sub_adata_x = adata.X[selected_ind, :] 409 | sum_dists = distance_matrix(sub_adata_x, sub_adata_x).sum(axis=1) 410 | adata.uns['iroot'] = np.argmax(sum_dists) 411 | sc.tl.diffmap(adata) 412 | sc.tl.dpt(adata) 413 | pSM_values = adata.obs['dpt_pseudotime'].to_numpy() 414 | save_dir = os.path.dirname(pSM_values_save_filepath) 415 | if not os.path.exists(save_dir): 416 | os.makedirs(save_dir) 417 | np.savetxt(pSM_values_save_filepath, pSM_values, fmt='%.5f', header='', footer='', comments='') 418 | print(f"pseudo-Spatiotemporal Map(pSM) calculation complete, pSM values of cells or spots saved at {pSM_values_save_filepath}!") 419 | self.pSM_values = pSM_values 420 | except NameError: 421 | print(error_message) 422 | except AttributeError: 423 | print(error_message) 424 | 425 | def plot_pSM(self, pSM_figure_save_filepath="./pseudo-Spatiotemporal-Map.pdf", colormap='roma', scatter_sz=1., rsz=4., csz=4., wspace=.4, hspace=.5, left=0.125, right=0.9, bottom=0.1, top=0.9): 426 | """ 427 | Plot the domain segmentation for ST data in spatial 428 | :param pSM_figure_save_filepath: the default save path for the figure 429 | :type pSM_figure_save_filepath: class:`str`, optional, default: "./Spatiotemporal-Map.pdf" 430 | :param colormap: The colormap to use. See `https://www.fabiocrameri.ch/colourmaps-userguide/` for name list of colormaps 431 | :type colormap: str, optional, default: roma 432 | :param scatter_sz: The marker size in points**2 433 | :type scatter_sz: float, optional, default: 1.0 434 | :param rsz: row size of the figure in inches, default: 4.0 435 | :type rsz: float, optional 436 | :param csz: column size of the figure in inches, default: 4.0 437 | :type csz: float, optional 438 | :param wspace: the amount of width reserved for space between subplots, expressed as a fraction of the average axis width, default: 0.4 439 | :type wspace: float, optional 440 | :param hspace: the amount of height reserved for space between subplots, expressed as a fraction of the average axis width, default: 0.4 441 | :type hspace: float, optional 442 | :param left: the leftmost position of the subplots of the figure in fraction, default: 0.125 443 | :type left: float, optional 444 | :param right: the rightmost position of the subplots of the figure in fraction, default: 0.9 445 | :type right: float, optional 446 | :param bottom: the bottom position of the subplots of the figure in fraction, default: 0.1 447 | :type bottom: float, optional 448 | :param top: the top position of the subplots of the figure in fraction, default: 0.9 449 | :type top: float, optional 450 | """ 451 | error_message = "No pseudo Spatiotemporal Map data found, please ensure you have run the pseudo_Spatiotemporal_Map() method." 452 | try: 453 | fig, ax = self.prepare_figure(rsz=rsz, csz=csz, wspace=wspace, hspace=hspace, left=left, right=right, bottom=bottom, top=top) 454 | x, y = self.adata_preprocessed.obsm["spatial"][:, 0], self.adata_preprocessed.obsm["spatial"][:, 1] 455 | st = ax.scatter(x, y, s=scatter_sz, c=self.pSM_values, cmap=f"cmc.{colormap}", marker=".") 456 | ax.invert_yaxis() 457 | clb = fig.colorbar(st) 458 | clb.ax.set_ylabel("pseudotime", labelpad=10, rotation=270, fontsize=10, weight='bold') 459 | ax.set_title("pseudo-Spatiotemporal Map", fontsize=14) 460 | ax.set_facecolor("none") 461 | 462 | save_dir = os.path.dirname(pSM_figure_save_filepath) 463 | if not os.path.exists(save_dir): 464 | os.makedirs(save_dir) 465 | plt.savefig(pSM_figure_save_filepath, dpi=300) 466 | print(f"Plotting complete, pseudo-Spatiotemporal Map figure saved at {pSM_figure_save_filepath} !") 467 | plt.close('all') 468 | except NameError: 469 | print(error_message) 470 | except AttributeError: 471 | print(error_message) 472 | 473 | class GraphEncoder(nn.Module): 474 | def __init__(self, in_channels, hidden_channels): 475 | super(GraphEncoder, self).__init__() 476 | self.conv = GCNConv(in_channels, hidden_channels, cached=False) 477 | self.prelu = nn.PReLU(hidden_channels) 478 | self.conv2 = GCNConv(hidden_channels, hidden_channels, cached=False) 479 | self.prelu2 = nn.PReLU(hidden_channels) 480 | 481 | def forward(self, x, edge_index): 482 | x = self.conv(x, edge_index) 483 | x = self.prelu(x) 484 | x = self.conv2(x, edge_index) 485 | x = self.prelu2(x) 486 | return x 487 | -------------------------------------------------------------------------------- /SpaceFlow/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongleir/SpaceFlow/58d1ab03f1538791f710db840d36a08f396491fb/SpaceFlow/__init__.py -------------------------------------------------------------------------------- /SpaceFlow/util.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import torch 3 | import numpy as np 4 | 5 | def sparse_mx_to_torch_edge_list(sparse_mx): 6 | sparse_mx = sparse_mx.tocoo().astype(np.float32) 7 | edge_list = torch.from_numpy( 8 | np.vstack((sparse_mx.row, sparse_mx.col)).astype(np.int64)) 9 | return edge_list 10 | 11 | def corruption(x, edge_index): 12 | return x[torch.randperm(x.size(0))], edge_index -------------------------------------------------------------------------------- /images/annotation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongleir/SpaceFlow/58d1ab03f1538791f710db840d36a08f396491fb/images/annotation.png -------------------------------------------------------------------------------- /images/domain_segmentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongleir/SpaceFlow/58d1ab03f1538791f710db840d36a08f396491fb/images/domain_segmentation.png -------------------------------------------------------------------------------- /images/pSM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hongleir/SpaceFlow/58d1ab03f1538791f710db840d36a08f396491fb/images/pSM.png -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools>=42"] 3 | build-backend = "setuptools.build_meta" -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | scipy 3 | pandas 4 | anndata 5 | gudhi 6 | matplotlib 7 | networkx 8 | notebook 9 | scanpy 10 | squidpy 11 | cmcrameri 12 | scikit-learn 13 | torch>=1.9.0 14 | torch-geometric>=1.7.2 15 | torch-sparse>=0.6.11 16 | torch-scatter>=2.0.8 -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = SpaceFlow 3 | version = 1.0.3 4 | description = Identifying Spatiotemporal Patterns of Cells for Spatial Transcriptome Data 5 | author = Honglei Ren 6 | author_email = hongleir1@gmail.com 7 | 8 | [options] 9 | packages = find: 10 | install_requires = 11 | numpy 12 | scipy 13 | pandas 14 | anndata 15 | gudhi 16 | matplotlib 17 | networkx 18 | notebook 19 | scanpy 20 | squidpy 21 | scikit-learn 22 | torch>=1.9.0 23 | torch-geometric>=1.7.2 24 | torch-sparse>=0.6.11 25 | torch-scatter>=2.0.8 26 | cmcrameri 27 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import scanpy as sc 2 | import squidpy as sq 3 | from SpaceFlow import SpaceFlow 4 | 5 | adata = sq.datasets.seqfish() 6 | sf = SpaceFlow.SpaceFlow(expr_data=adata.X, spatial_locs=adata.obsm['spatial']) 7 | sf.preprocessing_data() 8 | sf.train() 9 | sf.segmentation() 10 | sf.plot_segmentation() 11 | sf.pseudo_Spatiotemporal_Map() 12 | sf.plot_pSM() -------------------------------------------------------------------------------- /tutorials/seqfish_mouse_embryogenesis.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "6e2c6ffb", 6 | "metadata": {}, 7 | "source": [ 8 | "### 1. Import SpaceFlow and squidpy package" 9 | ] 10 | }, 11 | { 12 | "cell_type": "code", 13 | "execution_count": 1, 14 | "id": "bfb92fc1", 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import warnings\n", 19 | "warnings.filterwarnings('ignore')\n", 20 | "import squidpy as sq\n", 21 | "from SpaceFlow import SpaceFlow" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "id": "51f08772", 27 | "metadata": {}, 28 | "source": [ 29 | "### 2. Load the ST data from squidpy package" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 2, 35 | "id": "c9751643", 36 | "metadata": {}, 37 | "outputs": [], 38 | "source": [ 39 | "adata = sq.datasets.seqfish()" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "id": "0c555016", 45 | "metadata": {}, 46 | "source": [ 47 | "### 3. Create SpaceFlow Object\n", 48 | "\n", 49 | "We create a SpaceFlow object using the count matrix of gene expression and the corresponding spatial locations of cells (or spots):" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 3, 55 | "id": "03d86b43", 56 | "metadata": {}, 57 | "outputs": [], 58 | "source": [ 59 | "sf = SpaceFlow.SpaceFlow(expr_data=adata.X, \n", 60 | " spatial_locs=adata.obsm['spatial'])" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "id": "44b702dc", 66 | "metadata": {}, 67 | "source": [ 68 | "Parameters:\n", 69 | "- `expr_data`: the count matrix of gene expression, 2D numpy array of size (# of cells, # of genes)\n", 70 | "- `spatial_locs`: spatial locations of cells (or spots) match to rows of the count matrix, 1D numpy array of size (n_locations,)" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "id": "f94e1a04", 76 | "metadata": {}, 77 | "source": [ 78 | "### 4. Preprocessing the ST Data\n", 79 | "Next, we preprocess the ST data by run:" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 4, 85 | "id": "c39b6093", 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [ 89 | "sf.preprocessing_data(n_top_genes=3000)" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "id": "aefc6a0c", 95 | "metadata": {}, 96 | "source": [ 97 | "Parameters:\n", 98 | "- `n_top_genes`: the number of the top highly variable genes.\n", 99 | "\n", 100 | "The preprocessing includes the normalization and log-transformation of the expression count matrix, the selection of highly variable genes, and the construction of spatial proximity graph using spatial coordinates. (Details see the `preprocessing_data` function in `SpaceFlow/SpaceFlow.py`)\n" 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "id": "ece4a0d9", 106 | "metadata": {}, 107 | "source": [ 108 | "### 5. Train the deep graph network model\n", 109 | "\n", 110 | "We then train a spatially regularized deep graph network model to learn a low-dimensional embedding that reflecting both expression similarity and the spatial proximity of cells in ST data. \n" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 5, 116 | "id": "57a701a1", 117 | "metadata": {}, 118 | "outputs": [ 119 | { 120 | "name": "stdout", 121 | "output_type": "stream", 122 | "text": [ 123 | "Epoch 2/1000, Loss: 2.105508804321289\n", 124 | "Epoch 12/1000, Loss: 1.3464184999465942\n", 125 | "Epoch 22/1000, Loss: 1.09248685836792\n", 126 | "Epoch 32/1000, Loss: 0.8551639914512634\n", 127 | "Epoch 42/1000, Loss: 0.6653984189033508\n", 128 | "Epoch 52/1000, Loss: 0.4879186451435089\n", 129 | "Epoch 62/1000, Loss: 0.34967240691185\n", 130 | "Epoch 72/1000, Loss: 0.274603009223938\n", 131 | "Epoch 82/1000, Loss: 0.2149953991174698\n", 132 | "Epoch 92/1000, Loss: 0.18800733983516693\n", 133 | "Epoch 102/1000, Loss: 0.15587514638900757\n", 134 | "Epoch 112/1000, Loss: 0.15160660445690155\n", 135 | "Epoch 122/1000, Loss: 0.13229766488075256\n", 136 | "Epoch 132/1000, Loss: 0.12213142216205597\n", 137 | "Epoch 142/1000, Loss: 0.11389018595218658\n", 138 | "Epoch 152/1000, Loss: 0.11026303470134735\n", 139 | "Epoch 162/1000, Loss: 0.10858513414859772\n", 140 | "Epoch 172/1000, Loss: 0.0981854647397995\n", 141 | "Epoch 182/1000, Loss: 0.09261471033096313\n", 142 | "Epoch 192/1000, Loss: 0.09784780442714691\n", 143 | "Epoch 202/1000, Loss: 0.09372460097074509\n", 144 | "Epoch 212/1000, Loss: 0.09502124786376953\n", 145 | "Epoch 222/1000, Loss: 0.0898984745144844\n", 146 | "Epoch 232/1000, Loss: 0.08758103847503662\n", 147 | "Epoch 242/1000, Loss: 0.07875576615333557\n", 148 | "Epoch 252/1000, Loss: 0.07564771175384521\n", 149 | "Epoch 262/1000, Loss: 0.07840961217880249\n", 150 | "Epoch 272/1000, Loss: 0.08345237374305725\n", 151 | "Epoch 282/1000, Loss: 0.07537221163511276\n", 152 | "Epoch 292/1000, Loss: 0.07451540231704712\n", 153 | "Epoch 302/1000, Loss: 0.0789402425289154\n", 154 | "Epoch 312/1000, Loss: 0.07124275714159012\n", 155 | "Epoch 322/1000, Loss: 0.07497982680797577\n", 156 | "Epoch 332/1000, Loss: 0.07454021275043488\n", 157 | "Epoch 342/1000, Loss: 0.06699051707983017\n", 158 | "Epoch 352/1000, Loss: 0.08066301047801971\n", 159 | "Epoch 362/1000, Loss: 0.06973342597484589\n", 160 | "Epoch 372/1000, Loss: 0.07150772213935852\n", 161 | "Epoch 382/1000, Loss: 0.0745912715792656\n", 162 | "Epoch 392/1000, Loss: 0.07225732505321503\n", 163 | "Epoch 402/1000, Loss: 0.06479880213737488\n", 164 | "Epoch 412/1000, Loss: 0.07020575553178787\n", 165 | "Epoch 422/1000, Loss: 0.07892539352178574\n", 166 | "Epoch 432/1000, Loss: 0.06901434808969498\n", 167 | "Training complete!\n", 168 | "Embedding is saved at ./embedding.tsv\n" 169 | ] 170 | }, 171 | { 172 | "data": { 173 | "text/plain": [ 174 | "array([[-1.3693943 , -0.1211542 , 3.066468 , ..., -0.58150786,\n", 175 | " -0.12908368, 3.6877515 ],\n", 176 | " [-1.1312834 , -0.282027 , 3.43263 , ..., -0.6431831 ,\n", 177 | " -0.0902295 , 4.229353 ],\n", 178 | " [-1.0586573 , 2.594063 , 0.5477483 , ..., -0.2179767 ,\n", 179 | " -0.20996477, 1.9479373 ],\n", 180 | " ...,\n", 181 | " [-0.58471024, 2.330395 , -0.04218347, ..., -0.25748822,\n", 182 | " 0.0110341 , 1.8769083 ],\n", 183 | " [-0.8118924 , 0.48114178, 3.4098723 , ..., -0.2737087 ,\n", 184 | " 0.23058248, 2.079208 ],\n", 185 | " [-0.39583313, 1.7552938 , 0.08656111, ..., -0.27222347,\n", 186 | " 1.6503936 , 1.3976719 ]], dtype=float32)" 187 | ] 188 | }, 189 | "execution_count": 5, 190 | "metadata": {}, 191 | "output_type": "execute_result" 192 | } 193 | ], 194 | "source": [ 195 | "sf.train(spatial_regularization_strength=0.1, \n", 196 | " z_dim=50, \n", 197 | " lr=1e-3, \n", 198 | " epochs=1000, \n", 199 | " max_patience=50, \n", 200 | " min_stop=100, \n", 201 | " random_seed=42, \n", 202 | " gpu=0, \n", 203 | " regularization_acceleration=True, \n", 204 | " edge_subset_sz=1000000)" 205 | ] 206 | }, 207 | { 208 | "cell_type": "markdown", 209 | "id": "e100a063", 210 | "metadata": {}, 211 | "source": [ 212 | "Parameters:\n", 213 | "- `spatial_regularization_strength`: the strength of spatial regularization, the larger the more of the spatial coherence in the identified spatial domains and spatiotemporal patterns. (default: 0.1)\n", 214 | "- `z_dim`: the target size of the learned embedding. (default: 50)\n", 215 | "- `lr`: learning rate for optimizing the model. (default: 1e-3)\n", 216 | "- `epochs`: the max number of the epochs for model training. (default: 1000)\n", 217 | "- `max_patience`: the max number of the epoch for waiting the loss decreasing. If loss does not decrease for epochs larger than this threshold, the learning will stop, and the model with the parameters that shows the minimal loss are kept as the best model. (default: 50) \n", 218 | "- `min_stop`: the earliest epoch the learning can stop if no decrease in loss for epochs larger than the `max_patience`. (default: 100) \n", 219 | "- `random_seed`: the random seed set to the random generators of the `random`, `numpy`, `torch` packages. (default: 42)\n", 220 | "- `gpu`: the index of the Nvidia GPU, if no GPU, the model will be trained via CPU, which is slower than the GPU training time. (default: 0) \n", 221 | "- `regularization_acceleration`: whether or not accelerate the calculation of regularization loss using edge subsetting strategy (default: True)\n", 222 | "- `edge_subset_sz`: the edge subset size for regularization acceleration (default: 1000000)" 223 | ] 224 | }, 225 | { 226 | "cell_type": "markdown", 227 | "id": "99fefbb0", 228 | "metadata": {}, 229 | "source": [ 230 | "### 6. Domain segmentation of the ST data\n", 231 | "\n", 232 | "After the model training, the learned low-dimensional embedding can be accessed through `sf.embedding`.\n", 233 | "\n", 234 | "SpaceFlow will use this learned embedding to identify the spatial domains based on [Leiden](https://www.nature.com/articles/s41598-019-41695-z) algorithm. \n" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": 6, 240 | "id": "b0cb4cd6", 241 | "metadata": {}, 242 | "outputs": [ 243 | { 244 | "name": "stdout", 245 | "output_type": "stream", 246 | "text": [ 247 | "Performing domain segmentation\n", 248 | "Segmentation complete, domain labels of cells or spots saved at ./domains.tsv !\n" 249 | ] 250 | } 251 | ], 252 | "source": [ 253 | "sf.segmentation(domain_label_save_filepath=\"./domains.tsv\", \n", 254 | " n_neighbors=50, \n", 255 | " resolution=1.0)" 256 | ] 257 | }, 258 | { 259 | "cell_type": "markdown", 260 | "id": "361a2f7e", 261 | "metadata": {}, 262 | "source": [ 263 | "Parameters:\n", 264 | "\n", 265 | "- `domain_label_save_filepath`: the file path for saving the identified domain labels. (default: \"./domains.tsv\")\n", 266 | "- `n_neighbors`: the number of the nearest neighbors for each cell for constructing the graph for Leiden using the embedding as input. (default: 50)\n", 267 | "- `resolution`: the resolution of the Leiden clustering, the larger the coarser of the domains. (default: 1.0)\n" 268 | ] 269 | }, 270 | { 271 | "cell_type": "markdown", 272 | "id": "f584534d", 273 | "metadata": {}, 274 | "source": [ 275 | "### 7. Visualization of the identified spatial domains\n", 276 | "\n", 277 | "We next plot the spatial domains using the identified domain labels and spatial coordinates of cells." 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": 7, 283 | "id": "7e4d546d", 284 | "metadata": {}, 285 | "outputs": [ 286 | { 287 | "name": "stdout", 288 | "output_type": "stream", 289 | "text": [ 290 | "Plotting complete, segmentation figure saved at ./domain_segmentation.pdf !\n" 291 | ] 292 | } 293 | ], 294 | "source": [ 295 | "sf.plot_segmentation(segmentation_figure_save_filepath=\"./domain_segmentation.pdf\", \n", 296 | " colormap=\"tab20\", \n", 297 | " scatter_sz=1., \n", 298 | " rsz=4., \n", 299 | " csz=4., \n", 300 | " wspace=.4, \n", 301 | " hspace=.5, \n", 302 | " left=0.125, \n", 303 | " right=0.9, \n", 304 | " bottom=0.1, \n", 305 | " top=0.9)" 306 | ] 307 | }, 308 | { 309 | "cell_type": "markdown", 310 | "id": "a13d92ec", 311 | "metadata": {}, 312 | "source": [ 313 | "Parameters:\n", 314 | "- `segmentation_figure_save_filepath`: optional, type: str, the file path for saving the figure of the spatial domain visualization. (default: \"./domain_segmentation.pdf\")\n", 315 | "- `colormap`: optional, type: str, the colormap of the different domains, full colormap options see [matplotlib](https://matplotlib.org/3.5.1/tutorials/colors/colormaps.html)\n", 316 | "- `scatter_sz`: optional, type: float, the marker size in points. (default: 1.0)\n", 317 | "- `rsz`: optional, type: float, row size of the figure in inches, (default: 4.0)\n", 318 | "- `csz`: optional, type: float, column size of the figure in inches, (default: 4.0)\n", 319 | "- `wspace`: optional, type: float, the amount of width reserved for space between subplots, expressed as a fraction of the average axis width (default: 0.4)\n", 320 | "- `hspace`: optional, type: float,the amount of height reserved for space between subplots, expressed as a fraction of the average axis height (default: 0.4)\n", 321 | "- `left`: optional, type: float, the leftmost position of the subplots of the figure in fraction (default: 0.125)\n", 322 | "- `right`: optional, type: float, the rightmost position of the subplots of the figure in fraction (default: 0.9)\n", 323 | "- `bottom`: optional, type: float, the bottom position of the subplots of the figure in fraction (default: 0.1)\n", 324 | "- `top`: optional, type: float, the top position of the subplots of the figure in fraction (default: 0.9)\n" 325 | ] 326 | }, 327 | { 328 | "cell_type": "markdown", 329 | "id": "1998dd75", 330 | "metadata": {}, 331 | "source": [ 332 | "We can also visualize the expert annotation for comparison by:" 333 | ] 334 | }, 335 | { 336 | "cell_type": "code", 337 | "execution_count": 8, 338 | "id": "c20aa423", 339 | "metadata": {}, 340 | "outputs": [ 341 | { 342 | "data": { 343 | "image/png": "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nPrg3UhXniWDfbzngf+BUgrDtrAL6detYBUREREREXG1uK79XF0OrGyCwA+YbZQwAp9c3MN3DNxGmcBI4N4EmHne0JrFXZbDqxUZF5O1APY4SinGGlky8RiNZpVm0EF+ZoKGk4ekT6lm01d8mtR7V6Fo8tbbwPdsdn/yX/iFn/whiskFlGZG2f9nX8CtNTlcKZJJxenaspETB0+w7mM/hf2/HyB903K6P/gD2PkUmhm9+RcREREREXG1iLYFL5K55hwqCEjrCXQzBkrhuAGO4xNTdVAKPZEicJuY8TRuvYyVyhH4HpVSHdMUdHwqTY18zkY0rV2HpxEYDi2/haMseuwEbr2CEU/htRyUUpRqiuDUKarjUyRvXoStDJJ2mtnDpyisXYqmaygEUUSC1TyibcGIiIiIiKtBJFxFXLdEwlVERERExNUgsrmKiIiIiIiIiLiMRMJVRERERERERMRlJBKuIiIiIiIiIiIuI5FwFRERERERERFxGYmEq4iIiIiIiIiIy0gkXEVEREREREREXEYi4SoiIiIiIiIi4jISCVcREREREREREZeRV8WJqIhMASeu+IkiIl7IIqVU19VuRERERETE64tXRbiKiIiIiIiIiHi9EG0LRkRERERERERcRiLhKiIiIiIiIiLiMhIJVxERERERERERl5FIuIqIiIiIiIiIuIxEwlVERERERERExGUkEq4iIiIiIiIiIi4jkXB1DSIi94rI7fO+/6yI/PgFynxMRH45/Px+EdkrIoGIbLnS7Y2IiIiIiIg4g3G1GxBxTu4FqsATAEqpT15i+T3ADwN/eXmbFREREREREXEhIs3VZUZEkiLybyKyU0T2iMgHRGRIRP5IRHaLyFYRWR7mfYeIPC0i20Xk2yLSIyKLgZ8FfklEdojIXWdppX5GRJ4J6/+yiCTOboNSar9S6uCr2vGIiIiIiIgIIBKurgRvBUaVUjcppdYBD4bpJaXUeuDPgT8N0x4HblVKbQQ+D/xXpdQQ8Eng40qpDUqpx86q/5+VUjcrpW4C9gM/fWW7ExEREREREXEpRMLV5Wc38GYR+UMRuUspVQrTPzfv/23h5wHgmyKyG/gvwNqLqH+diDwWlvnRiywTERERERER8SoRCVeXGaXUIWATbSHr90Tkv50+ND9b+P/PgD8PNVr/AbAv4hSfBn4uLPPbF1kmIiIiIiIi4lUiEq4uMyKyAKgrpT4L/DFtQQvgA/P+Pxl+zgIj4eePzKumAqTPc4o0MCYiJm3NVURERERERMQ1RCRcXX7WA1tFZAfwW8Dvhel5EdkF/ALwS2Hax4AvisizwPS8Ov4VeM9pg/az6v9N4Gng+8CBczVARN4jIsO0tx//TUS++Yp7FREREREREXFRiFLqwrkiXhEiMgRsUUpNXyhvRERERERExGubSHMVEREREREREXEZiTRXERERERERERGXkUhzFRERERERERFxGYmEq4iIiIiIiIiIy0gkXEVEREREREREXEYi4SoiIiIiIiIi4jISCVcREREREREREZeRSLiKiIiIiIiIiLiM/P8l7JGJI73NjQAAAABJRU5ErkJggg==\n", 344 | "text/plain": [ 345 | "
" 346 | ] 347 | }, 348 | "metadata": {}, 349 | "output_type": "display_data" 350 | } 351 | ], 352 | "source": [ 353 | "import scanpy as sc\n", 354 | "sc.pl.spatial(adata, \n", 355 | " color=\"celltype_mapped_refined\",\n", 356 | " spot_size=0.03)" 357 | ] 358 | }, 359 | { 360 | "cell_type": "markdown", 361 | "id": "a85293e6", 362 | "metadata": {}, 363 | "source": [ 364 | "### 8. Idenfify the spatiotemporal patterns of the ST data through pseudo-Spatiotemporal Map (pSM)\n", 365 | "\n", 366 | "Next, we apply the diffusion pseudotime (dpt) algorithm to the learned spatially-consistent embedding to generate a pseudo-Spatiotemporal Map (pSM). This pSM represents a spatially-coherent pseudotime ordering of cells that encodes biological relationships between cells, such as developmental trajectories and cancer progression\n" 367 | ] 368 | }, 369 | { 370 | "cell_type": "code", 371 | "execution_count": 10, 372 | "id": "5bc6ba72", 373 | "metadata": {}, 374 | "outputs": [ 375 | { 376 | "name": "stdout", 377 | "output_type": "stream", 378 | "text": [ 379 | "Performing pseudo-Spatiotemporal Map\n", 380 | "pseudo-Spatiotemporal Map(pSM) calculation complete, pSM values of cells or spots saved at ./pSM_values.tsv!\n" 381 | ] 382 | } 383 | ], 384 | "source": [ 385 | "sf.pseudo_Spatiotemporal_Map(pSM_values_save_filepath=\"./pSM_values.tsv\", \n", 386 | " n_neighbors=20, \n", 387 | " resolution=1.0)" 388 | ] 389 | }, 390 | { 391 | "cell_type": "markdown", 392 | "id": "bff9449d", 393 | "metadata": {}, 394 | "source": [ 395 | "Parameters:\n", 396 | "- `pSM_values_save_filepath` : the file path for saving the inferred pSM values. \n", 397 | "- `n_neighbors`: the number of the nearest neighbors for each cell for constructing the graph for Leiden using the embedding as input. (default: 20) \n", 398 | "- `resolution`: the resolution of the Leiden clustering, the larger the coarser of the domains. (default: 1.0)" 399 | ] 400 | }, 401 | { 402 | "cell_type": "markdown", 403 | "id": "28b22f62", 404 | "metadata": {}, 405 | "source": [ 406 | "### 9. Visualization of the identified pseudo-Spatiotemporal Map (pSM)\n", 407 | "\n", 408 | "We next visualize the identified pseudo-Spatiotemporal Map (pSM).\n" 409 | ] 410 | }, 411 | { 412 | "cell_type": "code", 413 | "execution_count": null, 414 | "id": "63335035", 415 | "metadata": {}, 416 | "outputs": [], 417 | "source": [ 418 | "sf.plot_pSM(pSM_figure_save_filepath=\"./pseudo-Spatiotemporal-Map.pdf\", \n", 419 | " colormap=\"roma\", \n", 420 | " scatter_sz=1., \n", 421 | " rsz=4., \n", 422 | " csz=4., \n", 423 | " wspace=.4, \n", 424 | " hspace=.5, \n", 425 | " left=0.125, \n", 426 | " right=0.9, \n", 427 | " bottom=0.1, \n", 428 | " top=0.9)" 429 | ] 430 | }, 431 | { 432 | "cell_type": "markdown", 433 | "id": "dc3d5432", 434 | "metadata": {}, 435 | "source": [ 436 | "Parameters:\n", 437 | "- `pSM_figure_save_filepath`: optional, type: str, the file path for saving the figure of the pSM visualization. (default: \"./pseudo-Spatiotemporal-Map.pdf\")\n", 438 | "- `colormap`: optional, type: str, the colormap of the pSM (default: 'roma'), full colormap options see [Scientific Colormaps](https://www.fabiocrameri.ch/colourmaps-userguide/)\n", 439 | "- `scatter_sz`:optional, type: float, the marker size in points. (default: 1.0)\n", 440 | "- `rsz`: optional, type: float, row size of the figure in inches, (default: 4.0)\n", 441 | "- `csz`: optional, type: float, column size of the figure in inches, (default: 4.0)\n", 442 | "- `wspace`: optional, type: float, the amount of width reserved for space between subplots, expressed as a fraction of the average axis width (default: 0.4)\n", 443 | "- `hspace`: optional, type: float,the amount of height reserved for space between subplots, expressed as a fraction of the average axis height (default: 0.4)\n", 444 | "- `left`: optional, type: float, the leftmost position of the subplots of the figure in fraction (default: 0.125)\n", 445 | "- `right`: optional, type: float, the rightmost position of the subplots of the figure in fraction (default: 0.9)\n", 446 | "- `bottom`: optional, type: float, the bottom position of the subplots of the figure in fraction (default: 0.1)\n", 447 | "- `top`: optional, type: float, the top position of the subplots of the figure in fraction (default: 0.9)\n" 448 | ] 449 | }, 450 | { 451 | "cell_type": "code", 452 | "execution_count": null, 453 | "id": "fd465665", 454 | "metadata": {}, 455 | "outputs": [], 456 | "source": [] 457 | } 458 | ], 459 | "metadata": { 460 | "kernelspec": { 461 | "display_name": "spaceflow_env", 462 | "language": "python", 463 | "name": "spaceflow_env" 464 | }, 465 | "language_info": { 466 | "codemirror_mode": { 467 | "name": "ipython", 468 | "version": 3 469 | }, 470 | "file_extension": ".py", 471 | "mimetype": "text/x-python", 472 | "name": "python", 473 | "nbconvert_exporter": "python", 474 | "pygments_lexer": "ipython3", 475 | "version": "3.7.13" 476 | } 477 | }, 478 | "nbformat": 4, 479 | "nbformat_minor": 5 480 | } 481 | --------------------------------------------------------------------------------