Add Visium breast-cancer tutorial - #2

Merged
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial
May 11, 2026
Merged

Add Visium breast-cancer tutorial#2
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial

Conversation

@timtreis

@timtreistimtreis commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

Adds tutorials/visium_breast_cancer.ipynb — the gallery's first real-data tutorial.

Synthesises the example progression curated by @asarigun in scverse/spatialdata-plot#590 into one coherent end-to-end notebook: load the 10x Visium Block A Section 1 dataset, render the H&E tissue, render the spots, overlay them, color by gene expression (ERBB2) and by categorical metadata (in_tissue), and finish with a publication-styled figure with thin white outlines.

Synthesises the example progression curated by @asarigun in
scverse/spatialdata-plot#590 (H&E + spots, gene-expression overlay,
outline styling) into a single end-to-end tutorial. Inlines the
load_visium_breast_cancer helper so the notebook is self-contained when
downloaded.
Uses scanpy.datasets.visium_sge for the data; pooch caches the ~100MB
download across runs. Pre-executed and committed with outputs.
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

github-actionsBot pushed a commit that referenced this pull request May 11, 2026
Lint: ruff-format was collapsing the fluent .pl chains onto single lines
because they fit under 120 chars. Exclude *.ipynb from ruff-format; lint
notebooks via nbqa-ruff only.
Execute drift: pooch's tqdm.notebook spawns Jupyter widgets whose UUIDs
regenerate on every execution, breaking the diff-against-committed check.
Add scripts/strip_widget_metadata.py and run it as both a pre-commit hook
and a post-execute step in execute.yaml so committed and re-executed
notebooks stay symmetric.
pre-commit.ci: add the ci: config block so PRs are auto-fixed by the bot
(monthly autoupdate, autofix on every PR). Requires installing the
pre-commit.ci GitHub App on the repo (one-time, repo settings -> Apps).
Preview URL: the github.io URL 301-redirected through the scverse-org-wide
scverse.org CNAME, which made the displayed link confusingly different
from the destination. Switch the comment body to the canonical
https://scverse.org/<repo>/pr-N/gallery.html URL — same content, no
redirect.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
The diff-against-committed step caught noise rather than regressions:
matplotlib PNG bytes vary across machines (font hinting, dpi rendering),
cell execution timestamps always differ, Python micro-version leaks into
metadata.language_info. Two valid notebook executions on different
machines never produce identical bytes, so the check failed on every
schedule and most PRs.
The remaining test is the right one: `nbconvert --execute` raises on any
cell error, which fails the job. Catches lib API breakage, syntax errors,
and missing data — i.e., what we actually care about.
Drops nbdime from CI deps (no longer used). Widget-stripping stays in
the pre-commit hook so committed notebooks remain clean.
Visium tutorial: rewrite to use squidpy.datasets.visium_hne_sdata which
returns a ready SpatialData object. Removes ~50 lines of manual
Image2DModel/ShapesModel/TableModel plumbing and the dependency on
scanpy.datasets.visium_sge for downloads. Renames the file to
visium_mouse_brain.ipynb to reflect what the dataset actually is (the
squidpy fixture is mouse brain, not breast cancer). Updates color demos
to mouse genes (Mbp for white-matter pattern) and the dataset's existing
cluster annotations.
Both tutorials: replace the "Where to next" markdown sections with a
"For reproducibility" cell using watermark to print version info for the
relevant scientific stack. Adds watermark to the exec extras.
Strip em-dashes from all prose for consistency with the project's voice.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
… 6.0)
nbqa 1.9.0 referenced ast.Str which was removed in Python 3.12 — pre-commit.ci
runs on 3.12 and crashed on every nbqa-ruff invocation. 1.9.1 fixes that.
Also rename id: ruff -> ruff-check (ruff-pre-commit deprecated the
legacy alias in v0.10).
execute.yaml:
- Drop fetch-depth: 0 (no longer needed; tj-actions/changed-files
fetches the right base internally).
- Add pip cache via setup-python (saves >1 min per PR run on the
squidpy + scanpy install).
- Stable pooch cache key (was hashFiles('**/*.ipynb') which invalidated
the dataset cache on every notebook edit; bump v* suffix when adding a
new dataset URL).
- Replace hand-rolled `git diff | grep` notebook detection with
tj-actions/changed-files. Cuts ~15 lines of brittle bash and handles
rename/move events correctly.
- Drop the trailing "we do NOT diff" comment block; the rationale lives
in commit history, not in the YAML.
preview.yaml: drop fetch-depth: 0 on the lib clone (only HEAD is built).
strip_widget_metadata.py: docstring referenced the removed diff check
in execute.yaml; rewrite to the actual remaining justification (small
committed notebooks, clean PR diffs).
.pre-commit-config.yaml: drop redundant `require_serial: false`
(default value).
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@scversescverse deleted a comment from github-actionsBotMay 11, 2026
@github-actions

github-actionsBot commented May 11, 2026

Copy link
Copy Markdown

📖 Docs preview: https://scverse.org/spatialdata-plot-notebooks/pr-2/gallery.html

Built from 8e79eaa; redeployed on every push.

Tutorials are kept for entry-point material that teaches the API on
synthetic data; examples/ hosts notebooks that demonstrate the API on
real datasets you'd actually analyse. Visium fits the latter.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@timtreis
timtreis merged commit 48fb273 into mainMay 11, 2026
4 checks passed
@timtreis
timtreis deleted the feat/visium-tutorial branch May 11, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@timtreis
, '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

