babelplot 2025.1__tar.gz → 2025.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {babelplot-2025.1 → babelplot-2025.3}/PKG-INFO +14 -2
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/__init__.py +13 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/catalog/bokeh_.py +10 -5
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/catalog/matplotlib_.py +32 -11
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/catalog/plotly_.py +10 -5
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/catalog/vedo_.py +10 -5
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/helper/validation.py +2 -2
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/main.py +2 -2
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/specification/plot.py +10 -6
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/type/base.py +7 -5
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/type/figure.py +4 -4
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/type/frame.py +13 -3
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/version.py +1 -1
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot.egg-info/PKG-INFO +14 -2
- {babelplot-2025.1 → babelplot-2025.3}/MANIFEST.in +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/README-COPYRIGHT-utf8.txt +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/README-LICENCE-utf8.txt +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/README.rst +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/documentation/wiki/description.asciidoc +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/helper/creation.py +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/specification/backend.py +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/backend/specification/runtime.py +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/constant/backend.py +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/constant/project.py +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/extension/enum_.py +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/help.py +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/specification/dimension.py +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/task/show_pyqt6.py +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot/type/plot.py +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot.egg-info/SOURCES.txt +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot.egg-info/dependency_links.txt +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot.egg-info/requires.txt +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/package/babelplot.egg-info/top_level.txt +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/pyproject.toml +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/requirements.txt +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/setup.cfg +0 -0
- {babelplot-2025.1 → babelplot-2025.3}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: babelplot
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.3
|
|
4
4
|
Summary: A Meta Plotting Library That Speaks Several Backends
|
|
5
5
|
Home-page: https://src.koda.cnrs.fr/eric.debreuve/babelplot/
|
|
6
6
|
Author: Eric Debreuve
|
|
@@ -19,6 +19,18 @@ Description-Content-Type: text/x-rst
|
|
|
19
19
|
Requires-Dist: numpy
|
|
20
20
|
Requires-Dist: PyQt6
|
|
21
21
|
Requires-Dist: scikit-image
|
|
22
|
+
Dynamic: author
|
|
23
|
+
Dynamic: author-email
|
|
24
|
+
Dynamic: classifier
|
|
25
|
+
Dynamic: description
|
|
26
|
+
Dynamic: description-content-type
|
|
27
|
+
Dynamic: home-page
|
|
28
|
+
Dynamic: keywords
|
|
29
|
+
Dynamic: license
|
|
30
|
+
Dynamic: project-url
|
|
31
|
+
Dynamic: requires-dist
|
|
32
|
+
Dynamic: requires-python
|
|
33
|
+
Dynamic: summary
|
|
22
34
|
|
|
23
35
|
..
|
|
24
36
|
Copyright CNRS/Inria/UniCA
|
|
@@ -4,6 +4,19 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2022
|
|
|
4
4
|
SEE COPYRIGHT NOTICE BELOW
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
+
try:
|
|
8
|
+
from beartype.claw import beartype_this_package # noqa
|
|
9
|
+
except ModuleNotFoundError:
|
|
10
|
+
pass
|
|
11
|
+
else:
|
|
12
|
+
import site
|
|
13
|
+
from pathlib import Path as path_t
|
|
14
|
+
|
|
15
|
+
paths = site.getsitepackages() + [site.getusersitepackages()]
|
|
16
|
+
folder = path_t(__file__).parent
|
|
17
|
+
if folder not in paths:
|
|
18
|
+
beartype_this_package()
|
|
19
|
+
|
|
7
20
|
from babelplot.backend.specification.backend import backend_e
|
|
8
21
|
from babelplot.main import NewFigure, NewPlot
|
|
9
22
|
from babelplot.specification.plot import plot_e
|
|
@@ -33,11 +33,16 @@ backend_frame_t = backend_figure_t
|
|
|
33
33
|
def _NewPlot(
|
|
34
34
|
frame: backend_frame_t,
|
|
35
35
|
type_: plot_type_h | type[backend_plot_t],
|
|
36
|
-
plot_function:
|
|
36
|
+
plot_function: (
|
|
37
|
+
type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any] | None
|
|
38
|
+
),
|
|
37
39
|
*args,
|
|
38
40
|
title: str | None = None, # If _, then it is swallowed by kwargs!
|
|
39
41
|
**kwargs,
|
|
40
|
-
) -> tuple[
|
|
42
|
+
) -> tuple[
|
|
43
|
+
backend_plot_t | h.Any,
|
|
44
|
+
type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any],
|
|
45
|
+
]:
|
|
41
46
|
""""""
|
|
42
47
|
if plot_function is None:
|
|
43
48
|
if hasattr(backend_frame_t, type_):
|
|
@@ -88,15 +93,15 @@ def _AsHTML(figure: figure_t, /) -> str:
|
|
|
88
93
|
|
|
89
94
|
|
|
90
95
|
# noinspection PyTypeChecker
|
|
91
|
-
plot_t: base_plot_t = type("plot_t", (base_plot_t,), {})
|
|
96
|
+
plot_t: type[base_plot_t] = type("plot_t", (base_plot_t,), {})
|
|
92
97
|
# noinspection PyTypeChecker
|
|
93
|
-
frame_t: base_frame_t = type(
|
|
98
|
+
frame_t: type[base_frame_t] = type(
|
|
94
99
|
"frame_t",
|
|
95
100
|
(base_frame_t,),
|
|
96
101
|
{"plot_class": plot_t, "NewBackendPlot": staticmethod(_NewPlot)},
|
|
97
102
|
)
|
|
98
103
|
# noinspection PyTypeChecker
|
|
99
|
-
figure_t: base_figure_t = type(
|
|
104
|
+
figure_t: type[base_figure_t] = type(
|
|
100
105
|
"figure_t",
|
|
101
106
|
(base_figure_t,),
|
|
102
107
|
{
|
|
@@ -18,7 +18,7 @@ from babelplot.type.base import backend_element_h, backend_plot_h
|
|
|
18
18
|
from babelplot.type.figure import figure_t as base_figure_t
|
|
19
19
|
from babelplot.type.frame import frame_t as base_frame_t
|
|
20
20
|
from babelplot.type.plot import plot_t as base_plot_t
|
|
21
|
-
from logger_36 import
|
|
21
|
+
from logger_36 import L
|
|
22
22
|
from matplotlib.artist import Artist as backend_plot_t # noqa
|
|
23
23
|
from matplotlib.container import Container as backend_plots_t # noqa
|
|
24
24
|
from matplotlib.gridspec import GridSpec as grid_spec_t # noqa
|
|
@@ -40,12 +40,17 @@ backend_frame_h = backend_frame_2d_t | backend_frame_3d_t
|
|
|
40
40
|
|
|
41
41
|
def _NewPlot(
|
|
42
42
|
frame: backend_frame_h,
|
|
43
|
-
type_: plot_type_h | type[
|
|
44
|
-
plot_function:
|
|
43
|
+
type_: plot_type_h | type[backend_plot_t],
|
|
44
|
+
plot_function: (
|
|
45
|
+
type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any] | None
|
|
46
|
+
),
|
|
45
47
|
*args,
|
|
46
48
|
title: str | None = None, # /!\ If _, then it is swallowed by kwargs!
|
|
47
49
|
**kwargs,
|
|
48
|
-
) -> tuple[
|
|
50
|
+
) -> tuple[
|
|
51
|
+
backend_plot_t | h.Any,
|
|
52
|
+
type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any],
|
|
53
|
+
]:
|
|
49
54
|
""""""
|
|
50
55
|
if plot_function is None:
|
|
51
56
|
# Next, priority is given to 2-D plots... which might be a problem if a 2-D and
|
|
@@ -136,8 +141,19 @@ def _DefaultProperties(type_: h.Callable, /) -> dict[str, h.Any]:
|
|
|
136
141
|
return {_key.replace(f"{name}.", ""): _vle for _key, _vle in properties.items()}
|
|
137
142
|
|
|
138
143
|
|
|
139
|
-
def _SetProperty(
|
|
144
|
+
def _SetProperty(
|
|
145
|
+
element: backend_element_h | h.Sequence[backend_element_h],
|
|
146
|
+
name: str,
|
|
147
|
+
value: h.Any,
|
|
148
|
+
/,
|
|
149
|
+
) -> None:
|
|
140
150
|
""""""
|
|
151
|
+
if isinstance(element, h.Sequence):
|
|
152
|
+
elements = element
|
|
153
|
+
for element in elements:
|
|
154
|
+
_SetProperty(element, name, value)
|
|
155
|
+
return
|
|
156
|
+
|
|
141
157
|
if name == "marker":
|
|
142
158
|
new_marker = marker_style_t(value)
|
|
143
159
|
element.set_paths((new_marker.get_path(),))
|
|
@@ -146,18 +162,23 @@ def _SetProperty(element: backend_element_h, name: str, value: h.Any, /) -> None
|
|
|
146
162
|
try:
|
|
147
163
|
pypl.setp(element, **property_)
|
|
148
164
|
except AttributeError:
|
|
149
|
-
|
|
165
|
+
L.error(
|
|
150
166
|
f'Property "{name}": Invalid property for element of type "{type(element).__name__}"'
|
|
151
167
|
)
|
|
152
168
|
|
|
153
169
|
|
|
154
|
-
def _Property(
|
|
170
|
+
def _Property(
|
|
171
|
+
element: backend_element_h | h.Sequence[backend_element_h], name: str, /
|
|
172
|
+
) -> h.Any:
|
|
155
173
|
""""""
|
|
174
|
+
if isinstance(element, h.Sequence):
|
|
175
|
+
return _Property(element[0], name)
|
|
176
|
+
|
|
156
177
|
try:
|
|
157
178
|
output = pypl.getp(element, property=name)
|
|
158
179
|
except AttributeError:
|
|
159
180
|
output = None
|
|
160
|
-
|
|
181
|
+
L.error(
|
|
161
182
|
f'Property "{name}": Invalid property for element of type "{type(element).__name__}"'
|
|
162
183
|
)
|
|
163
184
|
|
|
@@ -165,7 +186,7 @@ def _Property(element: backend_element_h, name: str, /) -> h.Any:
|
|
|
165
186
|
|
|
166
187
|
|
|
167
188
|
# noinspection PyTypeChecker
|
|
168
|
-
plot_t: base_plot_t = type(
|
|
189
|
+
plot_t: type[base_plot_t] = type(
|
|
169
190
|
"plot_t",
|
|
170
191
|
(base_plot_t,),
|
|
171
192
|
{
|
|
@@ -175,7 +196,7 @@ plot_t: base_plot_t = type(
|
|
|
175
196
|
},
|
|
176
197
|
)
|
|
177
198
|
# noinspection PyTypeChecker
|
|
178
|
-
frame_t: base_frame_t = type(
|
|
199
|
+
frame_t: type[base_frame_t] = type(
|
|
179
200
|
"frame_t",
|
|
180
201
|
(base_frame_t,),
|
|
181
202
|
{
|
|
@@ -186,7 +207,7 @@ frame_t: base_frame_t = type(
|
|
|
186
207
|
},
|
|
187
208
|
)
|
|
188
209
|
# noinspection PyTypeChecker
|
|
189
|
-
figure_t: base_figure_t = type(
|
|
210
|
+
figure_t: type[base_figure_t] = type(
|
|
190
211
|
"figure_t",
|
|
191
212
|
(base_figure_t,),
|
|
192
213
|
{
|
|
@@ -47,11 +47,16 @@ _FIGURE_CONFIG = {
|
|
|
47
47
|
def _NewPlot(
|
|
48
48
|
_: backend_frame_h,
|
|
49
49
|
type_: plot_type_h | type[backend_plot_t],
|
|
50
|
-
plot_function:
|
|
50
|
+
plot_function: (
|
|
51
|
+
type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any] | None
|
|
52
|
+
),
|
|
51
53
|
*args,
|
|
52
54
|
title: str | None = None, # If _, then it is swallowed by kwargs!
|
|
53
55
|
**kwargs,
|
|
54
|
-
) -> tuple[
|
|
56
|
+
) -> tuple[
|
|
57
|
+
backend_plot_t | h.Any,
|
|
58
|
+
type[backend_plot_t] | h.Callable[..., backend_plot_t | h.Any],
|
|
59
|
+
]:
|
|
55
60
|
""""""
|
|
56
61
|
if plot_function is None:
|
|
57
62
|
if hasattr(plly, type_):
|
|
@@ -125,15 +130,15 @@ def _AsHTML(figure: figure_t, /) -> str:
|
|
|
125
130
|
|
|
126
131
|
|
|
127
132
|
# noinspection PyTypeChecker
|
|
128
|
-
plot_t: base_plot_t = type("plot_t", (base_plot_t,), {})
|
|
133
|
+
plot_t: type[base_plot_t] = type("plot_t", (base_plot_t,), {})
|
|
129
134
|
# noinspection PyTypeChecker
|
|
130
|
-
frame_t: base_frame_t = type(
|
|
135
|
+
frame_t: type[base_frame_t] = type(
|
|
131
136
|
"frame_t",
|
|
132
137
|
(base_frame_t,),
|
|
133
138
|
{"plot_class": plot_t, "NewBackendPlot": staticmethod(_NewPlot)},
|
|
134
139
|
)
|
|
135
140
|
# noinspection PyTypeChecker
|
|
136
|
-
figure_t: base_figure_t = type(
|
|
141
|
+
figure_t: type[base_figure_t] = type(
|
|
137
142
|
"figure_t",
|
|
138
143
|
(base_figure_t,),
|
|
139
144
|
{
|
|
@@ -30,11 +30,16 @@ backend_frame_t = backend_figure_t
|
|
|
30
30
|
def _NewPlot(
|
|
31
31
|
frame: backend_frame_t,
|
|
32
32
|
type_: plot_type_h | type[backend_plot_h],
|
|
33
|
-
plot_function:
|
|
33
|
+
plot_function: (
|
|
34
|
+
type[backend_plot_h] | h.Callable[..., backend_plot_h | h.Any] | None
|
|
35
|
+
),
|
|
34
36
|
*args,
|
|
35
37
|
title: str | None = None, # If _, then it is swallowed by kwargs!
|
|
36
38
|
**kwargs,
|
|
37
|
-
) -> tuple[
|
|
39
|
+
) -> tuple[
|
|
40
|
+
backend_plot_h | h.Any,
|
|
41
|
+
type[backend_plot_h] | h.Callable[..., backend_plot_h | h.Any],
|
|
42
|
+
]:
|
|
38
43
|
""""""
|
|
39
44
|
if plot_function is None:
|
|
40
45
|
if hasattr(vedo, type_):
|
|
@@ -70,15 +75,15 @@ def _Show(
|
|
|
70
75
|
|
|
71
76
|
|
|
72
77
|
# noinspection PyTypeChecker
|
|
73
|
-
plot_t: base_plot_t = type("plot_t", (base_plot_t,), {})
|
|
78
|
+
plot_t: type[base_plot_t] = type("plot_t", (base_plot_t,), {})
|
|
74
79
|
# noinspection PyTypeChecker
|
|
75
|
-
frame_t: base_frame_t = type(
|
|
80
|
+
frame_t: type[base_frame_t] = type(
|
|
76
81
|
"frame_t",
|
|
77
82
|
(base_frame_t,),
|
|
78
83
|
{"plot_class": plot_t, "NewBackendPlot": staticmethod(_NewPlot)},
|
|
79
84
|
)
|
|
80
85
|
# noinspection PyTypeChecker
|
|
81
|
-
figure_t: base_figure_t = type(
|
|
86
|
+
figure_t: type[base_figure_t] = type(
|
|
82
87
|
"figure_t",
|
|
83
88
|
(base_figure_t,),
|
|
84
89
|
{
|
|
@@ -14,7 +14,7 @@ from types import FunctionType as function_type_t
|
|
|
14
14
|
from types import ModuleType as module_type_t
|
|
15
15
|
|
|
16
16
|
from babelplot.specification.plot import plot_e
|
|
17
|
-
from logger_36 import
|
|
17
|
+
from logger_36 import L
|
|
18
18
|
|
|
19
19
|
py_module_h = h.TypeVar("py_module_h", bound=str) # E.g. module.submodule.
|
|
20
20
|
module_path_t = str
|
|
@@ -73,7 +73,7 @@ def DefinedBackendMethods(
|
|
|
73
73
|
output = {}
|
|
74
74
|
|
|
75
75
|
if not hasattr(imported, target_class):
|
|
76
|
-
|
|
76
|
+
L.error(f'{module}: Does not define a "{target_class}" class')
|
|
77
77
|
return {}
|
|
78
78
|
|
|
79
79
|
target_class = getattr(imported, target_class)
|
|
@@ -18,7 +18,7 @@ from babelplot.type.base import backend_plot_h
|
|
|
18
18
|
from babelplot.type.figure import figure_t
|
|
19
19
|
from babelplot.type.frame import frame_t
|
|
20
20
|
from babelplot.type.plot import plot_t
|
|
21
|
-
from logger_36 import
|
|
21
|
+
from logger_36 import L
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
def NewFigure(
|
|
@@ -48,7 +48,7 @@ def NewFigure(
|
|
|
48
48
|
try:
|
|
49
49
|
module = mprt.import_module(f"{BACKEND_FOLDER_PY}.{pbe.value}_")
|
|
50
50
|
except ModuleNotFoundError:
|
|
51
|
-
|
|
51
|
+
L.error(
|
|
52
52
|
f"{pbe.value}: Unusable backend. "
|
|
53
53
|
f"Might be due to backend not being installed "
|
|
54
54
|
f"or implementation error in backend."
|
|
@@ -11,7 +11,12 @@ from operator import itemgetter as ItemAt
|
|
|
11
11
|
|
|
12
12
|
from babelplot.extension.enum_ import EnumMembers, EnumValues
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
|
|
15
|
+
class _unavailable_for_this_dim:
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
UNAVAILABLE_for_this_DIM = _unavailable_for_this_dim()
|
|
15
20
|
UNDEFINED_PARAMETER = "__UNDEFINED_PARAMETER__"
|
|
16
21
|
|
|
17
22
|
|
|
@@ -62,7 +67,7 @@ class plot_e(enum_t):
|
|
|
62
67
|
):
|
|
63
68
|
for d_idx, for_dim in enumerate(value):
|
|
64
69
|
if isinstance(
|
|
65
|
-
for_dim, (
|
|
70
|
+
for_dim, (_unavailable_for_this_dim, h.Callable)
|
|
66
71
|
):
|
|
67
72
|
pass
|
|
68
73
|
else:
|
|
@@ -139,7 +144,8 @@ KNOWN_PLOT_TYPES = EnumValues(plot_e)
|
|
|
139
144
|
|
|
140
145
|
|
|
141
146
|
plot_type_h = str | plot_e
|
|
142
|
-
|
|
147
|
+
# List, and not tuple, to allow for population by backends.
|
|
148
|
+
backend_plots_per_type_h = list[_unavailable_for_this_dim | h.Callable]
|
|
143
149
|
backend_plots_h = dict[plot_e, backend_plots_per_type_h]
|
|
144
150
|
|
|
145
151
|
|
|
@@ -285,9 +291,7 @@ PLOT_DESCRIPTION = {
|
|
|
285
291
|
}
|
|
286
292
|
|
|
287
293
|
|
|
288
|
-
def PlotsFromTemplate() ->
|
|
289
|
-
dict[plot_e, list[type[UNAVAILABLE_for_this_DIM] | h.Callable]]
|
|
290
|
-
):
|
|
294
|
+
def PlotsFromTemplate() -> dict[plot_e, list[_unavailable_for_this_dim | h.Callable]]:
|
|
291
295
|
""""""
|
|
292
296
|
return {_key: 3 * [UNAVAILABLE_for_this_DIM] for _key in PLOT_DESCRIPTION.keys()}
|
|
293
297
|
|
|
@@ -9,12 +9,12 @@ import typing as h
|
|
|
9
9
|
|
|
10
10
|
from babelplot.backend.specification.runtime import BackendTranslations
|
|
11
11
|
from babelplot.specification.plot import TranslatedArguments
|
|
12
|
-
from logger_36 import
|
|
12
|
+
from logger_36 import L
|
|
13
13
|
|
|
14
14
|
backend_figure_h = h.TypeVar("backend_figure_h")
|
|
15
15
|
backend_frame_h = h.TypeVar("backend_frame_h")
|
|
16
16
|
backend_plot_h = h.TypeVar("backend_plot_h")
|
|
17
|
-
backend_element_h = backend_figure_h | backend_frame_h | backend_plot_h
|
|
17
|
+
backend_element_h = backend_figure_h | backend_frame_h | backend_plot_h | h.Any
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
@dtcl.dataclass(repr=False, eq=False)
|
|
@@ -25,6 +25,8 @@ class babelplot_element_t:
|
|
|
25
25
|
they are stored here. E.g., how to retrieve the marker of a scatter plot in
|
|
26
26
|
Matplotlib?
|
|
27
27
|
/!\\ Do not forget to initialize it with kwargs during element instantiation.
|
|
28
|
+
backend: Certain plots of certain libraries might be composed of a list of plots,
|
|
29
|
+
not just a unique plot, or even richer outputs (e.g., with Matplotlib).
|
|
28
30
|
"""
|
|
29
31
|
|
|
30
32
|
pbe: str | None = None
|
|
@@ -36,14 +38,14 @@ class babelplot_element_t:
|
|
|
36
38
|
element: backend_element_h, name: str, value: h.Any, /
|
|
37
39
|
) -> None:
|
|
38
40
|
""""""
|
|
39
|
-
|
|
41
|
+
L.warning(
|
|
40
42
|
f"{babelplot_element_t.BackendSetProperty.__name__}: Not provided by backend."
|
|
41
43
|
)
|
|
42
44
|
|
|
43
45
|
@staticmethod
|
|
44
46
|
def BackendProperty(element: backend_element_h, name: str, /) -> h.Any:
|
|
45
47
|
""""""
|
|
46
|
-
|
|
48
|
+
L.warning(
|
|
47
49
|
f"{babelplot_element_t.BackendProperty.__name__}: Not provided by backend."
|
|
48
50
|
)
|
|
49
51
|
|
|
@@ -55,7 +57,7 @@ class babelplot_element_t:
|
|
|
55
57
|
|
|
56
58
|
if (n_properties := args.__len__()) > 0:
|
|
57
59
|
if (n_properties % 2) > 0:
|
|
58
|
-
|
|
60
|
+
L.error(
|
|
59
61
|
f"N. argument(s)={n_properties}: Properties not passed in matching key-value pairs. "
|
|
60
62
|
f"Expected=Even number."
|
|
61
63
|
)
|
|
@@ -15,7 +15,7 @@ from babelplot.specification.plot import TranslatedArguments
|
|
|
15
15
|
from babelplot.type.base import babelplot_element_t as base_figure_t
|
|
16
16
|
from babelplot.type.base import backend_figure_h, backend_frame_h
|
|
17
17
|
from babelplot.type.frame import frame_t
|
|
18
|
-
from logger_36 import
|
|
18
|
+
from logger_36 import L
|
|
19
19
|
|
|
20
20
|
_un_shown_figures = []
|
|
21
21
|
_shown_figures = []
|
|
@@ -57,10 +57,10 @@ class figure_t(base_figure_t):
|
|
|
57
57
|
dim = dim_e.NewFromName(dim)
|
|
58
58
|
|
|
59
59
|
if (where := (row, col)) in self.locations:
|
|
60
|
-
|
|
60
|
+
L.error(f"{where}: Frame grid cell already filled")
|
|
61
61
|
return None
|
|
62
62
|
if (row < 0) and (col < 0):
|
|
63
|
-
|
|
63
|
+
L.error(f"{where}: Grid coordinates cannot be both negative")
|
|
64
64
|
return None
|
|
65
65
|
if row < 0:
|
|
66
66
|
row = self.shape[0]
|
|
@@ -89,7 +89,7 @@ class figure_t(base_figure_t):
|
|
|
89
89
|
def LocationOfFrame(self, frame: frame_t, /) -> tuple[int, int] | None:
|
|
90
90
|
""""""
|
|
91
91
|
if frame not in self.frames:
|
|
92
|
-
|
|
92
|
+
L.error(f"{frame}: Not a frame of the figure.")
|
|
93
93
|
return None
|
|
94
94
|
|
|
95
95
|
where = self.frames.index(frame)
|
|
@@ -10,7 +10,11 @@ import typing as h
|
|
|
10
10
|
|
|
11
11
|
from babelplot.backend.specification.runtime import BackendPlots, BackendTranslations
|
|
12
12
|
from babelplot.specification.dimension import FRAME_DIM_FOR_DATA_DIM, dim_e
|
|
13
|
-
from babelplot.specification.plot import
|
|
13
|
+
from babelplot.specification.plot import (
|
|
14
|
+
KNOWN_PLOT_TYPES,
|
|
15
|
+
TranslatedArguments,
|
|
16
|
+
plot_type_h,
|
|
17
|
+
)
|
|
14
18
|
from babelplot.type.base import babelplot_element_t as base_frame_t
|
|
15
19
|
from babelplot.type.base import backend_frame_h, backend_plot_h
|
|
16
20
|
from babelplot.type.plot import BackendPlotFromAny, plot_t
|
|
@@ -85,12 +89,18 @@ class frame_t(base_frame_t):
|
|
|
85
89
|
|
|
86
90
|
def NewBackendPlot(
|
|
87
91
|
self,
|
|
92
|
+
_: backend_frame_h,
|
|
88
93
|
type_: plot_type_w_pbe_h,
|
|
89
|
-
plot_function:
|
|
94
|
+
plot_function: (
|
|
95
|
+
type[backend_plot_h] | h.Callable[..., backend_plot_h | h.Any] | None
|
|
96
|
+
),
|
|
90
97
|
*args,
|
|
91
98
|
title: str | None = None,
|
|
92
99
|
**kwargs,
|
|
93
|
-
) -> tuple[
|
|
100
|
+
) -> tuple[
|
|
101
|
+
backend_plot_h | h.Any,
|
|
102
|
+
type[backend_plot_h] | h.Callable[..., backend_plot_h | h.Any],
|
|
103
|
+
]:
|
|
94
104
|
"""
|
|
95
105
|
The returned object should be backend_plot_h. However, some backends might not
|
|
96
106
|
have a specific class for each plot type. For example, Matplotlib returns an
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: babelplot
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.3
|
|
4
4
|
Summary: A Meta Plotting Library That Speaks Several Backends
|
|
5
5
|
Home-page: https://src.koda.cnrs.fr/eric.debreuve/babelplot/
|
|
6
6
|
Author: Eric Debreuve
|
|
@@ -19,6 +19,18 @@ Description-Content-Type: text/x-rst
|
|
|
19
19
|
Requires-Dist: numpy
|
|
20
20
|
Requires-Dist: PyQt6
|
|
21
21
|
Requires-Dist: scikit-image
|
|
22
|
+
Dynamic: author
|
|
23
|
+
Dynamic: author-email
|
|
24
|
+
Dynamic: classifier
|
|
25
|
+
Dynamic: description
|
|
26
|
+
Dynamic: description-content-type
|
|
27
|
+
Dynamic: home-page
|
|
28
|
+
Dynamic: keywords
|
|
29
|
+
Dynamic: license
|
|
30
|
+
Dynamic: project-url
|
|
31
|
+
Dynamic: requires-dist
|
|
32
|
+
Dynamic: requires-python
|
|
33
|
+
Dynamic: summary
|
|
22
34
|
|
|
23
35
|
..
|
|
24
36
|
Copyright CNRS/Inria/UniCA
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|