Skip to content

Commit 4b5f93d

Browse files
authored
Merge pull request #4 from mpl-extensions/fix-doc2
feat: add stacked images + add more tests + fix docs
2 parents e2134bd + 2892fb3 commit 4b5f93d

File tree

16 files changed

+741
-163
lines changed

16 files changed

+741
-163
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ jobs:
4949
pip install -e ".[test]"
5050
5151
- name: Test
52-
run: pytest -v --color=yes --cov=pymmcore_plus --cov-report=xml
52+
run: pytest -v --color=yes --cov=mpl_image_segmenter --cov-report=xml
5353

5454
- name: Coverage
5555
uses: codecov/codecov-action@v3

.readthedocs.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
version: 2
2+
python:
3+
version: 3.8
4+
install:
5+
- method: pip
6+
path: .
7+
extra_requirements:
8+
- doc
9+
10+
# Build documentation in the docs/ directory with Sphinx
11+
sphinx:
12+
configuration: docs/conf.py

docs/_static/images/segment.gif

3.01 MB
Loading

docs/conf.py

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"--no-toc",
4343
"--templatedir _templates",
4444
"--separate",
45-
"../mpl_image_segmenter/",
45+
"../src/mpl_image_segmenter/",
4646
# excluded modules
4747
# nothing here for cookiecutter
4848
]
@@ -57,21 +57,16 @@
5757
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
5858
# ones.
5959
extensions = [
60-
"jupyter_sphinx",
6160
"myst_nb",
61+
"sphinx_copybutton",
62+
"sphinx.ext.napoleon",
6263
"numpydoc",
6364
"sphinx.ext.autodoc",
65+
"sphinx.ext.inheritance_diagram",
66+
"autoapi.sphinx",
6467
"sphinx.ext.intersphinx",
65-
"sphinx.ext.linkcode",
66-
"sphinx.ext.mathjax",
67-
"sphinx.ext.napoleon",
68-
"sphinx_copybutton",
69-
"sphinx_panels",
70-
"sphinx_thebe",
71-
"sphinx_togglebutton",
7268
]
7369