Add Visium breast-cancer tutorial - #2

Merged
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial
May 11, 2026
Merged

Add Visium breast-cancer tutorial#2
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial

Conversation

@timtreis

@timtreistimtreis commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

Adds tutorials/visium_breast_cancer.ipynb — the gallery's first real-data tutorial.

Synthesises the example progression curated by @asarigun in scverse/spatialdata-plot#590 into one coherent end-to-end notebook: load the 10x Visium Block A Section 1 dataset, render the H&E tissue, render the spots, overlay them, color by gene expression (ERBB2) and by categorical metadata (in_tissue), and finish with a publication-styled figure with thin white outlines.

Synthesises the example progression curated by @asarigun in
scverse/spatialdata-plot#590 (H&E + spots, gene-expression overlay,
outline styling) into a single end-to-end tutorial. Inlines the
load_visium_breast_cancer helper so the notebook is self-contained when
downloaded.
Uses scanpy.datasets.visium_sge for the data; pooch caches the ~100MB
download across runs. Pre-executed and committed with outputs.
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

github-actionsBot pushed a commit that referenced this pull request May 11, 2026
Lint: ruff-format was collapsing the fluent .pl chains onto single lines
because they fit under 120 chars. Exclude *.ipynb from ruff-format; lint
notebooks via nbqa-ruff only.
Execute drift: pooch's tqdm.notebook spawns Jupyter widgets whose UUIDs
regenerate on every execution, breaking the diff-against-committed check.
Add scripts/strip_widget_metadata.py and run it as both a pre-commit hook
and a post-execute step in execute.yaml so committed and re-executed
notebooks stay symmetric.
pre-commit.ci: add the ci: config block so PRs are auto-fixed by the bot
(monthly autoupdate, autofix on every PR). Requires installing the
pre-commit.ci GitHub App on the repo (one-time, repo settings -> Apps).
Preview URL: the github.io URL 301-redirected through the scverse-org-wide
scverse.org CNAME, which made the displayed link confusingly different
from the destination. Switch the comment body to the canonical
https://scverse.org/<repo>/pr-N/gallery.html URL — same content, no
redirect.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
The diff-against-committed step caught noise rather than regressions:
matplotlib PNG bytes vary across machines (font hinting, dpi rendering),
cell execution timestamps always differ, Python micro-version leaks into
metadata.language_info. Two valid notebook executions on different
machines never produce identical bytes, so the check failed on every
schedule and most PRs.
The remaining test is the right one: `nbconvert --execute` raises on any
cell error, which fails the job. Catches lib API breakage, syntax errors,
and missing data — i.e., what we actually care about.
Drops nbdime from CI deps (no longer used). Widget-stripping stays in
the pre-commit hook so committed notebooks remain clean.
Visium tutorial: rewrite to use squidpy.datasets.visium_hne_sdata which
returns a ready SpatialData object. Removes ~50 lines of manual
Image2DModel/ShapesModel/TableModel plumbing and the dependency on
scanpy.datasets.visium_sge for downloads. Renames the file to
visium_mouse_brain.ipynb to reflect what the dataset actually is (the
squidpy fixture is mouse brain, not breast cancer). Updates color demos
to mouse genes (Mbp for white-matter pattern) and the dataset's existing
cluster annotations.
Both tutorials: replace the "Where to next" markdown sections with a
"For reproducibility" cell using watermark to print version info for the
relevant scientific stack. Adds watermark to the exec extras.
Strip em-dashes from all prose for consistency with the project's voice.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
… 6.0)
nbqa 1.9.0 referenced ast.Str which was removed in Python 3.12 — pre-commit.ci
runs on 3.12 and crashed on every nbqa-ruff invocation. 1.9.1 fixes that.
Also rename id: ruff -> ruff-check (ruff-pre-commit deprecated the
legacy alias in v0.10).
execute.yaml:
- Drop fetch-depth: 0 (no longer needed; tj-actions/changed-files
fetches the right base internally).
- Add pip cache via setup-python (saves >1 min per PR run on the
squidpy + scanpy install).
- Stable pooch cache key (was hashFiles('**/*.ipynb') which invalidated
the dataset cache on every notebook edit; bump v* suffix when adding a
new dataset URL).
- Replace hand-rolled `git diff | grep` notebook detection with
tj-actions/changed-files. Cuts ~15 lines of brittle bash and handles
rename/move events correctly.
- Drop the trailing "we do NOT diff" comment block; the rationale lives
in commit history, not in the YAML.
preview.yaml: drop fetch-depth: 0 on the lib clone (only HEAD is built).
strip_widget_metadata.py: docstring referenced the removed diff check
in execute.yaml; rewrite to the actual remaining justification (small
committed notebooks, clean PR diffs).
.pre-commit-config.yaml: drop redundant `require_serial: false`
(default value).
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@scversescverse deleted a comment from github-actionsBotMay 11, 2026
@github-actions

github-actionsBot commented May 11, 2026

Copy link
Copy Markdown

📖 Docs preview: https://scverse.org/spatialdata-plot-notebooks/pr-2/gallery.html

Built from 8e79eaa; redeployed on every push.

Tutorials are kept for entry-point material that teaches the API on
synthetic data; examples/ hosts notebooks that demonstrate the API on
real datasets you'd actually analyse. Visium fits the latter.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@timtreis
timtreis merged commit 48fb273 into mainMay 11, 2026
4 checks passed
@timtreis
timtreis deleted the feat/visium-tutorial branch May 11, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@timtreis
, '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

Add Visium breast-cancer tutorial - #2

