Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/workflows/build.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,3 +24,18 @@ jobs:
run: uv build
- name: Check package
run: uvx twine check --strict dist/*.whl

docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
submodules: true
fetch-depth: 0
- name: Pull latest notebooks
# Match RTD: render whatever is on notebooks-repo main, not the pinned SHA.
run: git submodule update --init --remote --recursive
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Build docs
run: uvx --with="virtualenv<21" hatch run docs:build
4 changes: 4 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
[submodule "docs/notebooks"]
path = docs/notebooks
url = https://github.com/scverse/spatialdata-plot-notebooks.git
branch = main
10 changes: 10 additions & 0 deletions .readthedocs.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,6 +6,12 @@ build:
python: "3.13"
nodejs: latest
jobs:
post_checkout:
# Always render the latest notebooks-repo main, not the SHA pinned in
# this repo's index. Trade-off: docs at older lib tags are not bit-for-bit
# reproducible for the gallery — a re-build shows whatever the notebooks
# repo's main looked like at build time.
- git submodule update --init --remote --recursive
create_environment:
- asdf plugin add uv
- asdf install uv latest
Expand All@@ -15,3 +21,7 @@ build:
# TODO: remove "--with=virtualenv<21" once hatch is compatible with virtualenv 21+ (pypa/hatch#2193)
- uvx "--with=virtualenv<21" hatch run docs:build
- mv docs/_build $READTHEDOCS_OUTPUT

submodules:
include: all
recursive: false
4 changes: 3 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,8 +30,9 @@ In concordance with the general SpatialData philosophy, all modalities of the ma

For more information on the `spatialdata-plot` library, please refer to the [documentation](https://spatialdata.scverse.org/projects/plot/en/latest/index.html). In particular, the

- [Gallery][link-gallery] — executable example notebooks demonstrating the plotting capabilities.
- [API documentation][link-api].
- [Example notebooks][link-notebooks] (section "Visiualizations")
- [SpatialData example notebooks][link-notebooks] (section "Visualizations") for plotting in the context of broader analyses.

## Installation

Expand DownExpand Up@@ -65,6 +66,7 @@ Marconato, L., Palla, G., Yamauchi, K.A. et al. SpatialData: an open and univers
[issue-tracker]: https://github.com/scverse/spatialdata-plot/issues
[link-docs]: https://spatialdata-plot.readthedocs.io
[link-api]: https://spatialdata.scverse.org/projects/plot/en/stable/api.html
[link-gallery]: https://spatialdata.scverse.org/projects/plot/en/stable/gallery.html
[link-design-doc]: https://spatialdata.scverse.org/en/stable/design_doc.html
[link-notebooks]: https://spatialdata.scverse.org/en/stable/tutorials/notebooks/notebooks.html
[//]: # "numfocus-fiscal-sponsor-attribution"
Expand Down
Binary file addeddocs/_static/gallery/getting_started.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 8 additions & 4 deletions docs/conf.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,6 +56,7 @@
"sphinx.ext.intersphinx",
"sphinx.ext.autosummary",
"sphinx.ext.napoleon",
"sphinx_design",
"sphinxcontrib.bibtex",
"sphinxcontrib.katex",
"sphinx_autodoc_typehints",
Expand DownExpand Up@@ -114,10 +115,13 @@
"Thumbs.db",
".DS_Store",
"**.ipynb_checkpoints",
"tutorials/notebooks/index.md",
"tutorials/notebooks/README.md",
"tutorials/notebooks/references.md",
"tutorials/notebooks/notebooks/paper_reproducibility/*",
# Submodule meta-files: these document the notebooks repo itself, not
# spatialdata-plot, and should not be rendered into our docs.
"notebooks/README.md",
"notebooks/CONTRIBUTING.md",
"notebooks/LICENSE",
"notebooks/.github/**",
"notebooks/pyproject.toml",
]


Expand Down
59 changes: 51 additions & 8 deletions docs/contributing.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,7 @@ This project uses [sphinx][] with the following features:

- The [myst][] extension allows to write documentation in markdown/Markedly Structured Text
- [Numpy-style docstrings][numpydoc] (through the [napoleon][numpydoc-napoleon] extension).
- Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks))
- Jupyter notebooks as tutorials through [myst-nb][] (See [Gallery notebooks (submodule)](#gallery-notebooks-submodule))
- [sphinx-autodoc-typehints][], to automatically reference annotated input and output types
- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/)

Expand All@@ -264,16 +264,48 @@ See scanpy's {doc}`scanpy:dev/documentation` for more information on how to writ
[numpydoc]: https://numpydoc.readthedocs.io/en/latest/format.html
[sphinx-autodoc-typehints]: https://github.com/tox-dev/sphinx-autodoc-typehints

### Tutorials with myst-nb and jupyter notebooks
### Gallery notebooks (submodule)

The documentation is set-up to render jupyter notebooks stored in the `docs/notebooks` directory using [myst-nb][].
Currently, only notebooks in `.ipynb` format are supported that will be included with both their input and output cells.
It is your responsibility to update and re-run the notebook whenever necessary.
The gallery rendered into the docs lives in a separate repository,
[`scverse/spatialdata-plot-notebooks`][notebooks-repo], mounted here as a git
submodule at `docs/notebooks/`. This follows the scverse convention used by
`anndata`, `spatialdata`, `scvi-tools`, and `squidpy`.

If you are interested in automatically running notebooks as part of the continuous integration,
please check out [this feature request][issue-render-notebooks] in the `cookiecutter-scverse` repository.
Notebooks are pre-executed by humans and committed with their outputs; the
docs build performs no execution and pulls no data. A scheduled CI job in the
notebooks repo re-executes every notebook against the latest
`spatialdata-plot` release and fails on output drift.

[issue-render-notebooks]: https://github.com/scverse/cookiecutter-scverse/issues/40
#### Working with the gallery locally

```bash
# First-time clone — pull this repo with submodules
git clone --recurse-submodules https://github.com/scverse/spatialdata-plot.git

# Already cloned without submodules — initialise after the fact
git submodule update --init --recursive

# Pull the latest gallery content from the notebooks repo's main branch
git submodule update --remote docs/notebooks
```

ReadTheDocs is configured (`submodules: include: all` in `.readthedocs.yaml`)
to fetch the submodule on every build, so PR previews always render the
current pinned gallery content.

#### Adding or editing a notebook

Notebook changes are made in the [notebooks repo][notebooks-repo], not here.
See its `CONTRIBUTING.md` for the workflow. After your notebook PR merges
there, open a small follow-up PR in this repo bumping the submodule pin:

```bash
git submodule update --remote docs/notebooks
git add docs/notebooks
git commit -m "Bump notebooks submodule"
```

[notebooks-repo]: https://github.com/scverse/spatialdata-plot-notebooks

#### Hints

Expand All@@ -286,6 +318,17 @@ please check out [this feature request][issue-render-notebooks] in the `cookiecu

### Building the docs locally

:::{important}
The docs include a git submodule (`docs/notebooks` → `spatialdata-plot-notebooks`).
If you cloned this repo without `--recurse-submodules`, initialise it once before building:

```bash
git submodule update --init --recursive
```

Without the submodule, the gallery pages will be missing and sphinx will warn about broken toctree entries.
:::

:::::{tabs}
::::{group-tab} Hatch

Expand Down
43 changes: 43 additions & 0 deletions docs/gallery.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
# Gallery

Curated, runnable examples demonstrating `spatialdata-plot` on real
spatial-omics datasets and on the lightweight `blobs` dataset.

Sources live in
[`scverse/spatialdata-plot-notebooks`](https://github.com/scverse/spatialdata-plot-notebooks);
every notebook is executable end-to-end and re-executed on a weekly schedule
against the latest `spatialdata-plot` release.

## Tutorials

End-to-end workflows on real datasets.

::::{grid} 1 2 2 2
:gutter: 3

:::{grid-item-card} Getting started
:link: notebooks/tutorials/getting_started
:link-type: doc
:img-top: _static/gallery/getting_started.png

The fluent `.pl` API, layering, and styling — on the in-memory `blobs`
dataset. Ideal first read.
:::

::::

## Examples

```{note}
No focused examples yet — contributions welcome! See
[CONTRIBUTING](https://github.com/scverse/spatialdata-plot-notebooks/blob/main/CONTRIBUTING.md)
in the notebooks repo for how to add one.
```

```{toctree}
:hidden:
:maxdepth: 2

notebooks/tutorials/index
notebooks/examples/index
```
3 changes: 2 additions & 1 deletion docs/index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,9 @@

```{toctree}
:hidden: true
:maxdepth: 1
:maxdepth: 2

gallery.md
api.md
changelog.md
contributing.md
Expand Down
1 change: 1 addition & 0 deletions docs/notebooks
Submodule notebooks added at e0ac82
1 change: 1 addition & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,6 +55,7 @@ doc = [
"sphinx-autodoc-typehints",
"sphinx-book-theme>=1",
"sphinx-copybutton",
"sphinx-design",
"sphinx-tabs",
"sphinxcontrib-bibtex>=1",
"sphinxcontrib-katex",
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/workflows/build.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,3 +24,18 @@ jobs:
run: uv build
- name: Check package
run: uvx twine check --strict dist/*.whl

docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
submodules: true
fetch-depth: 0
- name: Pull latest notebooks
# Match RTD: render whatever is on notebooks-repo main, not the pinned SHA.
run: git submodule update --init --remote --recursive
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Build docs
run: uvx --with="virtualenv<21" hatch run docs:build
4 changes: 4 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
[submodule "docs/notebooks"]
path = docs/notebooks
url = https://github.com/scverse/spatialdata-plot-notebooks.git
branch = main
10 changes: 10 additions & 0 deletions .readthedocs.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,6 +6,12 @@ build:
python: "3.13"
nodejs: latest
jobs:
post_checkout:
# Always render the latest notebooks-repo main, not the SHA pinned in
# this repo's index. Trade-off: docs at older lib tags are not bit-for-bit
# reproducible for the gallery — a re-build shows whatever the notebooks
# repo's main looked like at build time.
- git submodule update --init --remote --recursive
create_environment:
- asdf plugin add uv
- asdf install uv latest
Expand All@@ -15,3 +21,7 @@ build:
# TODO: remove "--with=virtualenv<21" once hatch is compatible with virtualenv 21+ (pypa/hatch#2193)
- uvx "--with=virtualenv<21" hatch run docs:build
- mv docs/_build $READTHEDOCS_OUTPUT

submodules:
include: all
recursive: false
4 changes: 3 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,8 +30,9 @@ In concordance with the general SpatialData philosophy, all modalities of the ma

For more information on the `spatialdata-plot` library, please refer to the [documentation](https://spatialdata.scverse.org/projects/plot/en/latest/index.html). In particular, the

- [Gallery][link-gallery] — executable example notebooks demonstrating the plotting capabilities.
- [API documentation][link-api].
- [Example notebooks][link-notebooks] (section "Visiualizations")
- [SpatialData example notebooks][link-notebooks] (section "Visualizations") for plotting in the context of broader analyses.

## Installation

Expand DownExpand Up@@ -65,6 +66,7 @@ Marconato, L., Palla, G., Yamauchi, K.A. et al. SpatialData: an open and univers
[issue-tracker]: https://github.com/scverse/spatialdata-plot/issues
[link-docs]: https://spatialdata-plot.readthedocs.io
[link-api]: https://spatialdata.scverse.org/projects/plot/en/stable/api.html
[link-gallery]: https://spatialdata.scverse.org/projects/plot/en/stable/gallery.html
[link-design-doc]: https://spatialdata.scverse.org/en/stable/design_doc.html
[link-notebooks]: https://spatialdata.scverse.org/en/stable/tutorials/notebooks/notebooks.html
[//]: # "numfocus-fiscal-sponsor-attribution"
Expand Down
Binary file addeddocs/_static/gallery/getting_started.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 8 additions & 4 deletions docs/conf.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,6 +56,7 @@
"sphinx.ext.intersphinx",
"sphinx.ext.autosummary",
"sphinx.ext.napoleon",
"sphinx_design",
"sphinxcontrib.bibtex",
"sphinxcontrib.katex",
"sphinx_autodoc_typehints",
Expand DownExpand Up@@ -114,10 +115,13 @@
"Thumbs.db",
".DS_Store",
"**.ipynb_checkpoints",
"tutorials/notebooks/index.md",
"tutorials/notebooks/README.md",
"tutorials/notebooks/references.md",
"tutorials/notebooks/notebooks/paper_reproducibility/*",
# Submodule meta-files: these document the notebooks repo itself, not
# spatialdata-plot, and should not be rendered into our docs.
"notebooks/README.md",
"notebooks/CONTRIBUTING.md",
"notebooks/LICENSE",
"notebooks/.github/**",
"notebooks/pyproject.toml",
]


Expand Down
59 changes: 51 additions & 8 deletions docs/contributing.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,7 @@ This project uses [sphinx][] with the following features:

- The [myst][] extension allows to write documentation in markdown/Markedly Structured Text
- [Numpy-style docstrings][numpydoc] (through the [napoleon][numpydoc-napoleon] extension).
- Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks))
- Jupyter notebooks as tutorials through [myst-nb][] (See [Gallery notebooks (submodule)](#gallery-notebooks-submodule))
- [sphinx-autodoc-typehints][], to automatically reference annotated input and output types
- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/)

Expand All@@ -264,16 +264,48 @@ See scanpy's {doc}`scanpy:dev/documentation` for more information on how to writ
[numpydoc]: https://numpydoc.readthedocs.io/en/latest/format.html
[sphinx-autodoc-typehints]: https://github.com/tox-dev/sphinx-autodoc-typehints

### Tutorials with myst-nb and jupyter notebooks
### Gallery notebooks (submodule)

The documentation is set-up to render jupyter notebooks stored in the `docs/notebooks` directory using [myst-nb][].
Currently, only notebooks in `.ipynb` format are supported that will be included with both their input and output cells.
It is your responsibility to update and re-run the notebook whenever necessary.
The gallery rendered into the docs lives in a separate repository,
[`scverse/spatialdata-plot-notebooks`][notebooks-repo], mounted here as a git
submodule at `docs/notebooks/`. This follows the scverse convention used by
`anndata`, `spatialdata`, `scvi-tools`, and `squidpy`.

If you are interested in automatically running notebooks as part of the continuous integration,
please check out [this feature request][issue-render-notebooks] in the `cookiecutter-scverse` repository.
Notebooks are pre-executed by humans and committed with their outputs; the
docs build performs no execution and pulls no data. A scheduled CI job in the
notebooks repo re-executes every notebook against the latest
`spatialdata-plot` release and fails on output drift.

[issue-render-notebooks]: https://github.com/scverse/cookiecutter-scverse/issues/40
#### Working with the gallery locally

```bash
# First-time clone — pull this repo with submodules
git clone --recurse-submodules https://github.com/scverse/spatialdata-plot.git

# Already cloned without submodules — initialise after the fact
git submodule update --init --recursive

# Pull the latest gallery content from the notebooks repo's main branch
git submodule update --remote docs/notebooks
```

ReadTheDocs is configured (`submodules: include: all` in `.readthedocs.yaml`)
to fetch the submodule on every build, so PR previews always render the
current pinned gallery content.

#### Adding or editing a notebook

Notebook changes are made in the [notebooks repo][notebooks-repo], not here.
See its `CONTRIBUTING.md` for the workflow. After your notebook PR merges
there, open a small follow-up PR in this repo bumping the submodule pin:

```bash
git submodule update --remote docs/notebooks
git add docs/notebooks
git commit -m "Bump notebooks submodule"
```

[notebooks-repo]: https://github.com/scverse/spatialdata-plot-notebooks

#### Hints

Expand All@@ -286,6 +318,17 @@ please check out [this feature request][issue-render-notebooks] in the `cookiecu

### Building the docs locally

:::{important}
The docs include a git submodule (`docs/notebooks` → `spatialdata-plot-notebooks`).
If you cloned this repo without `--recurse-submodules`, initialise it once before building:

```bash
git submodule update --init --recursive
```

Without the submodule, the gallery pages will be missing and sphinx will warn about broken toctree entries.
:::

:::::{tabs}
::::{group-tab} Hatch

Expand Down
43 changes: 43 additions & 0 deletions docs/gallery.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
# Gallery

Curated, runnable examples demonstrating `spatialdata-plot` on real
spatial-omics datasets and on the lightweight `blobs` dataset.

Sources live in
[`scverse/spatialdata-plot-notebooks`](https://github.com/scverse/spatialdata-plot-notebooks);
every notebook is executable end-to-end and re-executed on a weekly schedule
against the latest `spatialdata-plot` release.

## Tutorials

End-to-end workflows on real datasets.

::::{grid} 1 2 2 2
:gutter: 3

:::{grid-item-card} Getting started
:link: notebooks/tutorials/getting_started
:link-type: doc
:img-top: _static/gallery/getting_started.png

The fluent `.pl` API, layering, and styling — on the in-memory `blobs`
dataset. Ideal first read.
:::

::::

## Examples

```{note}
No focused examples yet — contributions welcome! See
[CONTRIBUTING](https://github.com/scverse/spatialdata-plot-notebooks/blob/main/CONTRIBUTING.md)
in the notebooks repo for how to add one.
```

```{toctree}
:hidden:
:maxdepth: 2

notebooks/tutorials/index
notebooks/examples/index
```
3 changes: 2 additions & 1 deletion docs/index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,9 @@

```{toctree}
:hidden: true
:maxdepth: 1
:maxdepth: 2

gallery.md
api.md
changelog.md
contributing.md
Expand Down
1 change: 1 addition & 0 deletions docs/notebooks
Submodule notebooks added at e0ac82
1 change: 1 addition & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,6 +55,7 @@ doc = [
"sphinx-autodoc-typehints",
"sphinx-book-theme>=1",
"sphinx-copybutton",
"sphinx-design",
"sphinx-tabs",
"sphinxcontrib-bibtex>=1",
"sphinxcontrib-katex",
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/workflows/build.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,3 +24,18 @@ jobs:
run: uv build
- name: Check package
run: uvx twine check --strict dist/*.whl

docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
submodules: true
fetch-depth: 0
- name: Pull latest notebooks
# Match RTD: render whatever is on notebooks-repo main, not the pinned SHA.
run: git submodule update --init --remote --recursive
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Build docs
run: uvx --with="virtualenv<21" hatch run docs:build
4 changes: 4 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
[submodule "docs/notebooks"]
path = docs/notebooks
url = https://github.com/scverse/spatialdata-plot-notebooks.git
branch = main
10 changes: 10 additions & 0 deletions .readthedocs.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,6 +6,12 @@ build:
python: "3.13"
nodejs: latest
jobs:
post_checkout:
# Always render the latest notebooks-repo main, not the SHA pinned in
# this repo's index. Trade-off: docs at older lib tags are not bit-for-bit
# reproducible for the gallery — a re-build shows whatever the notebooks
# repo's main looked like at build time.
- git submodule update --init --remote --recursive
create_environment:
- asdf plugin add uv
- asdf install uv latest
Expand All@@ -15,3 +21,7 @@ build:
# TODO: remove "--with=virtualenv<21" once hatch is compatible with virtualenv 21+ (pypa/hatch#2193)
- uvx "--with=virtualenv<21" hatch run docs:build
- mv docs/_build $READTHEDOCS_OUTPUT

submodules:
include: all
recursive: false
4 changes: 3 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,8 +30,9 @@ In concordance with the general SpatialData philosophy, all modalities of the ma

For more information on the `spatialdata-plot` library, please refer to the [documentation](https://spatialdata.scverse.org/projects/plot/en/latest/index.html). In particular, the

- [Gallery][link-gallery] — executable example notebooks demonstrating the plotting capabilities.
- [API documentation][link-api].
- [Example notebooks][link-notebooks] (section "Visiualizations")
- [SpatialData example notebooks][link-notebooks] (section "Visualizations") for plotting in the context of broader analyses.

## Installation

Expand DownExpand Up@@ -65,6 +66,7 @@ Marconato, L., Palla, G., Yamauchi, K.A. et al. SpatialData: an open and univers
[issue-tracker]: https://github.com/scverse/spatialdata-plot/issues
[link-docs]: https://spatialdata-plot.readthedocs.io
[link-api]: https://spatialdata.scverse.org/projects/plot/en/stable/api.html
[link-gallery]: https://spatialdata.scverse.org/projects/plot/en/stable/gallery.html
[link-design-doc]: https://spatialdata.scverse.org/en/stable/design_doc.html
[link-notebooks]: https://spatialdata.scverse.org/en/stable/tutorials/notebooks/notebooks.html
[//]: # "numfocus-fiscal-sponsor-attribution"
Expand Down
Binary file addeddocs/_static/gallery/getting_started.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 8 additions & 4 deletions docs/conf.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,6 +56,7 @@
"sphinx.ext.intersphinx",
"sphinx.ext.autosummary",
"sphinx.ext.napoleon",
"sphinx_design",
"sphinxcontrib.bibtex",
"sphinxcontrib.katex",
"sphinx_autodoc_typehints",
Expand DownExpand Up@@ -114,10 +115,13 @@
"Thumbs.db",
".DS_Store",
"**.ipynb_checkpoints",
"tutorials/notebooks/index.md",
"tutorials/notebooks/README.md",
"tutorials/notebooks/references.md",
"tutorials/notebooks/notebooks/paper_reproducibility/*",
# Submodule meta-files: these document the notebooks repo itself, not
# spatialdata-plot, and should not be rendered into our docs.
"notebooks/README.md",
"notebooks/CONTRIBUTING.md",
"notebooks/LICENSE",
"notebooks/.github/**",
"notebooks/pyproject.toml",
]


Expand Down
59 changes: 51 additions & 8 deletions docs/contributing.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,7 @@ This project uses [sphinx][] with the following features:

- The [myst][] extension allows to write documentation in markdown/Markedly Structured Text
- [Numpy-style docstrings][numpydoc] (through the [napoleon][numpydoc-napoleon] extension).
- Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks))
- Jupyter notebooks as tutorials through [myst-nb][] (See [Gallery notebooks (submodule)](#gallery-notebooks-submodule))
- [sphinx-autodoc-typehints][], to automatically reference annotated input and output types
- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/)

Expand All@@ -264,16 +264,48 @@ See scanpy's {doc}`scanpy:dev/documentation` for more information on how to writ
[numpydoc]: https://numpydoc.readthedocs.io/en/latest/format.html
[sphinx-autodoc-typehints]: https://github.com/tox-dev/sphinx-autodoc-typehints

### Tutorials with myst-nb and jupyter notebooks
### Gallery notebooks (submodule)

The documentation is set-up to render jupyter notebooks stored in the `docs/notebooks` directory using [myst-nb][].
Currently, only notebooks in `.ipynb` format are supported that will be included with both their input and output cells.
It is your responsibility to update and re-run the notebook whenever necessary.
The gallery rendered into the docs lives in a separate repository,
[`scverse/spatialdata-plot-notebooks`][notebooks-repo], mounted here as a git
submodule at `docs/notebooks/`. This follows the scverse convention used by
`anndata`, `spatialdata`, `scvi-tools`, and `squidpy`.

If you are interested in automatically running notebooks as part of the continuous integration,
please check out [this feature request][issue-render-notebooks] in the `cookiecutter-scverse` repository.
Notebooks are pre-executed by humans and committed with their outputs; the
docs build performs no execution and pulls no data. A scheduled CI job in the
notebooks repo re-executes every notebook against the latest
`spatialdata-plot` release and fails on output drift.

[issue-render-notebooks]: https://github.com/scverse/cookiecutter-scverse/issues/40
#### Working with the gallery locally

```bash
# First-time clone — pull this repo with submodules
git clone --recurse-submodules https://github.com/scverse/spatialdata-plot.git

# Already cloned without submodules — initialise after the fact
git submodule update --init --recursive

# Pull the latest gallery content from the notebooks repo's main branch
git submodule update --remote docs/notebooks
```

ReadTheDocs is configured (`submodules: include: all` in `.readthedocs.yaml`)
to fetch the submodule on every build, so PR previews always render the
current pinned gallery content.

#### Adding or editing a notebook

Notebook changes are made in the [notebooks repo][notebooks-repo], not here.
See its `CONTRIBUTING.md` for the workflow. After your notebook PR merges
there, open a small follow-up PR in this repo bumping the submodule pin:

```bash
git submodule update --remote docs/notebooks
git add docs/notebooks
git commit -m "Bump notebooks submodule"
```

[notebooks-repo]: https://github.com/scverse/spatialdata-plot-notebooks

#### Hints

Expand All@@ -286,6 +318,17 @@ please check out [this feature request][issue-render-notebooks] in the `cookiecu

### Building the docs locally

:::{important}
The docs include a git submodule (`docs/notebooks` → `spatialdata-plot-notebooks`).
If you cloned this repo without `--recurse-submodules`, initialise it once before building:

```bash
git submodule update --init --recursive
```

Without the submodule, the gallery pages will be missing and sphinx will warn about broken toctree entries.
:::

:::::{tabs}
::::{group-tab} Hatch

Expand Down
43 changes: 43 additions & 0 deletions docs/gallery.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
# Gallery

Curated, runnable examples demonstrating `spatialdata-plot` on real
spatial-omics datasets and on the lightweight `blobs` dataset.

Sources live in
[`scverse/spatialdata-plot-notebooks`](https://github.com/scverse/spatialdata-plot-notebooks);
every notebook is executable end-to-end and re-executed on a weekly schedule
against the latest `spatialdata-plot` release.

## Tutorials

End-to-end workflows on real datasets.

::::{grid} 1 2 2 2
:gutter: 3

:::{grid-item-card} Getting started
:link: notebooks/tutorials/getting_started
:link-type: doc
:img-top: _static/gallery/getting_started.png

The fluent `.pl` API, layering, and styling — on the in-memory `blobs`
dataset. Ideal first read.
:::

::::

## Examples

```{note}
No focused examples yet — contributions welcome! See
[CONTRIBUTING](https://github.com/scverse/spatialdata-plot-notebooks/blob/main/CONTRIBUTING.md)
in the notebooks repo for how to add one.
```

```{toctree}
:hidden:
:maxdepth: 2

notebooks/tutorials/index
notebooks/examples/index
```
3 changes: 2 additions & 1 deletion docs/index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,9 @@

```{toctree}
:hidden: true
:maxdepth: 1
:maxdepth: 2

gallery.md
api.md
changelog.md
contributing.md
Expand Down
1 change: 1 addition & 0 deletions docs/notebooks
Submodule notebooks added at e0ac82
1 change: 1 addition & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,6 +55,7 @@ doc = [
"sphinx-autodoc-typehints",
"sphinx-book-theme>=1",
"sphinx-copybutton",
"sphinx-design",
"sphinx-tabs",
"sphinxcontrib-bibtex>=1",
"sphinxcontrib-katex",
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/workflows/build.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,3 +24,18 @@ jobs:
run: uv build
- name: Check package
run: uvx twine check --strict dist/*.whl

docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
submodules: true
fetch-depth: 0
- name: Pull latest notebooks
# Match RTD: render whatever is on notebooks-repo main, not the pinned SHA.
run: git submodule update --init --remote --recursive
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Build docs
run: uvx --with="virtualenv<21" hatch run docs:build
4 changes: 4 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
[submodule "docs/notebooks"]
path = docs/notebooks
url = https://github.com/scverse/spatialdata-plot-notebooks.git
branch = main
10 changes: 10 additions & 0 deletions .readthedocs.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,6 +6,12 @@ build:
python: "3.13"
nodejs: latest
jobs:
post_checkout:
# Always render the latest notebooks-repo main, not the SHA pinned in
# this repo's index. Trade-off: docs at older lib tags are not bit-for-bit
# reproducible for the gallery — a re-build shows whatever the notebooks
# repo's main looked like at build time.
- git submodule update --init --remote --recursive
create_environment:
- asdf plugin add uv
- asdf install uv latest
Expand All@@ -15,3 +21,7 @@ build:
# TODO: remove "--with=virtualenv<21" once hatch is compatible with virtualenv 21+ (pypa/hatch#2193)
- uvx "--with=virtualenv<21" hatch run docs:build
- mv docs/_build $READTHEDOCS_OUTPUT

submodules:
include: all
recursive: false
4 changes: 3 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,8 +30,9 @@ In concordance with the general SpatialData philosophy, all modalities of the ma

For more information on the `spatialdata-plot` library, please refer to the [documentation](https://spatialdata.scverse.org/projects/plot/en/latest/index.html). In particular, the

- [Gallery][link-gallery] — executable example notebooks demonstrating the plotting capabilities.
- [API documentation][link-api].
- [Example notebooks][link-notebooks] (section "Visiualizations")
- [SpatialData example notebooks][link-notebooks] (section "Visualizations") for plotting in the context of broader analyses.

## Installation

Expand DownExpand Up@@ -65,6 +66,7 @@ Marconato, L., Palla, G., Yamauchi, K.A. et al. SpatialData: an open and univers
[issue-tracker]: https://github.com/scverse/spatialdata-plot/issues
[link-docs]: https://spatialdata-plot.readthedocs.io
[link-api]: https://spatialdata.scverse.org/projects/plot/en/stable/api.html
[link-gallery]: https://spatialdata.scverse.org/projects/plot/en/stable/gallery.html
[link-design-doc]: https://spatialdata.scverse.org/en/stable/design_doc.html
[link-notebooks]: https://spatialdata.scverse.org/en/stable/tutorials/notebooks/notebooks.html
[//]: # "numfocus-fiscal-sponsor-attribution"
Expand Down
Binary file addeddocs/_static/gallery/getting_started.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 8 additions & 4 deletions docs/conf.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,6 +56,7 @@
"sphinx.ext.intersphinx",
"sphinx.ext.autosummary",
"sphinx.ext.napoleon",
"sphinx_design",
"sphinxcontrib.bibtex",
"sphinxcontrib.katex",
"sphinx_autodoc_typehints",
Expand DownExpand Up@@ -114,10 +115,13 @@
"Thumbs.db",
".DS_Store",
"**.ipynb_checkpoints",
"tutorials/notebooks/index.md",
"tutorials/notebooks/README.md",
"tutorials/notebooks/references.md",
"tutorials/notebooks/notebooks/paper_reproducibility/*",
# Submodule meta-files: these document the notebooks repo itself, not
# spatialdata-plot, and should not be rendered into our docs.
"notebooks/README.md",
"notebooks/CONTRIBUTING.md",
"notebooks/LICENSE",
"notebooks/.github/**",
"notebooks/pyproject.toml",
]


Expand Down
59 changes: 51 additions & 8 deletions docs/contributing.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,7 @@ This project uses [sphinx][] with the following features:

- The [myst][] extension allows to write documentation in markdown/Markedly Structured Text
- [Numpy-style docstrings][numpydoc] (through the [napoleon][numpydoc-napoleon] extension).
- Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks))
- Jupyter notebooks as tutorials through [myst-nb][] (See [Gallery notebooks (submodule)](#gallery-notebooks-submodule))
- [sphinx-autodoc-typehints][], to automatically reference annotated input and output types
- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/)

Expand All@@ -264,16 +264,48 @@ See scanpy's {doc}`scanpy:dev/documentation` for more information on how to writ
[numpydoc]: https://numpydoc.readthedocs.io/en/latest/format.html
[sphinx-autodoc-typehints]: https://github.com/tox-dev/sphinx-autodoc-typehints

### Tutorials with myst-nb and jupyter notebooks
### Gallery notebooks (submodule)

The documentation is set-up to render jupyter notebooks stored in the `docs/notebooks` directory using [myst-nb][].
Currently, only notebooks in `.ipynb` format are supported that will be included with both their input and output cells.
It is your responsibility to update and re-run the notebook whenever necessary.
The gallery rendered into the docs lives in a separate repository,
[`scverse/spatialdata-plot-notebooks`][notebooks-repo], mounted here as a git
submodule at `docs/notebooks/`. This follows the scverse convention used by
`anndata`, `spatialdata`, `scvi-tools`, and `squidpy`.

If you are interested in automatically running notebooks as part of the continuous integration,
please check out [this feature request][issue-render-notebooks] in the `cookiecutter-scverse` repository.
Notebooks are pre-executed by humans and committed with their outputs; the
docs build performs no execution and pulls no data. A scheduled CI job in the
notebooks repo re-executes every notebook against the latest
`spatialdata-plot` release and fails on output drift.

[issue-render-notebooks]: https://github.com/scverse/cookiecutter-scverse/issues/40
#### Working with the gallery locally

```bash
# First-time clone — pull this repo with submodules
git clone --recurse-submodules https://github.com/scverse/spatialdata-plot.git

# Already cloned without submodules — initialise after the fact
git submodule update --init --recursive

# Pull the latest gallery content from the notebooks repo's main branch
git submodule update --remote docs/notebooks
```

ReadTheDocs is configured (`submodules: include: all` in `.readthedocs.yaml`)
to fetch the submodule on every build, so PR previews always render the
current pinned gallery content.

#### Adding or editing a notebook

Notebook changes are made in the [notebooks repo][notebooks-repo], not here.
See its `CONTRIBUTING.md` for the workflow. After your notebook PR merges
there, open a small follow-up PR in this repo bumping the submodule pin:

```bash
git submodule update --remote docs/notebooks
git add docs/notebooks
git commit -m "Bump notebooks submodule"
```

[notebooks-repo]: https://github.com/scverse/spatialdata-plot-notebooks

#### Hints

Expand All@@ -286,6 +318,17 @@ please check out [this feature request][issue-render-notebooks] in the `cookiecu

### Building the docs locally

:::{important}
The docs include a git submodule (`docs/notebooks` → `spatialdata-plot-notebooks`).
If you cloned this repo without `--recurse-submodules`, initialise it once before building:

```bash
git submodule update --init --recursive
```

Without the submodule, the gallery pages will be missing and sphinx will warn about broken toctree entries.
:::

:::::{tabs}
::::{group-tab} Hatch

Expand Down
43 changes: 43 additions & 0 deletions docs/gallery.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
# Gallery

Curated, runnable examples demonstrating `spatialdata-plot` on real
spatial-omics datasets and on the lightweight `blobs` dataset.

Sources live in
[`scverse/spatialdata-plot-notebooks`](https://github.com/scverse/spatialdata-plot-notebooks);
every notebook is executable end-to-end and re-executed on a weekly schedule
against the latest `spatialdata-plot` release.

## Tutorials

End-to-end workflows on real datasets.

::::{grid} 1 2 2 2
:gutter: 3

:::{grid-item-card} Getting started
:link: notebooks/tutorials/getting_started
:link-type: doc
:img-top: _static/gallery/getting_started.png

The fluent `.pl` API, layering, and styling — on the in-memory `blobs`
dataset. Ideal first read.
:::

::::

## Examples

```{note}
No focused examples yet — contributions welcome! See
[CONTRIBUTING](https://github.com/scverse/spatialdata-plot-notebooks/blob/main/CONTRIBUTING.md)
in the notebooks repo for how to add one.
```

```{toctree}
:hidden:
:maxdepth: 2

notebooks/tutorials/index
notebooks/examples/index
```
3 changes: 2 additions & 1 deletion docs/index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,9 @@

```{toctree}
:hidden: true
:maxdepth: 1
:maxdepth: 2

gallery.md
api.md
changelog.md
contributing.md
Expand Down
1 change: 1 addition & 0 deletions docs/notebooks
Submodule notebooks added at e0ac82
1 change: 1 addition & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,6 +55,7 @@ doc = [
"sphinx-autodoc-typehints",
"sphinx-book-theme>=1",
"sphinx-copybutton",
"sphinx-design",
"sphinx-tabs",
"sphinxcontrib-bibtex>=1",
"sphinxcontrib-katex",
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/workflows/build.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,3 +24,18 @@ jobs:
run: uv build
- name: Check package
run: uvx twine check --strict dist/*.whl

docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
submodules: true
fetch-depth: 0
- name: Pull latest notebooks
# Match RTD: render whatever is on notebooks-repo main, not the pinned SHA.
run: git submodule update --init --remote --recursive
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Build docs
run: uvx --with="virtualenv<21" hatch run docs:build
4 changes: 4 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
[submodule "docs/notebooks"]
path = docs/notebooks
url = https://github.com/scverse/spatialdata-plot-notebooks.git
branch = main
10 changes: 10 additions & 0 deletions .readthedocs.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,6 +6,12 @@ build:
python: "3.13"
nodejs: latest
jobs:
post_checkout:
# Always render the latest notebooks-repo main, not the SHA pinned in
# this repo's index. Trade-off: docs at older lib tags are not bit-for-bit
# reproducible for the gallery — a re-build shows whatever the notebooks
# repo's main looked like at build time.
- git submodule update --init --remote --recursive
create_environment:
- asdf plugin add uv
- asdf install uv latest
Expand All@@ -15,3 +21,7 @@ build:
# TODO: remove "--with=virtualenv<21" once hatch is compatible with virtualenv 21+ (pypa/hatch#2193)
- uvx "--with=virtualenv<21" hatch run docs:build
- mv docs/_build $READTHEDOCS_OUTPUT

submodules:
include: all
recursive: false
4 changes: 3 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,8 +30,9 @@ In concordance with the general SpatialData philosophy, all modalities of the ma

For more information on the `spatialdata-plot` library, please refer to the [documentation](https://spatialdata.scverse.org/projects/plot/en/latest/index.html). In particular, the

- [Gallery][link-gallery] — executable example notebooks demonstrating the plotting capabilities.
- [API documentation][link-api].
- [Example notebooks][link-notebooks] (section "Visiualizations")
- [SpatialData example notebooks][link-notebooks] (section "Visualizations") for plotting in the context of broader analyses.

## Installation

Expand DownExpand Up@@ -65,6 +66,7 @@ Marconato, L., Palla, G., Yamauchi, K.A. et al. SpatialData: an open and univers
[issue-tracker]: https://github.com/scverse/spatialdata-plot/issues
[link-docs]: https://spatialdata-plot.readthedocs.io
[link-api]: https://spatialdata.scverse.org/projects/plot/en/stable/api.html
[link-gallery]: https://spatialdata.scverse.org/projects/plot/en/stable/gallery.html
[link-design-doc]: https://spatialdata.scverse.org/en/stable/design_doc.html
[link-notebooks]: https://spatialdata.scverse.org/en/stable/tutorials/notebooks/notebooks.html
[//]: # "numfocus-fiscal-sponsor-attribution"
Expand Down
Binary file addeddocs/_static/gallery/getting_started.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 8 additions & 4 deletions docs/conf.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,6 +56,7 @@
"sphinx.ext.intersphinx",
"sphinx.ext.autosummary",
"sphinx.ext.napoleon",
"sphinx_design",
"sphinxcontrib.bibtex",
"sphinxcontrib.katex",
"sphinx_autodoc_typehints",
Expand DownExpand Up@@ -114,10 +115,13 @@
"Thumbs.db",
".DS_Store",
"**.ipynb_checkpoints",
"tutorials/notebooks/index.md",
"tutorials/notebooks/README.md",
"tutorials/notebooks/references.md",
"tutorials/notebooks/notebooks/paper_reproducibility/*",
# Submodule meta-files: these document the notebooks repo itself, not
# spatialdata-plot, and should not be rendered into our docs.
"notebooks/README.md",
"notebooks/CONTRIBUTING.md",
"notebooks/LICENSE",
"notebooks/.github/**",
"notebooks/pyproject.toml",
]


Expand Down
59 changes: 51 additions & 8 deletions docs/contributing.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,7 @@ This project uses [sphinx][] with the following features:

- The [myst][] extension allows to write documentation in markdown/Markedly Structured Text
- [Numpy-style docstrings][numpydoc] (through the [napoleon][numpydoc-napoleon] extension).
- Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks))
- Jupyter notebooks as tutorials through [myst-nb][] (See [Gallery notebooks (submodule)](#gallery-notebooks-submodule))
- [sphinx-autodoc-typehints][], to automatically reference annotated input and output types
- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/)

Expand All@@ -264,16 +264,48 @@ See scanpy's {doc}`scanpy:dev/documentation` for more information on how to writ
[numpydoc]: https://numpydoc.readthedocs.io/en/latest/format.html
[sphinx-autodoc-typehints]: https://github.com/tox-dev/sphinx-autodoc-typehints

### Tutorials with myst-nb and jupyter notebooks
### Gallery notebooks (submodule)

The documentation is set-up to render jupyter notebooks stored in the `docs/notebooks` directory using [myst-nb][].
Currently, only notebooks in `.ipynb` format are supported that will be included with both their input and output cells.
It is your responsibility to update and re-run the notebook whenever necessary.
The gallery rendered into the docs lives in a separate repository,
[`scverse/spatialdata-plot-notebooks`][notebooks-repo], mounted here as a git
submodule at `docs/notebooks/`. This follows the scverse convention used by
`anndata`, `spatialdata`, `scvi-tools`, and `squidpy`.

If you are interested in automatically running notebooks as part of the continuous integration,
please check out [this feature request][issue-render-notebooks] in the `cookiecutter-scverse` repository.
Notebooks are pre-executed by humans and committed with their outputs; the
docs build performs no execution and pulls no data. A scheduled CI job in the
notebooks repo re-executes every notebook against the latest
`spatialdata-plot` release and fails on output drift.

[issue-render-notebooks]: https://github.com/scverse/cookiecutter-scverse/issues/40
#### Working with the gallery locally

```bash
# First-time clone — pull this repo with submodules
git clone --recurse-submodules https://github.com/scverse/spatialdata-plot.git

# Already cloned without submodules — initialise after the fact
git submodule update --init --recursive

# Pull the latest gallery content from the notebooks repo's main branch
git submodule update --remote docs/notebooks
```

ReadTheDocs is configured (`submodules: include: all` in `.readthedocs.yaml`)
to fetch the submodule on every build, so PR previews always render the
current pinned gallery content.

#### Adding or editing a notebook

Notebook changes are made in the [notebooks repo][notebooks-repo], not here.
See its `CONTRIBUTING.md` for the workflow. After your notebook PR merges
there, open a small follow-up PR in this repo bumping the submodule pin:

```bash
git submodule update --remote docs/notebooks
git add docs/notebooks
git commit -m "Bump notebooks submodule"
```

[notebooks-repo]: https://github.com/scverse/spatialdata-plot-notebooks

#### Hints

Expand All@@ -286,6 +318,17 @@ please check out [this feature request][issue-render-notebooks] in the `cookiecu

### Building the docs locally

:::{important}
The docs include a git submodule (`docs/notebooks` → `spatialdata-plot-notebooks`).
If you cloned this repo without `--recurse-submodules`, initialise it once before building:

```bash
git submodule update --init --recursive
```

Without the submodule, the gallery pages will be missing and sphinx will warn about broken toctree entries.
:::

:::::{tabs}
::::{group-tab} Hatch

Expand Down
43 changes: 43 additions & 0 deletions docs/gallery.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
# Gallery

Curated, runnable examples demonstrating `spatialdata-plot` on real
spatial-omics datasets and on the lightweight `blobs` dataset.

Sources live in
[`scverse/spatialdata-plot-notebooks`](https://github.com/scverse/spatialdata-plot-notebooks);
every notebook is executable end-to-end and re-executed on a weekly schedule
against the latest `spatialdata-plot` release.

## Tutorials

End-to-end workflows on real datasets.

::::{grid} 1 2 2 2
:gutter: 3

:::{grid-item-card} Getting started
:link: notebooks/tutorials/getting_started
:link-type: doc
:img-top: _static/gallery/getting_started.png

The fluent `.pl` API, layering, and styling — on the in-memory `blobs`
dataset. Ideal first read.
:::

::::

## Examples

```{note}
No focused examples yet — contributions welcome! See
[CONTRIBUTING](https://github.com/scverse/spatialdata-plot-notebooks/blob/main/CONTRIBUTING.md)
in the notebooks repo for how to add one.
```

```{toctree}
:hidden:
:maxdepth: 2

notebooks/tutorials/index
notebooks/examples/index
```
3 changes: 2 additions & 1 deletion docs/index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,9 @@

```{toctree}
:hidden: true
:maxdepth: 1
:maxdepth: 2

gallery.md
api.md
changelog.md
contributing.md
Expand Down
1 change: 1 addition & 0 deletions docs/notebooks
Submodule notebooks added at e0ac82
1 change: 1 addition & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,6 +55,7 @@ doc = [
"sphinx-autodoc-typehints",
"sphinx-book-theme>=1",
"sphinx-copybutton",
"sphinx-design",
"sphinx-tabs",
"sphinxcontrib-bibtex>=1",
"sphinxcontrib-katex",
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/workflows/build.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,3 +24,18 @@ jobs:
run: uv build
- name: Check package
run: uvx twine check --strict dist/*.whl

docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
submodules: true
fetch-depth: 0
- name: Pull latest notebooks
# Match RTD: render whatever is on notebooks-repo main, not the pinned SHA.
run: git submodule update --init --remote --recursive
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Build docs
run: uvx --with="virtualenv<21" hatch run docs:build
4 changes: 4 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
[submodule "docs/notebooks"]
path = docs/notebooks
url = https://github.com/scverse/spatialdata-plot-notebooks.git
branch = main
10 changes: 10 additions & 0 deletions .readthedocs.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,6 +6,12 @@ build:
python: "3.13"
nodejs: latest
jobs:
post_checkout:
# Always render the latest notebooks-repo main, not the SHA pinned in
# this repo's index. Trade-off: docs at older lib tags are not bit-for-bit
# reproducible for the gallery — a re-build shows whatever the notebooks
# repo's main looked like at build time.
- git submodule update --init --remote --recursive
create_environment:
- asdf plugin add uv
- asdf install uv latest
Expand All@@ -15,3 +21,7 @@ build:
# TODO: remove "--with=virtualenv<21" once hatch is compatible with virtualenv 21+ (pypa/hatch#2193)
- uvx "--with=virtualenv<21" hatch run docs:build
- mv docs/_build $READTHEDOCS_OUTPUT

submodules:
include: all
recursive: false
4 changes: 3 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,8 +30,9 @@ In concordance with the general SpatialData philosophy, all modalities of the ma

For more information on the `spatialdata-plot` library, please refer to the [documentation](https://spatialdata.scverse.org/projects/plot/en/latest/index.html). In particular, the

- [Gallery][link-gallery] — executable example notebooks demonstrating the plotting capabilities.
- [API documentation][link-api].
- [Example notebooks][link-notebooks] (section "Visiualizations")
- [SpatialData example notebooks][link-notebooks] (section "Visualizations") for plotting in the context of broader analyses.

## Installation

Expand DownExpand Up@@ -65,6 +66,7 @@ Marconato, L., Palla, G., Yamauchi, K.A. et al. SpatialData: an open and univers
[issue-tracker]: https://github.com/scverse/spatialdata-plot/issues
[link-docs]: https://spatialdata-plot.readthedocs.io
[link-api]: https://spatialdata.scverse.org/projects/plot/en/stable/api.html
[link-gallery]: https://spatialdata.scverse.org/projects/plot/en/stable/gallery.html
[link-design-doc]: https://spatialdata.scverse.org/en/stable/design_doc.html
[link-notebooks]: https://spatialdata.scverse.org/en/stable/tutorials/notebooks/notebooks.html
[//]: # "numfocus-fiscal-sponsor-attribution"
Expand Down
Binary file addeddocs/_static/gallery/getting_started.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 8 additions & 4 deletions docs/conf.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,6 +56,7 @@
"sphinx.ext.intersphinx",
"sphinx.ext.autosummary",
"sphinx.ext.napoleon",
"sphinx_design",
"sphinxcontrib.bibtex",
"sphinxcontrib.katex",
"sphinx_autodoc_typehints",
Expand DownExpand Up@@ -114,10 +115,13 @@
"Thumbs.db",
".DS_Store",
"**.ipynb_checkpoints",
"tutorials/notebooks/index.md",
"tutorials/notebooks/README.md",
"tutorials/notebooks/references.md",
"tutorials/notebooks/notebooks/paper_reproducibility/*",
# Submodule meta-files: these document the notebooks repo itself, not
# spatialdata-plot, and should not be rendered into our docs.
"notebooks/README.md",
"notebooks/CONTRIBUTING.md",
"notebooks/LICENSE",
"notebooks/.github/**",
"notebooks/pyproject.toml",
]


Expand Down
59 changes: 51 additions & 8 deletions docs/contributing.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,7 @@ This project uses [sphinx][] with the following features:

- The [myst][] extension allows to write documentation in markdown/Markedly Structured Text
- [Numpy-style docstrings][numpydoc] (through the [napoleon][numpydoc-napoleon] extension).
- Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks))
- Jupyter notebooks as tutorials through [myst-nb][] (See [Gallery notebooks (submodule)](#gallery-notebooks-submodule))
- [sphinx-autodoc-typehints][], to automatically reference annotated input and output types
- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/)

Expand All@@ -264,16 +264,48 @@ See scanpy's {doc}`scanpy:dev/documentation` for more information on how to writ
[numpydoc]: https://numpydoc.readthedocs.io/en/latest/format.html
[sphinx-autodoc-typehints]: https://github.com/tox-dev/sphinx-autodoc-typehints

### Tutorials with myst-nb and jupyter notebooks
### Gallery notebooks (submodule)

The documentation is set-up to render jupyter notebooks stored in the `docs/notebooks` directory using [myst-nb][].
Currently, only notebooks in `.ipynb` format are supported that will be included with both their input and output cells.
It is your responsibility to update and re-run the notebook whenever necessary.
The gallery rendered into the docs lives in a separate repository,
[`scverse/spatialdata-plot-notebooks`][notebooks-repo], mounted here as a git
submodule at `docs/notebooks/`. This follows the scverse convention used by
`anndata`, `spatialdata`, `scvi-tools`, and `squidpy`.

If you are interested in automatically running notebooks as part of the continuous integration,
please check out [this feature request][issue-render-notebooks] in the `cookiecutter-scverse` repository.
Notebooks are pre-executed by humans and committed with their outputs; the
docs build performs no execution and pulls no data. A scheduled CI job in the
notebooks repo re-executes every notebook against the latest
`spatialdata-plot` release and fails on output drift.

[issue-render-notebooks]: https://github.com/scverse/cookiecutter-scverse/issues/40
#### Working with the gallery locally

```bash
# First-time clone — pull this repo with submodules
git clone --recurse-submodules https://github.com/scverse/spatialdata-plot.git

# Already cloned without submodules — initialise after the fact
git submodule update --init --recursive

# Pull the latest gallery content from the notebooks repo's main branch
git submodule update --remote docs/notebooks
```

ReadTheDocs is configured (`submodules: include: all` in `.readthedocs.yaml`)
to fetch the submodule on every build, so PR previews always render the
current pinned gallery content.

#### Adding or editing a notebook

Notebook changes are made in the [notebooks repo][notebooks-repo], not here.
See its `CONTRIBUTING.md` for the workflow. After your notebook PR merges
there, open a small follow-up PR in this repo bumping the submodule pin:

```bash
git submodule update --remote docs/notebooks
git add docs/notebooks
git commit -m "Bump notebooks submodule"
```

[notebooks-repo]: https://github.com/scverse/spatialdata-plot-notebooks

#### Hints

Expand All@@ -286,6 +318,17 @@ please check out [this feature request][issue-render-notebooks] in the `cookiecu

### Building the docs locally

:::{important}
The docs include a git submodule (`docs/notebooks` → `spatialdata-plot-notebooks`).
If you cloned this repo without `--recurse-submodules`, initialise it once before building:

```bash
git submodule update --init --recursive
```

Without the submodule, the gallery pages will be missing and sphinx will warn about broken toctree entries.
:::

:::::{tabs}
::::{group-tab} Hatch

Expand Down
43 changes: 43 additions & 0 deletions docs/gallery.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
# Gallery

Curated, runnable examples demonstrating `spatialdata-plot` on real
spatial-omics datasets and on the lightweight `blobs` dataset.

Sources live in
[`scverse/spatialdata-plot-notebooks`](https://github.com/scverse/spatialdata-plot-notebooks);
every notebook is executable end-to-end and re-executed on a weekly schedule
against the latest `spatialdata-plot` release.

## Tutorials

End-to-end workflows on real datasets.

::::{grid} 1 2 2 2
:gutter: 3

:::{grid-item-card} Getting started
:link: notebooks/tutorials/getting_started
:link-type: doc
:img-top: _static/gallery/getting_started.png

The fluent `.pl` API, layering, and styling — on the in-memory `blobs`
dataset. Ideal first read.
:::

::::

## Examples

```{note}
No focused examples yet — contributions welcome! See
[CONTRIBUTING](https://github.com/scverse/spatialdata-plot-notebooks/blob/main/CONTRIBUTING.md)
in the notebooks repo for how to add one.
```

```{toctree}
:hidden:
:maxdepth: 2

notebooks/tutorials/index
notebooks/examples/index
```
3 changes: 2 additions & 1 deletion docs/index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,9 @@

```{toctree}
:hidden: true
:maxdepth: 1
:maxdepth: 2

gallery.md
api.md
changelog.md
contributing.md
Expand Down
1 change: 1 addition & 0 deletions docs/notebooks
Submodule notebooks added at e0ac82
1 change: 1 addition & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,6 +55,7 @@ doc = [
"sphinx-autodoc-typehints",
"sphinx-book-theme>=1",
"sphinx-copybutton",
"sphinx-design",
"sphinx-tabs",
"sphinxcontrib-bibtex>=1",
"sphinxcontrib-katex",
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/workflows/build.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,3 +24,18 @@ jobs:
run: uv build
- name: Check package
run: uvx twine check --strict dist/*.whl

docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
submodules: true
fetch-depth: 0
- name: Pull latest notebooks
# Match RTD: render whatever is on notebooks-repo main, not the pinned SHA.
run: git submodule update --init --remote --recursive
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Build docs
run: uvx --with="virtualenv<21" hatch run docs:build
4 changes: 4 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
[submodule "docs/notebooks"]
path = docs/notebooks
url = https://github.com/scverse/spatialdata-plot-notebooks.git
branch = main
10 changes: 10 additions & 0 deletions .readthedocs.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,6 +6,12 @@ build:
python: "3.13"
nodejs: latest
jobs:
post_checkout:
# Always render the latest notebooks-repo main, not the SHA pinned in
# this repo's index. Trade-off: docs at older lib tags are not bit-for-bit
# reproducible for the gallery — a re-build shows whatever the notebooks
# repo's main looked like at build time.
- git submodule update --init --remote --recursive
create_environment:
- asdf plugin add uv
- asdf install uv latest
Expand All@@ -15,3 +21,7 @@ build:
# TODO: remove "--with=virtualenv<21" once hatch is compatible with virtualenv 21+ (pypa/hatch#2193)
- uvx "--with=virtualenv<21" hatch run docs:build
- mv docs/_build $READTHEDOCS_OUTPUT

submodules:
include: all
recursive: false
4 changes: 3 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,8 +30,9 @@ In concordance with the general SpatialData philosophy, all modalities of the ma

For more information on the `spatialdata-plot` library, please refer to the [documentation](https://spatialdata.scverse.org/projects/plot/en/latest/index.html). In particular, the

- [Gallery][link-gallery] — executable example notebooks demonstrating the plotting capabilities.
- [API documentation][link-api].
- [Example notebooks][link-notebooks] (section "Visiualizations")
- [SpatialData example notebooks][link-notebooks] (section "Visualizations") for plotting in the context of broader analyses.

## Installation

Expand DownExpand Up@@ -65,6 +66,7 @@ Marconato, L., Palla, G., Yamauchi, K.A. et al. SpatialData: an open and univers
[issue-tracker]: https://github.com/scverse/spatialdata-plot/issues
[link-docs]: https://spatialdata-plot.readthedocs.io
[link-api]: https://spatialdata.scverse.org/projects/plot/en/stable/api.html
[link-gallery]: https://spatialdata.scverse.org/projects/plot/en/stable/gallery.html
[link-design-doc]: https://spatialdata.scverse.org/en/stable/design_doc.html
[link-notebooks]: https://spatialdata.scverse.org/en/stable/tutorials/notebooks/notebooks.html
[//]: # "numfocus-fiscal-sponsor-attribution"
Expand Down
Binary file addeddocs/_static/gallery/getting_started.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 8 additions & 4 deletions docs/conf.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,6 +56,7 @@
"sphinx.ext.intersphinx",
"sphinx.ext.autosummary",
"sphinx.ext.napoleon",
"sphinx_design",
"sphinxcontrib.bibtex",
"sphinxcontrib.katex",
"sphinx_autodoc_typehints",
Expand DownExpand Up@@ -114,10 +115,13 @@
"Thumbs.db",
".DS_Store",
"**.ipynb_checkpoints",
"tutorials/notebooks/index.md",
"tutorials/notebooks/README.md",
"tutorials/notebooks/references.md",
"tutorials/notebooks/notebooks/paper_reproducibility/*",
# Submodule meta-files: these document the notebooks repo itself, not
# spatialdata-plot, and should not be rendered into our docs.
"notebooks/README.md",
"notebooks/CONTRIBUTING.md",
"notebooks/LICENSE",
"notebooks/.github/**",
"notebooks/pyproject.toml",
]


Expand Down
59 changes: 51 additions & 8 deletions docs/contributing.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,7 @@ This project uses [sphinx][] with the following features:

- The [myst][] extension allows to write documentation in markdown/Markedly Structured Text
- [Numpy-style docstrings][numpydoc] (through the [napoleon][numpydoc-napoleon] extension).
- Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks))
- Jupyter notebooks as tutorials through [myst-nb][] (See [Gallery notebooks (submodule)](#gallery-notebooks-submodule))
- [sphinx-autodoc-typehints][], to automatically reference annotated input and output types
- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/)

Expand All@@ -264,16 +264,48 @@ See scanpy's {doc}`scanpy:dev/documentation` for more information on how to writ
[numpydoc]: https://numpydoc.readthedocs.io/en/latest/format.html
[sphinx-autodoc-typehints]: https://github.com/tox-dev/sphinx-autodoc-typehints

### Tutorials with myst-nb and jupyter notebooks
### Gallery notebooks (submodule)

The documentation is set-up to render jupyter notebooks stored in the `docs/notebooks` directory using [myst-nb][].
Currently, only notebooks in `.ipynb` format are supported that will be included with both their input and output cells.
It is your responsibility to update and re-run the notebook whenever necessary.
The gallery rendered into the docs lives in a separate repository,
[`scverse/spatialdata-plot-notebooks`][notebooks-repo], mounted here as a git
submodule at `docs/notebooks/`. This follows the scverse convention used by
`anndata`, `spatialdata`, `scvi-tools`, and `squidpy`.

If you are interested in automatically running notebooks as part of the continuous integration,
please check out [this feature request][issue-render-notebooks] in the `cookiecutter-scverse` repository.
Notebooks are pre-executed by humans and committed with their outputs; the
docs build performs no execution and pulls no data. A scheduled CI job in the
notebooks repo re-executes every notebook against the latest
`spatialdata-plot` release and fails on output drift.

[issue-render-notebooks]: https://github.com/scverse/cookiecutter-scverse/issues/40
#### Working with the gallery locally

```bash
# First-time clone — pull this repo with submodules
git clone --recurse-submodules https://github.com/scverse/spatialdata-plot.git

# Already cloned without submodules — initialise after the fact
git submodule update --init --recursive

# Pull the latest gallery content from the notebooks repo's main branch
git submodule update --remote docs/notebooks
```

ReadTheDocs is configured (`submodules: include: all` in `.readthedocs.yaml`)
to fetch the submodule on every build, so PR previews always render the
current pinned gallery content.

#### Adding or editing a notebook

Notebook changes are made in the [notebooks repo][notebooks-repo], not here.
See its `CONTRIBUTING.md` for the workflow. After your notebook PR merges
there, open a small follow-up PR in this repo bumping the submodule pin:

```bash
git submodule update --remote docs/notebooks
git add docs/notebooks
git commit -m "Bump notebooks submodule"
```

[notebooks-repo]: https://github.com/scverse/spatialdata-plot-notebooks

#### Hints

Expand All@@ -286,6 +318,17 @@ please check out [this feature request][issue-render-notebooks] in the `cookiecu

### Building the docs locally

:::{important}
The docs include a git submodule (`docs/notebooks` → `spatialdata-plot-notebooks`).
If you cloned this repo without `--recurse-submodules`, initialise it once before building:

```bash
git submodule update --init --recursive
```

Without the submodule, the gallery pages will be missing and sphinx will warn about broken toctree entries.
:::

:::::{tabs}
::::{group-tab} Hatch

Expand Down
43 changes: 43 additions & 0 deletions docs/gallery.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
# Gallery

Curated, runnable examples demonstrating `spatialdata-plot` on real
spatial-omics datasets and on the lightweight `blobs` dataset.

Sources live in
[`scverse/spatialdata-plot-notebooks`](https://github.com/scverse/spatialdata-plot-notebooks);
every notebook is executable end-to-end and re-executed on a weekly schedule
against the latest `spatialdata-plot` release.

## Tutorials

End-to-end workflows on real datasets.

::::{grid} 1 2 2 2
:gutter: 3

:::{grid-item-card} Getting started
:link: notebooks/tutorials/getting_started
:link-type: doc
:img-top: _static/gallery/getting_started.png

The fluent `.pl` API, layering, and styling — on the in-memory `blobs`
dataset. Ideal first read.
:::

::::

## Examples

```{note}
No focused examples yet — contributions welcome! See
[CONTRIBUTING](https://github.com/scverse/spatialdata-plot-notebooks/blob/main/CONTRIBUTING.md)
in the notebooks repo for how to add one.
```

```{toctree}
:hidden:
:maxdepth: 2

notebooks/tutorials/index
notebooks/examples/index
```
3 changes: 2 additions & 1 deletion docs/index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,9 @@

```{toctree}
:hidden: true
:maxdepth: 1
:maxdepth: 2

gallery.md
api.md
changelog.md
contributing.md
Expand Down
1 change: 1 addition & 0 deletions docs/notebooks
Submodule notebooks added at e0ac82
1 change: 1 addition & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,6 +55,7 @@ doc = [
"sphinx-autodoc-typehints",
"sphinx-book-theme>=1",
"sphinx-copybutton",
"sphinx-design",
"sphinx-tabs",
"sphinxcontrib-bibtex>=1",
"sphinxcontrib-katex",
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/workflows/build.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,3 +24,18 @@ jobs:
run: uv build
- name: Check package
run: uvx twine check --strict dist/*.whl

docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
submodules: true
fetch-depth: 0
- name: Pull latest notebooks
# Match RTD: render whatever is on notebooks-repo main, not the pinned SHA.
run: git submodule update --init --remote --recursive
- name: Install uv
uses: astral-sh/setup-uv@v7
- name: Build docs
run: uvx --with="virtualenv<21" hatch run docs:build
4 changes: 4 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
[submodule "docs/notebooks"]
path = docs/notebooks
url = https://github.com/scverse/spatialdata-plot-notebooks.git
branch = main
10 changes: 10 additions & 0 deletions .readthedocs.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,6 +6,12 @@ build:
python: "3.13"
nodejs: latest
jobs:
post_checkout:
# Always render the latest notebooks-repo main, not the SHA pinned in
# this repo's index. Trade-off: docs at older lib tags are not bit-for-bit
# reproducible for the gallery — a re-build shows whatever the notebooks
# repo's main looked like at build time.
- git submodule update --init --remote --recursive
create_environment:
- asdf plugin add uv
- asdf install uv latest
Expand All@@ -15,3 +21,7 @@ build:
# TODO: remove "--with=virtualenv<21" once hatch is compatible with virtualenv 21+ (pypa/hatch#2193)
- uvx "--with=virtualenv<21" hatch run docs:build
- mv docs/_build $READTHEDOCS_OUTPUT

submodules:
include: all
recursive: false
4 changes: 3 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,8 +30,9 @@ In concordance with the general SpatialData philosophy, all modalities of the ma

For more information on the `spatialdata-plot` library, please refer to the [documentation](https://spatialdata.scverse.org/projects/plot/en/latest/index.html). In particular, the

- [Gallery][link-gallery] — executable example notebooks demonstrating the plotting capabilities.
- [API documentation][link-api].
- [Example notebooks][link-notebooks] (section "Visiualizations")
- [SpatialData example notebooks][link-notebooks] (section "Visualizations") for plotting in the context of broader analyses.

## Installation

Expand DownExpand Up@@ -65,6 +66,7 @@ Marconato, L., Palla, G., Yamauchi, K.A. et al. SpatialData: an open and univers
[issue-tracker]: https://github.com/scverse/spatialdata-plot/issues
[link-docs]: https://spatialdata-plot.readthedocs.io
[link-api]: https://spatialdata.scverse.org/projects/plot/en/stable/api.html
[link-gallery]: https://spatialdata.scverse.org/projects/plot/en/stable/gallery.html
[link-design-doc]: https://spatialdata.scverse.org/en/stable/design_doc.html
[link-notebooks]: https://spatialdata.scverse.org/en/stable/tutorials/notebooks/notebooks.html
[//]: # "numfocus-fiscal-sponsor-attribution"
Expand Down
Binary file addeddocs/_static/gallery/getting_started.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 8 additions & 4 deletions docs/conf.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,6 +56,7 @@
"sphinx.ext.intersphinx",
"sphinx.ext.autosummary",
"sphinx.ext.napoleon",
"sphinx_design",
"sphinxcontrib.bibtex",
"sphinxcontrib.katex",
"sphinx_autodoc_typehints",
Expand DownExpand Up@@ -114,10 +115,13 @@
"Thumbs.db",
".DS_Store",
"**.ipynb_checkpoints",
"tutorials/notebooks/index.md",
"tutorials/notebooks/README.md",
"tutorials/notebooks/references.md",
"tutorials/notebooks/notebooks/paper_reproducibility/*",
# Submodule meta-files: these document the notebooks repo itself, not
# spatialdata-plot, and should not be rendered into our docs.
"notebooks/README.md",
"notebooks/CONTRIBUTING.md",
"notebooks/LICENSE",
"notebooks/.github/**",
"notebooks/pyproject.toml",
]


Expand Down
59 changes: 51 additions & 8 deletions docs/contributing.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -251,7 +251,7 @@ This project uses [sphinx][] with the following features:

- The [myst][] extension allows to write documentation in markdown/Markedly Structured Text
- [Numpy-style docstrings][numpydoc] (through the [napoleon][numpydoc-napoleon] extension).
- Jupyter notebooks as tutorials through [myst-nb][] (See [Tutorials with myst-nb](#tutorials-with-myst-nb-and-jupyter-notebooks))
- Jupyter notebooks as tutorials through [myst-nb][] (See [Gallery notebooks (submodule)](#gallery-notebooks-submodule))
- [sphinx-autodoc-typehints][], to automatically reference annotated input and output types
- Citations (like {cite:p}`Virshup_2023`) can be included with [sphinxcontrib-bibtex](https://sphinxcontrib-bibtex.readthedocs.io/)

Expand All@@ -264,16 +264,48 @@ See scanpy's {doc}`scanpy:dev/documentation` for more information on how to writ
[numpydoc]: https://numpydoc.readthedocs.io/en/latest/format.html
[sphinx-autodoc-typehints]: https://github.com/tox-dev/sphinx-autodoc-typehints

### Tutorials with myst-nb and jupyter notebooks
### Gallery notebooks (submodule)

The documentation is set-up to render jupyter notebooks stored in the `docs/notebooks` directory using [myst-nb][].
Currently, only notebooks in `.ipynb` format are supported that will be included with both their input and output cells.
It is your responsibility to update and re-run the notebook whenever necessary.
The gallery rendered into the docs lives in a separate repository,
[`scverse/spatialdata-plot-notebooks`][notebooks-repo], mounted here as a git
submodule at `docs/notebooks/`. This follows the scverse convention used by
`anndata`, `spatialdata`, `scvi-tools`, and `squidpy`.

If you are interested in automatically running notebooks as part of the continuous integration,
please check out [this feature request][issue-render-notebooks] in the `cookiecutter-scverse` repository.
Notebooks are pre-executed by humans and committed with their outputs; the
docs build performs no execution and pulls no data. A scheduled CI job in the
notebooks repo re-executes every notebook against the latest
`spatialdata-plot` release and fails on output drift.

[issue-render-notebooks]: https://github.com/scverse/cookiecutter-scverse/issues/40
#### Working with the gallery locally

```bash
# First-time clone — pull this repo with submodules
git clone --recurse-submodules https://github.com/scverse/spatialdata-plot.git

# Already cloned without submodules — initialise after the fact
git submodule update --init --recursive

# Pull the latest gallery content from the notebooks repo's main branch
git submodule update --remote docs/notebooks
```

ReadTheDocs is configured (`submodules: include: all` in `.readthedocs.yaml`)
to fetch the submodule on every build, so PR previews always render the
current pinned gallery content.

#### Adding or editing a notebook

Notebook changes are made in the [notebooks repo][notebooks-repo], not here.
See its `CONTRIBUTING.md` for the workflow. After your notebook PR merges
there, open a small follow-up PR in this repo bumping the submodule pin:

```bash
git submodule update --remote docs/notebooks
git add docs/notebooks
git commit -m "Bump notebooks submodule"
```

[notebooks-repo]: https://github.com/scverse/spatialdata-plot-notebooks

#### Hints

Expand All@@ -286,6 +318,17 @@ please check out [this feature request][issue-render-notebooks] in the `cookiecu

### Building the docs locally

:::{important}
The docs include a git submodule (`docs/notebooks` → `spatialdata-plot-notebooks`).
If you cloned this repo without `--recurse-submodules`, initialise it once before building:

```bash
git submodule update --init --recursive
```

Without the submodule, the gallery pages will be missing and sphinx will warn about broken toctree entries.
:::

:::::{tabs}
::::{group-tab} Hatch

Expand Down
43 changes: 43 additions & 0 deletions docs/gallery.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
# Gallery

Curated, runnable examples demonstrating `spatialdata-plot` on real
spatial-omics datasets and on the lightweight `blobs` dataset.

Sources live in
[`scverse/spatialdata-plot-notebooks`](https://github.com/scverse/spatialdata-plot-notebooks);
every notebook is executable end-to-end and re-executed on a weekly schedule
against the latest `spatialdata-plot` release.

## Tutorials

End-to-end workflows on real datasets.

::::{grid} 1 2 2 2
:gutter: 3

:::{grid-item-card} Getting started
:link: notebooks/tutorials/getting_started
:link-type: doc
:img-top: _static/gallery/getting_started.png

The fluent `.pl` API, layering, and styling — on the in-memory `blobs`
dataset. Ideal first read.
:::

::::

## Examples

```{note}
No focused examples yet — contributions welcome! See
[CONTRIBUTING](https://github.com/scverse/spatialdata-plot-notebooks/blob/main/CONTRIBUTING.md)
in the notebooks repo for how to add one.
```

```{toctree}
:hidden:
:maxdepth: 2

notebooks/tutorials/index
notebooks/examples/index
```
3 changes: 2 additions & 1 deletion docs/index.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,8 +4,9 @@

```{toctree}
:hidden: true
:maxdepth: 1
:maxdepth: 2

gallery.md
api.md
changelog.md
contributing.md
Expand Down
1 change: 1 addition & 0 deletions docs/notebooks
Submodule notebooks added at e0ac82
1 change: 1 addition & 0 deletions pyproject.toml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,6 +55,7 @@ doc = [
"sphinx-autodoc-typehints",
"sphinx-book-theme>=1",
"sphinx-copybutton",
"sphinx-design",
"sphinx-tabs",
"sphinxcontrib-bibtex>=1",
"sphinxcontrib-katex",
Expand Down
Loading