74-
7570
# API settings
7671
autodoc_default_options = {
7772
"members": True,
@@ -116,10 +111,6 @@
116111
linkcheck_ignore = [] # type: ignore
117112

118113
execution_timeout = -1
119-
jupyter_execute_notebooks = "off"
120-
if "EXECUTE_NB" in os.environ:
121-
print("\033[93;1mWill run Jupyter notebooks!\033[0m")
122-
jupyter_execute_notebooks = "force"
123114

124115
# Settings for myst-parser
125116
myst_enable_extensions = [
@@ -156,32 +147,14 @@
156147
html_css_files = [
157148
"custom.css",
158149
]
159-
html_sourcelink_suffix = ""
160-
html_static_path = ["_static"]
161-
html_theme = "sphinx_book_theme"
162-
html_theme_options = {
163-
"launch_buttons": {
164-
"binderhub_url": "https://mybinder.org",
165-
"colab_url": "https://colab.research.google.com",
166-
"notebook_interface": "jupyterlab",
167-
"thebe": True,
168-
"thebelab": True,
169-
},
170-
"path_to_docs": "docs",
171-
"repository_branch": "main",
172-
"repository_url": "https://github.com/ianhi/mpl-image-segmenter",
173-
"use_download_button": True,
174-
"use_edit_page_button": True,
175-
"use_issues_button": True,
176-
"use_repository_button": True,
177-
}
178150
html_title = "mpl-image-segmenter"
151+
html_theme = "furo"
179152

180153
master_doc = "index"
181-
thebe_config = {
182-
"repository_url": html_theme_options["repository_url"],
183-
"repository_branch": html_theme_options["repository_branch"],
184-
}
154+
# thebe_config = {
155+
# "repository_url": html_theme_options["repository_url"],
156+
# "repository_branch": html_theme_options["repository_branch"],
157+
# }
185158

186159

187160
# based on pandas/doc/source/conf.py

docs/differences.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ On moving to it's own package a few changes to API were made.
1010
The class is now named `ImageSegmenter`
1111
**mpl-image-segmenter**
1212
```python
13-
from mpl-image-segmenter import ImageSegmenter
13+
from mpl_image_segmenter import ImageSegmenter
1414

1515
segmenter = ImageSegmenter(img)
1616
```
1717

1818
**mpl-interactions**
1919
```python
20-
from mpl-interactions import image_segmenter
20+
from mpl_interactions import image_segmenter
2121
segmenter = image_segmenter(img)
2222
```
2323

@@ -26,6 +26,7 @@ segmenter = image_segmenter(img)
2626
The `lineprops` argument has been dropped in favor `props` to be consistent with
2727
Matplotlib 3.7+.
2828

29+
The `color_image` argument was introduced in order to allow for the new behavior of allowing a stack of images.
2930

3031
## Properties
3132

@@ -34,3 +35,6 @@ Matplotlib 3.7+.
3435

3536

3637
`segmenter.verts` which was never fully functional has been removed and replaced by `segmenter.get_paths()`
38+
39+
## Stacking
40+
You can now pass a stack of images, and control which is currently displayed using the `image_index` property.

docs/examples/basic-example.ipynb

Lines changed: 0 additions & 56 deletions
This file was deleted.

docs/examples/ipywidgets.ipynb

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"id": "b0664eca-1f81-43ae-8f4a-d514b86a5bf5",
6+
"metadata": {},
7+
"source": [
8+
"# Integration with ipywidgets\n",
9+
"\n",
10+
"To reduce friction in the labelling workflow you can construct controls for the currently selected class and whether to be in erasing mode using ipywidgets."
11+
]
12+
},
13+
{
14+
"cell_type": "code",
15+
"execution_count": null,
16+
"id": "f1bab7f9-34df-463e-b6ec-52df6fba5737",
17+
"metadata": {
18+
"tags": []
19+
},
20+
"outputs": [],
21+
"source": [
22+
"%matplotlib ipympl"
23+
]
24+
},
25+
{
26+
"cell_type": "code",
27+
"execution_count": null,
28+
"id": "a5ad14e1-4525-4093-bd7d-449a355784a5",
29+
"metadata": {
30+
"tags": []
31+
},
32+
"outputs": [],
33+
"source": [
34+
"import ipywidgets as widgets\n",
35+
"from mpl_image_segmenter import ImageSegmenter\n",
36+
"from mpl_image_segmenter.example_images import gray_image_stack\n",
37+
"\n",
38+
"\n",
39+
"image_stack = gray_image_stack()\n",
40+
"\n",
41+
"N_classes = 3\n",
42+
"\n",
43+
"\n",
44+
"\n",
45+
"segmenter = ImageSegmenter(image_stack, classes=N_classes, mask_alpha=0.76, cmap='gray')\n",
46+
"\n",
47+
"def set_class(change):\n",
48+
" segmenter.current_class = class_selector.value\n",
49+
"\n",
50+
"def set_erasing(change):\n",
51+
" segmenter.erasing = erasing_button.value\n",
52+
"\n",
53+
"def set_img(change):\n",
54+
" segmenter.image_index = change['new']\n",
55+
"\n",
56+
"class_selector = widgets.Dropdown(options=list(range(1, N_classes + 1)), description=\"class\")\n",
57+
"img_slider = widgets.IntSlider(value=0, min=0, max=image_stack.shape[0]-1, description=\"img index\")\n",
58+
"erasing_button = widgets.Checkbox(value=False, description=\"Erasing\")\n",
59+
"\n",
60+
"erasing_button.observe(set_erasing, names=\"value\")\n",
61+
"class_selector.observe(set_class, names=\"value\")\n",
62+
"img_slider.observe(set_img, names=\"value\")\n",
63+
"\n",
64+
"display(widgets.VBox([widgets.HBox([erasing_button, class_selector, img_slider]), segmenter.fig.canvas]))"
65+
]
66+
}
67+
],
68+
"metadata": {
69+
"kernelspec": {
70+
"display_name": "Python 3 (ipykernel)",
71+
"language": "python",
72+
"name": "python3"
73+
},
74+
"language_info": {
75+
"codemirror_mode": {
76+
"name": "ipython",
77+
"version": 3
78+
},
79+
"file_extension": ".py",
80+
"mimetype": "text/x-python",
81+
"name": "python",
82+
"nbconvert_exporter": "python",
83+
"pygments_lexer": "ipython3",
84+
"version": "3.11.0"
85+
},
86+
"widgets": {
87+
"application/vnd.jupyter.widget-state+json": {
88+
"state": {},
89+
"version_major": 2,
90+
"version_minor": 0
91+
}
92+
}
93+
},
94+
"nbformat": 4,
95+
"nbformat_minor": 5
96+
}

0 commit comments

Comments
 (0)