Merged
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial
May 11, 2026
Merged

Add Visium breast-cancer tutorial#2
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial

Conversation

@timtreis

@timtreistimtreis commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

Adds tutorials/visium_breast_cancer.ipynb — the gallery's first real-data tutorial.

Synthesises the example progression curated by @asarigun in scverse/spatialdata-plot#590 into one coherent end-to-end notebook: load the 10x Visium Block A Section 1 dataset, render the H&E tissue, render the spots, overlay them, color by gene expression (ERBB2) and by categorical metadata (in_tissue), and finish with a publication-styled figure with thin white outlines.

Synthesises the example progression curated by @asarigun in
scverse/spatialdata-plot#590 (H&E + spots, gene-expression overlay,
outline styling) into a single end-to-end tutorial. Inlines the
load_visium_breast_cancer helper so the notebook is self-contained when
downloaded.
Uses scanpy.datasets.visium_sge for the data; pooch caches the ~100MB
download across runs. Pre-executed and committed with outputs.
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

github-actionsBot pushed a commit that referenced this pull request May 11, 2026
Lint: ruff-format was collapsing the fluent .pl chains onto single lines
because they fit under 120 chars. Exclude *.ipynb from ruff-format; lint
notebooks via nbqa-ruff only.
Execute drift: pooch's tqdm.notebook spawns Jupyter widgets whose UUIDs
regenerate on every execution, breaking the diff-against-committed check.
Add scripts/strip_widget_metadata.py and run it as both a pre-commit hook
and a post-execute step in execute.yaml so committed and re-executed
notebooks stay symmetric.
pre-commit.ci: add the ci: config block so PRs are auto-fixed by the bot
(monthly autoupdate, autofix on every PR). Requires installing the
pre-commit.ci GitHub App on the repo (one-time, repo settings -> Apps).
Preview URL: the github.io URL 301-redirected through the scverse-org-wide
scverse.org CNAME, which made the displayed link confusingly different
from the destination. Switch the comment body to the canonical
https://scverse.org/<repo>/pr-N/gallery.html URL — same content, no
redirect.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
The diff-against-committed step caught noise rather than regressions:
matplotlib PNG bytes vary across machines (font hinting, dpi rendering),
cell execution timestamps always differ, Python micro-version leaks into
metadata.language_info. Two valid notebook executions on different
machines never produce identical bytes, so the check failed on every
schedule and most PRs.
The remaining test is the right one: `nbconvert --execute` raises on any
cell error, which fails the job. Catches lib API breakage, syntax errors,
and missing data — i.e., what we actually care about.
Drops nbdime from CI deps (no longer used). Widget-stripping stays in
the pre-commit hook so committed notebooks remain clean.
Visium tutorial: rewrite to use squidpy.datasets.visium_hne_sdata which
returns a ready SpatialData object. Removes ~50 lines of manual
Image2DModel/ShapesModel/TableModel plumbing and the dependency on
scanpy.datasets.visium_sge for downloads. Renames the file to
visium_mouse_brain.ipynb to reflect what the dataset actually is (the
squidpy fixture is mouse brain, not breast cancer). Updates color demos
to mouse genes (Mbp for white-matter pattern) and the dataset's existing
cluster annotations.
Both tutorials: replace the "Where to next" markdown sections with a
"For reproducibility" cell using watermark to print version info for the
relevant scientific stack. Adds watermark to the exec extras.
Strip em-dashes from all prose for consistency with the project's voice.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
… 6.0)
nbqa 1.9.0 referenced ast.Str which was removed in Python 3.12 — pre-commit.ci
runs on 3.12 and crashed on every nbqa-ruff invocation. 1.9.1 fixes that.
Also rename id: ruff -> ruff-check (ruff-pre-commit deprecated the
legacy alias in v0.10).
execute.yaml:
- Drop fetch-depth: 0 (no longer needed; tj-actions/changed-files
fetches the right base internally).
- Add pip cache via setup-python (saves >1 min per PR run on the
squidpy + scanpy install).
- Stable pooch cache key (was hashFiles('**/*.ipynb') which invalidated
the dataset cache on every notebook edit; bump v* suffix when adding a
new dataset URL).
- Replace hand-rolled `git diff | grep` notebook detection with
tj-actions/changed-files. Cuts ~15 lines of brittle bash and handles
rename/move events correctly.
- Drop the trailing "we do NOT diff" comment block; the rationale lives
in commit history, not in the YAML.
preview.yaml: drop fetch-depth: 0 on the lib clone (only HEAD is built).
strip_widget_metadata.py: docstring referenced the removed diff check
in execute.yaml; rewrite to the actual remaining justification (small
committed notebooks, clean PR diffs).
.pre-commit-config.yaml: drop redundant `require_serial: false`
(default value).
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@scversescverse deleted a comment from github-actionsBotMay 11, 2026
@github-actions

github-actionsBot commented May 11, 2026

Copy link
Copy Markdown

📖 Docs preview: https://scverse.org/spatialdata-plot-notebooks/pr-2/gallery.html

Built from 8e79eaa; redeployed on every push.

Tutorials are kept for entry-point material that teaches the API on
synthetic data; examples/ hosts notebooks that demonstrate the API on
real datasets you'd actually analyse. Visium fits the latter.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@timtreis
timtreis merged commit 48fb273 into mainMay 11, 2026
4 checks passed
@timtreis
timtreis deleted the feat/visium-tutorial branch May 11, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@timtreis
, '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

Add Visium breast-cancer tutorial - #2

Merged
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial
May 11, 2026
Merged

Add Visium breast-cancer tutorial#2
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial

Conversation

@timtreis

@timtreistimtreis commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

Adds tutorials/visium_breast_cancer.ipynb — the gallery's first real-data tutorial.

Synthesises the example progression curated by @asarigun in scverse/spatialdata-plot#590 into one coherent end-to-end notebook: load the 10x Visium Block A Section 1 dataset, render the H&E tissue, render the spots, overlay them, color by gene expression (ERBB2) and by categorical metadata (in_tissue), and finish with a publication-styled figure with thin white outlines.

Synthesises the example progression curated by @asarigun in
scverse/spatialdata-plot#590 (H&E + spots, gene-expression overlay,
outline styling) into a single end-to-end tutorial. Inlines the
load_visium_breast_cancer helper so the notebook is self-contained when
downloaded.
Uses scanpy.datasets.visium_sge for the data; pooch caches the ~100MB
download across runs. Pre-executed and committed with outputs.
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

github-actionsBot pushed a commit that referenced this pull request May 11, 2026
Lint: ruff-format was collapsing the fluent .pl chains onto single lines
because they fit under 120 chars. Exclude *.ipynb from ruff-format; lint
notebooks via nbqa-ruff only.
Execute drift: pooch's tqdm.notebook spawns Jupyter widgets whose UUIDs
regenerate on every execution, breaking the diff-against-committed check.
Add scripts/strip_widget_metadata.py and run it as both a pre-commit hook
and a post-execute step in execute.yaml so committed and re-executed
notebooks stay symmetric.
pre-commit.ci: add the ci: config block so PRs are auto-fixed by the bot
(monthly autoupdate, autofix on every PR). Requires installing the
pre-commit.ci GitHub App on the repo (one-time, repo settings -> Apps).
Preview URL: the github.io URL 301-redirected through the scverse-org-wide
scverse.org CNAME, which made the displayed link confusingly different
from the destination. Switch the comment body to the canonical
https://scverse.org/<repo>/pr-N/gallery.html URL — same content, no
redirect.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
The diff-against-committed step caught noise rather than regressions:
matplotlib PNG bytes vary across machines (font hinting, dpi rendering),
cell execution timestamps always differ, Python micro-version leaks into
metadata.language_info. Two valid notebook executions on different
machines never produce identical bytes, so the check failed on every
schedule and most PRs.
The remaining test is the right one: `nbconvert --execute` raises on any
cell error, which fails the job. Catches lib API breakage, syntax errors,
and missing data — i.e., what we actually care about.
Drops nbdime from CI deps (no longer used). Widget-stripping stays in
the pre-commit hook so committed notebooks remain clean.
Visium tutorial: rewrite to use squidpy.datasets.visium_hne_sdata which
returns a ready SpatialData object. Removes ~50 lines of manual
Image2DModel/ShapesModel/TableModel plumbing and the dependency on
scanpy.datasets.visium_sge for downloads. Renames the file to
visium_mouse_brain.ipynb to reflect what the dataset actually is (the
squidpy fixture is mouse brain, not breast cancer). Updates color demos
to mouse genes (Mbp for white-matter pattern) and the dataset's existing
cluster annotations.
Both tutorials: replace the "Where to next" markdown sections with a
"For reproducibility" cell using watermark to print version info for the
relevant scientific stack. Adds watermark to the exec extras.
Strip em-dashes from all prose for consistency with the project's voice.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
… 6.0)
nbqa 1.9.0 referenced ast.Str which was removed in Python 3.12 — pre-commit.ci
runs on 3.12 and crashed on every nbqa-ruff invocation. 1.9.1 fixes that.
Also rename id: ruff -> ruff-check (ruff-pre-commit deprecated the
legacy alias in v0.10).
execute.yaml:
- Drop fetch-depth: 0 (no longer needed; tj-actions/changed-files
fetches the right base internally).
- Add pip cache via setup-python (saves >1 min per PR run on the
squidpy + scanpy install).
- Stable pooch cache key (was hashFiles('**/*.ipynb') which invalidated
the dataset cache on every notebook edit; bump v* suffix when adding a
new dataset URL).
- Replace hand-rolled `git diff | grep` notebook detection with
tj-actions/changed-files. Cuts ~15 lines of brittle bash and handles
rename/move events correctly.
- Drop the trailing "we do NOT diff" comment block; the rationale lives
in commit history, not in the YAML.
preview.yaml: drop fetch-depth: 0 on the lib clone (only HEAD is built).
strip_widget_metadata.py: docstring referenced the removed diff check
in execute.yaml; rewrite to the actual remaining justification (small
committed notebooks, clean PR diffs).
.pre-commit-config.yaml: drop redundant `require_serial: false`
(default value).
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@scversescverse deleted a comment from github-actionsBotMay 11, 2026
@github-actions

github-actionsBot commented May 11, 2026

Copy link
Copy Markdown

📖 Docs preview: https://scverse.org/spatialdata-plot-notebooks/pr-2/gallery.html

Built from 8e79eaa; redeployed on every push.

Tutorials are kept for entry-point material that teaches the API on
synthetic data; examples/ hosts notebooks that demonstrate the API on
real datasets you'd actually analyse. Visium fits the latter.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@timtreis
timtreis merged commit 48fb273 into mainMay 11, 2026
4 checks passed
@timtreis
timtreis deleted the feat/visium-tutorial branch May 11, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@timtreis
, '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

Add Visium breast-cancer tutorial - #2

Merged
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial
May 11, 2026
Merged

Add Visium breast-cancer tutorial#2
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial

Conversation

@timtreis

@timtreistimtreis commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

Adds tutorials/visium_breast_cancer.ipynb — the gallery's first real-data tutorial.

Synthesises the example progression curated by @asarigun in scverse/spatialdata-plot#590 into one coherent end-to-end notebook: load the 10x Visium Block A Section 1 dataset, render the H&E tissue, render the spots, overlay them, color by gene expression (ERBB2) and by categorical metadata (in_tissue), and finish with a publication-styled figure with thin white outlines.

Synthesises the example progression curated by @asarigun in
scverse/spatialdata-plot#590 (H&E + spots, gene-expression overlay,
outline styling) into a single end-to-end tutorial. Inlines the
load_visium_breast_cancer helper so the notebook is self-contained when
downloaded.
Uses scanpy.datasets.visium_sge for the data; pooch caches the ~100MB
download across runs. Pre-executed and committed with outputs.
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

github-actionsBot pushed a commit that referenced this pull request May 11, 2026
Lint: ruff-format was collapsing the fluent .pl chains onto single lines
because they fit under 120 chars. Exclude *.ipynb from ruff-format; lint
notebooks via nbqa-ruff only.
Execute drift: pooch's tqdm.notebook spawns Jupyter widgets whose UUIDs
regenerate on every execution, breaking the diff-against-committed check.
Add scripts/strip_widget_metadata.py and run it as both a pre-commit hook
and a post-execute step in execute.yaml so committed and re-executed
notebooks stay symmetric.
pre-commit.ci: add the ci: config block so PRs are auto-fixed by the bot
(monthly autoupdate, autofix on every PR). Requires installing the
pre-commit.ci GitHub App on the repo (one-time, repo settings -> Apps).
Preview URL: the github.io URL 301-redirected through the scverse-org-wide
scverse.org CNAME, which made the displayed link confusingly different
from the destination. Switch the comment body to the canonical
https://scverse.org/<repo>/pr-N/gallery.html URL — same content, no
redirect.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
The diff-against-committed step caught noise rather than regressions:
matplotlib PNG bytes vary across machines (font hinting, dpi rendering),
cell execution timestamps always differ, Python micro-version leaks into
metadata.language_info. Two valid notebook executions on different
machines never produce identical bytes, so the check failed on every
schedule and most PRs.
The remaining test is the right one: `nbconvert --execute` raises on any
cell error, which fails the job. Catches lib API breakage, syntax errors,
and missing data — i.e., what we actually care about.
Drops nbdime from CI deps (no longer used). Widget-stripping stays in
the pre-commit hook so committed notebooks remain clean.
Visium tutorial: rewrite to use squidpy.datasets.visium_hne_sdata which
returns a ready SpatialData object. Removes ~50 lines of manual
Image2DModel/ShapesModel/TableModel plumbing and the dependency on
scanpy.datasets.visium_sge for downloads. Renames the file to
visium_mouse_brain.ipynb to reflect what the dataset actually is (the
squidpy fixture is mouse brain, not breast cancer). Updates color demos
to mouse genes (Mbp for white-matter pattern) and the dataset's existing
cluster annotations.
Both tutorials: replace the "Where to next" markdown sections with a
"For reproducibility" cell using watermark to print version info for the
relevant scientific stack. Adds watermark to the exec extras.
Strip em-dashes from all prose for consistency with the project's voice.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
… 6.0)
nbqa 1.9.0 referenced ast.Str which was removed in Python 3.12 — pre-commit.ci
runs on 3.12 and crashed on every nbqa-ruff invocation. 1.9.1 fixes that.
Also rename id: ruff -> ruff-check (ruff-pre-commit deprecated the
legacy alias in v0.10).
execute.yaml:
- Drop fetch-depth: 0 (no longer needed; tj-actions/changed-files
fetches the right base internally).
- Add pip cache via setup-python (saves >1 min per PR run on the
squidpy + scanpy install).
- Stable pooch cache key (was hashFiles('**/*.ipynb') which invalidated
the dataset cache on every notebook edit; bump v* suffix when adding a
new dataset URL).
- Replace hand-rolled `git diff | grep` notebook detection with
tj-actions/changed-files. Cuts ~15 lines of brittle bash and handles
rename/move events correctly.
- Drop the trailing "we do NOT diff" comment block; the rationale lives
in commit history, not in the YAML.
preview.yaml: drop fetch-depth: 0 on the lib clone (only HEAD is built).
strip_widget_metadata.py: docstring referenced the removed diff check
in execute.yaml; rewrite to the actual remaining justification (small
committed notebooks, clean PR diffs).
.pre-commit-config.yaml: drop redundant `require_serial: false`
(default value).
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@scversescverse deleted a comment from github-actionsBotMay 11, 2026
@github-actions

github-actionsBot commented May 11, 2026

Copy link
Copy Markdown

📖 Docs preview: https://scverse.org/spatialdata-plot-notebooks/pr-2/gallery.html

Built from 8e79eaa; redeployed on every push.

Tutorials are kept for entry-point material that teaches the API on
synthetic data; examples/ hosts notebooks that demonstrate the API on
real datasets you'd actually analyse. Visium fits the latter.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@timtreis
timtreis merged commit 48fb273 into mainMay 11, 2026
4 checks passed
@timtreis
timtreis deleted the feat/visium-tutorial branch May 11, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@timtreis
, '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

Add Visium breast-cancer tutorial - #2

Merged
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial
May 11, 2026
Merged

Add Visium breast-cancer tutorial#2
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial

Conversation

@timtreis

@timtreistimtreis commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

Adds tutorials/visium_breast_cancer.ipynb — the gallery's first real-data tutorial.

Synthesises the example progression curated by @asarigun in scverse/spatialdata-plot#590 into one coherent end-to-end notebook: load the 10x Visium Block A Section 1 dataset, render the H&E tissue, render the spots, overlay them, color by gene expression (ERBB2) and by categorical metadata (in_tissue), and finish with a publication-styled figure with thin white outlines.

Synthesises the example progression curated by @asarigun in
scverse/spatialdata-plot#590 (H&E + spots, gene-expression overlay,
outline styling) into a single end-to-end tutorial. Inlines the
load_visium_breast_cancer helper so the notebook is self-contained when
downloaded.
Uses scanpy.datasets.visium_sge for the data; pooch caches the ~100MB
download across runs. Pre-executed and committed with outputs.
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

github-actionsBot pushed a commit that referenced this pull request May 11, 2026
Lint: ruff-format was collapsing the fluent .pl chains onto single lines
because they fit under 120 chars. Exclude *.ipynb from ruff-format; lint
notebooks via nbqa-ruff only.
Execute drift: pooch's tqdm.notebook spawns Jupyter widgets whose UUIDs
regenerate on every execution, breaking the diff-against-committed check.
Add scripts/strip_widget_metadata.py and run it as both a pre-commit hook
and a post-execute step in execute.yaml so committed and re-executed
notebooks stay symmetric.
pre-commit.ci: add the ci: config block so PRs are auto-fixed by the bot
(monthly autoupdate, autofix on every PR). Requires installing the
pre-commit.ci GitHub App on the repo (one-time, repo settings -> Apps).
Preview URL: the github.io URL 301-redirected through the scverse-org-wide
scverse.org CNAME, which made the displayed link confusingly different
from the destination. Switch the comment body to the canonical
https://scverse.org/<repo>/pr-N/gallery.html URL — same content, no
redirect.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
The diff-against-committed step caught noise rather than regressions:
matplotlib PNG bytes vary across machines (font hinting, dpi rendering),
cell execution timestamps always differ, Python micro-version leaks into
metadata.language_info. Two valid notebook executions on different
machines never produce identical bytes, so the check failed on every
schedule and most PRs.
The remaining test is the right one: `nbconvert --execute` raises on any
cell error, which fails the job. Catches lib API breakage, syntax errors,
and missing data — i.e., what we actually care about.
Drops nbdime from CI deps (no longer used). Widget-stripping stays in
the pre-commit hook so committed notebooks remain clean.
Visium tutorial: rewrite to use squidpy.datasets.visium_hne_sdata which
returns a ready SpatialData object. Removes ~50 lines of manual
Image2DModel/ShapesModel/TableModel plumbing and the dependency on
scanpy.datasets.visium_sge for downloads. Renames the file to
visium_mouse_brain.ipynb to reflect what the dataset actually is (the
squidpy fixture is mouse brain, not breast cancer). Updates color demos
to mouse genes (Mbp for white-matter pattern) and the dataset's existing
cluster annotations.
Both tutorials: replace the "Where to next" markdown sections with a
"For reproducibility" cell using watermark to print version info for the
relevant scientific stack. Adds watermark to the exec extras.
Strip em-dashes from all prose for consistency with the project's voice.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
… 6.0)
nbqa 1.9.0 referenced ast.Str which was removed in Python 3.12 — pre-commit.ci
runs on 3.12 and crashed on every nbqa-ruff invocation. 1.9.1 fixes that.
Also rename id: ruff -> ruff-check (ruff-pre-commit deprecated the
legacy alias in v0.10).
execute.yaml:
- Drop fetch-depth: 0 (no longer needed; tj-actions/changed-files
fetches the right base internally).
- Add pip cache via setup-python (saves >1 min per PR run on the
squidpy + scanpy install).
- Stable pooch cache key (was hashFiles('**/*.ipynb') which invalidated
the dataset cache on every notebook edit; bump v* suffix when adding a
new dataset URL).
- Replace hand-rolled `git diff | grep` notebook detection with
tj-actions/changed-files. Cuts ~15 lines of brittle bash and handles
rename/move events correctly.
- Drop the trailing "we do NOT diff" comment block; the rationale lives
in commit history, not in the YAML.
preview.yaml: drop fetch-depth: 0 on the lib clone (only HEAD is built).
strip_widget_metadata.py: docstring referenced the removed diff check
in execute.yaml; rewrite to the actual remaining justification (small
committed notebooks, clean PR diffs).
.pre-commit-config.yaml: drop redundant `require_serial: false`
(default value).
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@scversescverse deleted a comment from github-actionsBotMay 11, 2026
@github-actions

github-actionsBot commented May 11, 2026

Copy link
Copy Markdown

📖 Docs preview: https://scverse.org/spatialdata-plot-notebooks/pr-2/gallery.html

Built from 8e79eaa; redeployed on every push.

Tutorials are kept for entry-point material that teaches the API on
synthetic data; examples/ hosts notebooks that demonstrate the API on
real datasets you'd actually analyse. Visium fits the latter.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@timtreis
timtreis merged commit 48fb273 into mainMay 11, 2026
4 checks passed
@timtreis
timtreis deleted the feat/visium-tutorial branch May 11, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@timtreis
, '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

Add Visium breast-cancer tutorial - #2

Merged
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial
May 11, 2026
Merged

Add Visium breast-cancer tutorial#2
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial

Conversation

@timtreis

@timtreistimtreis commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

Adds tutorials/visium_breast_cancer.ipynb — the gallery's first real-data tutorial.

Synthesises the example progression curated by @asarigun in scverse/spatialdata-plot#590 into one coherent end-to-end notebook: load the 10x Visium Block A Section 1 dataset, render the H&E tissue, render the spots, overlay them, color by gene expression (ERBB2) and by categorical metadata (in_tissue), and finish with a publication-styled figure with thin white outlines.

Synthesises the example progression curated by @asarigun in
scverse/spatialdata-plot#590 (H&E + spots, gene-expression overlay,
outline styling) into a single end-to-end tutorial. Inlines the
load_visium_breast_cancer helper so the notebook is self-contained when
downloaded.
Uses scanpy.datasets.visium_sge for the data; pooch caches the ~100MB
download across runs. Pre-executed and committed with outputs.
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

github-actionsBot pushed a commit that referenced this pull request May 11, 2026
Lint: ruff-format was collapsing the fluent .pl chains onto single lines
because they fit under 120 chars. Exclude *.ipynb from ruff-format; lint
notebooks via nbqa-ruff only.
Execute drift: pooch's tqdm.notebook spawns Jupyter widgets whose UUIDs
regenerate on every execution, breaking the diff-against-committed check.
Add scripts/strip_widget_metadata.py and run it as both a pre-commit hook
and a post-execute step in execute.yaml so committed and re-executed
notebooks stay symmetric.
pre-commit.ci: add the ci: config block so PRs are auto-fixed by the bot
(monthly autoupdate, autofix on every PR). Requires installing the
pre-commit.ci GitHub App on the repo (one-time, repo settings -> Apps).
Preview URL: the github.io URL 301-redirected through the scverse-org-wide
scverse.org CNAME, which made the displayed link confusingly different
from the destination. Switch the comment body to the canonical
https://scverse.org/<repo>/pr-N/gallery.html URL — same content, no
redirect.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
The diff-against-committed step caught noise rather than regressions:
matplotlib PNG bytes vary across machines (font hinting, dpi rendering),
cell execution timestamps always differ, Python micro-version leaks into
metadata.language_info. Two valid notebook executions on different
machines never produce identical bytes, so the check failed on every
schedule and most PRs.
The remaining test is the right one: `nbconvert --execute` raises on any
cell error, which fails the job. Catches lib API breakage, syntax errors,
and missing data — i.e., what we actually care about.
Drops nbdime from CI deps (no longer used). Widget-stripping stays in
the pre-commit hook so committed notebooks remain clean.
Visium tutorial: rewrite to use squidpy.datasets.visium_hne_sdata which
returns a ready SpatialData object. Removes ~50 lines of manual
Image2DModel/ShapesModel/TableModel plumbing and the dependency on
scanpy.datasets.visium_sge for downloads. Renames the file to
visium_mouse_brain.ipynb to reflect what the dataset actually is (the
squidpy fixture is mouse brain, not breast cancer). Updates color demos
to mouse genes (Mbp for white-matter pattern) and the dataset's existing
cluster annotations.
Both tutorials: replace the "Where to next" markdown sections with a
"For reproducibility" cell using watermark to print version info for the
relevant scientific stack. Adds watermark to the exec extras.
Strip em-dashes from all prose for consistency with the project's voice.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
… 6.0)
nbqa 1.9.0 referenced ast.Str which was removed in Python 3.12 — pre-commit.ci
runs on 3.12 and crashed on every nbqa-ruff invocation. 1.9.1 fixes that.
Also rename id: ruff -> ruff-check (ruff-pre-commit deprecated the
legacy alias in v0.10).
execute.yaml:
- Drop fetch-depth: 0 (no longer needed; tj-actions/changed-files
fetches the right base internally).
- Add pip cache via setup-python (saves >1 min per PR run on the
squidpy + scanpy install).
- Stable pooch cache key (was hashFiles('**/*.ipynb') which invalidated
the dataset cache on every notebook edit; bump v* suffix when adding a
new dataset URL).
- Replace hand-rolled `git diff | grep` notebook detection with
tj-actions/changed-files. Cuts ~15 lines of brittle bash and handles
rename/move events correctly.
- Drop the trailing "we do NOT diff" comment block; the rationale lives
in commit history, not in the YAML.
preview.yaml: drop fetch-depth: 0 on the lib clone (only HEAD is built).
strip_widget_metadata.py: docstring referenced the removed diff check
in execute.yaml; rewrite to the actual remaining justification (small
committed notebooks, clean PR diffs).
.pre-commit-config.yaml: drop redundant `require_serial: false`
(default value).
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@scversescverse deleted a comment from github-actionsBotMay 11, 2026
@github-actions

github-actionsBot commented May 11, 2026

Copy link
Copy Markdown

📖 Docs preview: https://scverse.org/spatialdata-plot-notebooks/pr-2/gallery.html

Built from 8e79eaa; redeployed on every push.

Tutorials are kept for entry-point material that teaches the API on
synthetic data; examples/ hosts notebooks that demonstrate the API on
real datasets you'd actually analyse. Visium fits the latter.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@timtreis
timtreis merged commit 48fb273 into mainMay 11, 2026
4 checks passed
@timtreis
timtreis deleted the feat/visium-tutorial branch May 11, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@timtreis
, '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

Add Visium breast-cancer tutorial - #2

Merged
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial
May 11, 2026
Merged

Add Visium breast-cancer tutorial#2
timtreis merged 8 commits into
mainfrom
feat/visium-tutorial

Conversation

@timtreis

@timtreistimtreis commented May 11, 2026

Copy link
Copy Markdown
Member

Summary

Adds tutorials/visium_breast_cancer.ipynb — the gallery's first real-data tutorial.

Synthesises the example progression curated by @asarigun in scverse/spatialdata-plot#590 into one coherent end-to-end notebook: load the 10x Visium Block A Section 1 dataset, render the H&E tissue, render the spots, overlay them, color by gene expression (ERBB2) and by categorical metadata (in_tissue), and finish with a publication-styled figure with thin white outlines.

Synthesises the example progression curated by @asarigun in
scverse/spatialdata-plot#590 (H&E + spots, gene-expression overlay,
outline styling) into a single end-to-end tutorial. Inlines the
load_visium_breast_cancer helper so the notebook is self-contained when
downloaded.
Uses scanpy.datasets.visium_sge for the data; pooch caches the ~100MB
download across runs. Pre-executed and committed with outputs.
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

github-actionsBot pushed a commit that referenced this pull request May 11, 2026
Lint: ruff-format was collapsing the fluent .pl chains onto single lines
because they fit under 120 chars. Exclude *.ipynb from ruff-format; lint
notebooks via nbqa-ruff only.
Execute drift: pooch's tqdm.notebook spawns Jupyter widgets whose UUIDs
regenerate on every execution, breaking the diff-against-committed check.
Add scripts/strip_widget_metadata.py and run it as both a pre-commit hook
and a post-execute step in execute.yaml so committed and re-executed
notebooks stay symmetric.
pre-commit.ci: add the ci: config block so PRs are auto-fixed by the bot
(monthly autoupdate, autofix on every PR). Requires installing the
pre-commit.ci GitHub App on the repo (one-time, repo settings -> Apps).
Preview URL: the github.io URL 301-redirected through the scverse-org-wide
scverse.org CNAME, which made the displayed link confusingly different
from the destination. Switch the comment body to the canonical
https://scverse.org/<repo>/pr-N/gallery.html URL — same content, no
redirect.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
The diff-against-committed step caught noise rather than regressions:
matplotlib PNG bytes vary across machines (font hinting, dpi rendering),
cell execution timestamps always differ, Python micro-version leaks into
metadata.language_info. Two valid notebook executions on different
machines never produce identical bytes, so the check failed on every
schedule and most PRs.
The remaining test is the right one: `nbconvert --execute` raises on any
cell error, which fails the job. Catches lib API breakage, syntax errors,
and missing data — i.e., what we actually care about.
Drops nbdime from CI deps (no longer used). Widget-stripping stays in
the pre-commit hook so committed notebooks remain clean.
Visium tutorial: rewrite to use squidpy.datasets.visium_hne_sdata which
returns a ready SpatialData object. Removes ~50 lines of manual
Image2DModel/ShapesModel/TableModel plumbing and the dependency on
scanpy.datasets.visium_sge for downloads. Renames the file to
visium_mouse_brain.ipynb to reflect what the dataset actually is (the
squidpy fixture is mouse brain, not breast cancer). Updates color demos
to mouse genes (Mbp for white-matter pattern) and the dataset's existing
cluster annotations.
Both tutorials: replace the "Where to next" markdown sections with a
"For reproducibility" cell using watermark to print version info for the
relevant scientific stack. Adds watermark to the exec extras.
Strip em-dashes from all prose for consistency with the project's voice.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
… 6.0)
nbqa 1.9.0 referenced ast.Str which was removed in Python 3.12 — pre-commit.ci
runs on 3.12 and crashed on every nbqa-ruff invocation. 1.9.1 fixes that.
Also rename id: ruff -> ruff-check (ruff-pre-commit deprecated the
legacy alias in v0.10).
execute.yaml:
- Drop fetch-depth: 0 (no longer needed; tj-actions/changed-files
fetches the right base internally).
- Add pip cache via setup-python (saves >1 min per PR run on the
squidpy + scanpy install).
- Stable pooch cache key (was hashFiles('**/*.ipynb') which invalidated
the dataset cache on every notebook edit; bump v* suffix when adding a
new dataset URL).
- Replace hand-rolled `git diff | grep` notebook detection with
tj-actions/changed-files. Cuts ~15 lines of brittle bash and handles
rename/move events correctly.
- Drop the trailing "we do NOT diff" comment block; the rationale lives
in commit history, not in the YAML.
preview.yaml: drop fetch-depth: 0 on the lib clone (only HEAD is built).
strip_widget_metadata.py: docstring referenced the removed diff check
in execute.yaml; rewrite to the actual remaining justification (small
committed notebooks, clean PR diffs).
.pre-commit-config.yaml: drop redundant `require_serial: false`
(default value).
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@scversescverse deleted a comment from github-actionsBotMay 11, 2026
@github-actions

github-actionsBot commented May 11, 2026

Copy link
Copy Markdown

📖 Docs preview: https://scverse.org/spatialdata-plot-notebooks/pr-2/gallery.html

Built from 8e79eaa; redeployed on every push.

Tutorials are kept for entry-point material that teaches the API on
synthetic data; examples/ hosts notebooks that demonstrate the API on
real datasets you'd actually analyse. Visium fits the latter.
github-actionsBot pushed a commit that referenced this pull request May 11, 2026
@timtreis
timtreis merged commit 48fb273 into mainMay 11, 2026
4 checks passed
@timtreis
timtreis deleted the feat/visium-tutorial branch May 11, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@timtreis