figrecipe 0.5.0__py3-none-any.whl → 0.7.4__py3-none-any.whl
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.
- figrecipe/__init__.py +220 -819
- figrecipe/_api/__init__.py +48 -0
- figrecipe/_api/_extract.py +108 -0
- figrecipe/_api/_notebook.py +61 -0
- figrecipe/_api/_panel.py +46 -0
- figrecipe/_api/_save.py +191 -0
- figrecipe/_api/_seaborn_proxy.py +34 -0
- figrecipe/_api/_style_manager.py +153 -0
- figrecipe/_api/_subplots.py +333 -0
- figrecipe/_api/_validate.py +82 -0
- figrecipe/_dev/__init__.py +29 -0
- figrecipe/_dev/_plotters.py +76 -0
- figrecipe/_dev/_run_demos.py +56 -0
- figrecipe/_dev/demo_plotters/__init__.py +64 -0
- figrecipe/_dev/demo_plotters/_categories.py +81 -0
- figrecipe/_dev/demo_plotters/_figure_creators.py +119 -0
- figrecipe/_dev/demo_plotters/_helpers.py +31 -0
- figrecipe/_dev/demo_plotters/_registry.py +50 -0
- figrecipe/_dev/demo_plotters/bar_categorical/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/bar_categorical/plot_bar.py +25 -0
- figrecipe/_dev/demo_plotters/bar_categorical/plot_barh.py +25 -0
- figrecipe/_dev/demo_plotters/contour_surface/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/contour_surface/plot_contour.py +30 -0
- figrecipe/_dev/demo_plotters/contour_surface/plot_contourf.py +29 -0
- figrecipe/_dev/demo_plotters/contour_surface/plot_tricontour.py +28 -0
- figrecipe/_dev/demo_plotters/contour_surface/plot_tricontourf.py +28 -0
- figrecipe/_dev/demo_plotters/contour_surface/plot_tripcolor.py +29 -0
- figrecipe/_dev/demo_plotters/contour_surface/plot_triplot.py +25 -0
- figrecipe/_dev/demo_plotters/distribution/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/distribution/plot_boxplot.py +24 -0
- figrecipe/_dev/demo_plotters/distribution/plot_ecdf.py +24 -0
- figrecipe/_dev/demo_plotters/distribution/plot_hist.py +24 -0
- figrecipe/_dev/demo_plotters/distribution/plot_hist2d.py +25 -0
- figrecipe/_dev/demo_plotters/distribution/plot_violinplot.py +25 -0
- figrecipe/_dev/demo_plotters/image_matrix/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/image_matrix/plot_hexbin.py +25 -0
- figrecipe/_dev/demo_plotters/image_matrix/plot_imshow.py +23 -0
- figrecipe/_dev/demo_plotters/image_matrix/plot_matshow.py +23 -0
- figrecipe/_dev/demo_plotters/image_matrix/plot_pcolor.py +29 -0
- figrecipe/_dev/demo_plotters/image_matrix/plot_pcolormesh.py +29 -0
- figrecipe/_dev/demo_plotters/image_matrix/plot_spy.py +29 -0
- figrecipe/_dev/demo_plotters/line_curve/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/line_curve/plot_errorbar.py +28 -0
- figrecipe/_dev/demo_plotters/line_curve/plot_fill.py +29 -0
- figrecipe/_dev/demo_plotters/line_curve/plot_fill_between.py +30 -0
- figrecipe/_dev/demo_plotters/line_curve/plot_fill_betweenx.py +28 -0
- figrecipe/_dev/demo_plotters/line_curve/plot_plot.py +28 -0
- figrecipe/_dev/demo_plotters/line_curve/plot_stackplot.py +29 -0
- figrecipe/_dev/demo_plotters/line_curve/plot_stairs.py +27 -0
- figrecipe/_dev/demo_plotters/line_curve/plot_step.py +27 -0
- figrecipe/_dev/demo_plotters/scatter_points/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/scatter_points/plot_scatter.py +24 -0
- figrecipe/_dev/demo_plotters/special/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/special/plot_eventplot.py +25 -0
- figrecipe/_dev/demo_plotters/special/plot_loglog.py +27 -0
- figrecipe/_dev/demo_plotters/special/plot_pie.py +27 -0
- figrecipe/_dev/demo_plotters/special/plot_semilogx.py +27 -0
- figrecipe/_dev/demo_plotters/special/plot_semilogy.py +27 -0
- figrecipe/_dev/demo_plotters/special/plot_stem.py +27 -0
- figrecipe/_dev/demo_plotters/spectral_signal/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/spectral_signal/plot_acorr.py +24 -0
- figrecipe/_dev/demo_plotters/spectral_signal/plot_angle_spectrum.py +28 -0
- figrecipe/_dev/demo_plotters/spectral_signal/plot_cohere.py +29 -0
- figrecipe/_dev/demo_plotters/spectral_signal/plot_csd.py +29 -0
- figrecipe/_dev/demo_plotters/spectral_signal/plot_magnitude_spectrum.py +28 -0
- figrecipe/_dev/demo_plotters/spectral_signal/plot_phase_spectrum.py +28 -0
- figrecipe/_dev/demo_plotters/spectral_signal/plot_psd.py +29 -0
- figrecipe/_dev/demo_plotters/spectral_signal/plot_specgram.py +30 -0
- figrecipe/_dev/demo_plotters/spectral_signal/plot_xcorr.py +25 -0
- figrecipe/_dev/demo_plotters/vector_flow/__init__.py +4 -0
- figrecipe/_dev/demo_plotters/vector_flow/plot_barbs.py +30 -0
- figrecipe/_dev/demo_plotters/vector_flow/plot_quiver.py +30 -0
- figrecipe/_dev/demo_plotters/vector_flow/plot_streamplot.py +30 -0
- figrecipe/_editor/__init__.py +278 -0
- figrecipe/_editor/_bbox/__init__.py +43 -0
- figrecipe/_editor/_bbox/_collections.py +177 -0
- figrecipe/_editor/_bbox/_elements.py +159 -0
- figrecipe/_editor/_bbox/_extract.py +256 -0
- figrecipe/_editor/_bbox/_extract_axes.py +370 -0
- figrecipe/_editor/_bbox/_extract_text.py +342 -0
- figrecipe/_editor/_bbox/_lines.py +173 -0
- figrecipe/_editor/_bbox/_transforms.py +146 -0
- figrecipe/_editor/_flask_app.py +258 -0
- figrecipe/_editor/_helpers.py +242 -0
- figrecipe/_editor/_hitmap/__init__.py +76 -0
- figrecipe/_editor/_hitmap/_artists/__init__.py +21 -0
- figrecipe/_editor/_hitmap/_artists/_collections.py +345 -0
- figrecipe/_editor/_hitmap/_artists/_images.py +68 -0
- figrecipe/_editor/_hitmap/_artists/_lines.py +107 -0
- figrecipe/_editor/_hitmap/_artists/_patches.py +163 -0
- figrecipe/_editor/_hitmap/_artists/_text.py +190 -0
- figrecipe/_editor/_hitmap/_colors.py +181 -0
- figrecipe/_editor/_hitmap/_detect.py +137 -0
- figrecipe/_editor/_hitmap/_restore.py +154 -0
- figrecipe/_editor/_hitmap_main.py +182 -0
- figrecipe/_editor/_overrides.py +318 -0
- figrecipe/_editor/_preferences.py +135 -0
- figrecipe/_editor/_render_overrides.py +480 -0
- figrecipe/_editor/_renderer.py +199 -0
- figrecipe/_editor/_routes_axis.py +453 -0
- figrecipe/_editor/_routes_core.py +284 -0
- figrecipe/_editor/_routes_element.py +317 -0
- figrecipe/_editor/_routes_style.py +223 -0
- figrecipe/_editor/_templates/__init__.py +152 -0
- figrecipe/_editor/_templates/_html.py +502 -0
- figrecipe/_editor/_templates/_scripts/__init__.py +120 -0
- figrecipe/_editor/_templates/_scripts/_api.py +228 -0
- figrecipe/_editor/_templates/_scripts/_colors.py +485 -0
- figrecipe/_editor/_templates/_scripts/_core.py +436 -0
- figrecipe/_editor/_templates/_scripts/_debug_snapshot.py +186 -0
- figrecipe/_editor/_templates/_scripts/_element_editor.py +310 -0
- figrecipe/_editor/_templates/_scripts/_files.py +195 -0
- figrecipe/_editor/_templates/_scripts/_hitmap.py +509 -0
- figrecipe/_editor/_templates/_scripts/_inspector.py +315 -0
- figrecipe/_editor/_templates/_scripts/_labels.py +464 -0
- figrecipe/_editor/_templates/_scripts/_legend_drag.py +265 -0
- figrecipe/_editor/_templates/_scripts/_modals.py +226 -0
- figrecipe/_editor/_templates/_scripts/_overlays.py +292 -0
- figrecipe/_editor/_templates/_scripts/_panel_drag.py +334 -0
- figrecipe/_editor/_templates/_scripts/_panel_position.py +279 -0
- figrecipe/_editor/_templates/_scripts/_selection.py +237 -0
- figrecipe/_editor/_templates/_scripts/_tabs.py +89 -0
- figrecipe/_editor/_templates/_scripts/_view_mode.py +107 -0
- figrecipe/_editor/_templates/_scripts/_zoom.py +179 -0
- figrecipe/_editor/_templates/_styles/__init__.py +69 -0
- figrecipe/_editor/_templates/_styles/_base.py +64 -0
- figrecipe/_editor/_templates/_styles/_buttons.py +206 -0
- figrecipe/_editor/_templates/_styles/_color_input.py +123 -0
- figrecipe/_editor/_templates/_styles/_controls.py +265 -0
- figrecipe/_editor/_templates/_styles/_dynamic_props.py +144 -0
- figrecipe/_editor/_templates/_styles/_forms.py +126 -0
- figrecipe/_editor/_templates/_styles/_hitmap.py +184 -0
- figrecipe/_editor/_templates/_styles/_inspector.py +90 -0
- figrecipe/_editor/_templates/_styles/_labels.py +118 -0
- figrecipe/_editor/_templates/_styles/_modals.py +98 -0
- figrecipe/_editor/_templates/_styles/_overlays.py +130 -0
- figrecipe/_editor/_templates/_styles/_preview.py +225 -0
- figrecipe/_editor/_templates/_styles/_selection.py +73 -0
- figrecipe/_params/_DECORATION_METHODS.py +33 -0
- figrecipe/_params/_PLOTTING_METHODS.py +58 -0
- figrecipe/_params/__init__.py +9 -0
- figrecipe/_recorder.py +92 -110
- figrecipe/_recorder_utils.py +124 -0
- figrecipe/_reproducer/__init__.py +18 -0
- figrecipe/_reproducer/_core.py +498 -0
- figrecipe/_reproducer/_custom_plots.py +279 -0
- figrecipe/_reproducer/_seaborn.py +100 -0
- figrecipe/_reproducer/_violin.py +186 -0
- figrecipe/_seaborn.py +14 -9
- figrecipe/_serializer.py +2 -2
- figrecipe/_signatures/README.md +68 -0
- figrecipe/_signatures/__init__.py +12 -2
- figrecipe/_signatures/_kwargs.py +273 -0
- figrecipe/_signatures/_loader.py +114 -57
- figrecipe/_signatures/_parsing.py +147 -0
- figrecipe/_utils/__init__.py +6 -4
- figrecipe/_utils/_crop.py +10 -4
- figrecipe/_utils/_image_diff.py +37 -33
- figrecipe/_utils/_numpy_io.py +0 -1
- figrecipe/_utils/_units.py +11 -3
- figrecipe/_validator.py +12 -3
- figrecipe/_wrappers/_axes.py +193 -170
- figrecipe/_wrappers/_axes_helpers.py +136 -0
- figrecipe/_wrappers/_axes_plots.py +418 -0
- figrecipe/_wrappers/_axes_seaborn.py +157 -0
- figrecipe/_wrappers/_figure.py +277 -18
- figrecipe/_wrappers/_panel_labels.py +127 -0
- figrecipe/_wrappers/_plot_helpers.py +143 -0
- figrecipe/_wrappers/_violin_helpers.py +180 -0
- figrecipe/plt.py +0 -1
- figrecipe/pyplot.py +2 -1
- figrecipe/styles/__init__.py +12 -11
- figrecipe/styles/_dotdict.py +72 -0
- figrecipe/styles/_finalize.py +134 -0
- figrecipe/styles/_fonts.py +77 -0
- figrecipe/styles/_kwargs_converter.py +178 -0
- figrecipe/styles/_plot_styles.py +209 -0
- figrecipe/styles/_style_applier.py +60 -202
- figrecipe/styles/_style_loader.py +73 -121
- figrecipe/styles/_themes.py +151 -0
- figrecipe/styles/presets/MATPLOTLIB.yaml +95 -0
- figrecipe/styles/presets/SCITEX.yaml +181 -0
- figrecipe-0.7.4.dist-info/METADATA +429 -0
- figrecipe-0.7.4.dist-info/RECORD +188 -0
- figrecipe/_reproducer.py +0 -358
- figrecipe-0.5.0.dist-info/METADATA +0 -336
- figrecipe-0.5.0.dist-info/RECORD +0 -26
- {figrecipe-0.5.0.dist-info → figrecipe-0.7.4.dist-info}/WHEEL +0 -0
- {figrecipe-0.5.0.dist-info → figrecipe-0.7.4.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: figrecipe
|
|
3
|
+
Version: 0.7.4
|
|
4
|
+
Summary: Reproducible matplotlib wrapper with mm-precision layouts
|
|
5
|
+
Project-URL: Homepage, https://github.com/ywatanabe1989/figrecipe
|
|
6
|
+
Project-URL: Documentation, https://github.com/ywatanabe1989/figrecipe#readme
|
|
7
|
+
Project-URL: Repository, https://github.com/ywatanabe1989/figrecipe.git
|
|
8
|
+
Project-URL: Issues, https://github.com/ywatanabe1989/figrecipe/issues
|
|
9
|
+
Author-email: Yusuke Watanabe <ywatanabe@scitex.ai>
|
|
10
|
+
License-Expression: AGPL-3.0
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: matplotlib,millimeter,plotting,publication,recipe,reproducibility,scientific,visualization,yaml
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
23
|
+
Requires-Python: >=3.9
|
|
24
|
+
Requires-Dist: matplotlib>=3.5.0
|
|
25
|
+
Requires-Dist: numpy>=1.20.0
|
|
26
|
+
Requires-Dist: ruamel-yaml>=0.17.0
|
|
27
|
+
Requires-Dist: scipy>=1.7.0
|
|
28
|
+
Provides-Extra: all
|
|
29
|
+
Requires-Dist: flask>=2.0.0; extra == 'all'
|
|
30
|
+
Requires-Dist: pandas>=1.3.0; extra == 'all'
|
|
31
|
+
Requires-Dist: pillow>=9.0.0; extra == 'all'
|
|
32
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'all'
|
|
33
|
+
Requires-Dist: pytest>=7.0.0; extra == 'all'
|
|
34
|
+
Requires-Dist: seaborn>=0.12.0; extra == 'all'
|
|
35
|
+
Provides-Extra: dev
|
|
36
|
+
Requires-Dist: pre-commit>=3.5.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: pytest>=7.0.0; extra == 'dev'
|
|
39
|
+
Provides-Extra: editor
|
|
40
|
+
Requires-Dist: flask>=2.0.0; extra == 'editor'
|
|
41
|
+
Requires-Dist: pillow>=9.0.0; extra == 'editor'
|
|
42
|
+
Provides-Extra: imaging
|
|
43
|
+
Requires-Dist: pillow>=9.0.0; extra == 'imaging'
|
|
44
|
+
Provides-Extra: seaborn
|
|
45
|
+
Requires-Dist: pandas>=1.3.0; extra == 'seaborn'
|
|
46
|
+
Requires-Dist: seaborn>=0.12.0; extra == 'seaborn'
|
|
47
|
+
Description-Content-Type: text/markdown
|
|
48
|
+
|
|
49
|
+
<!-- ---
|
|
50
|
+
!-- Timestamp: 2025-12-22 14:49:10
|
|
51
|
+
!-- Author: ywatanabe
|
|
52
|
+
!-- File: /home/ywatanabe/proj/figrecipe/README.md
|
|
53
|
+
!-- --- -->
|
|
54
|
+
|
|
55
|
+
<p align="center">
|
|
56
|
+
<a href="https://scitex.ai" target="_blank">
|
|
57
|
+
<img src="docs/figrecipe_logo.png" alt="figrecipe logo" width="200"/>
|
|
58
|
+
</a>
|
|
59
|
+
</p>
|
|
60
|
+
|
|
61
|
+
# FigRecipe
|
|
62
|
+
|
|
63
|
+
**Reproducible matplotlib figures with mm-precision layouts.**
|
|
64
|
+
FigRecipe is a lightweight recording & reproduction layer for matplotlib,
|
|
65
|
+
designed for scientific figures that must remain **editable, inspectable,
|
|
66
|
+
and reproducible**.
|
|
67
|
+
|
|
68
|
+
Part of **SciTeX™ – Research OS for reproducible science**
|
|
69
|
+
https://scitex.ai
|
|
70
|
+
|
|
71
|
+
[](https://badge.fury.io/py/figrecipe)
|
|
72
|
+
[](https://github.com/ywatanabe1989/figrecipe/actions/workflows/test.yml)
|
|
73
|
+
[](https://www.gnu.org/licenses/agpl-3.0)
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Why FigRecipe?
|
|
78
|
+
|
|
79
|
+
In scientific workflows, figures are often:
|
|
80
|
+
- hard to reproduce once scripts change,
|
|
81
|
+
- resized manually in pixels or inches,
|
|
82
|
+
- impossible to partially reuse or inspect later.
|
|
83
|
+
|
|
84
|
+
**FigRecipe solves this by recording plotting calls as a structured “recipe”**,
|
|
85
|
+
allowing figures to be:
|
|
86
|
+
- faithfully reproduced,
|
|
87
|
+
- partially re-rendered,
|
|
88
|
+
- inspected for underlying data,
|
|
89
|
+
- laid out in **exact millimeters** for publication.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Key Features
|
|
94
|
+
|
|
95
|
+
- ✅ Drop-in replacement for `matplotlib.pyplot` (use `figrecipe.pyplot` to enable recording)
|
|
96
|
+
- ✅ Automatic recording of plotting calls
|
|
97
|
+
- ✅ Reproduce figures from a YAML recipe
|
|
98
|
+
- ✅ Extract plotted data programmatically
|
|
99
|
+
- ✅ Selective reproduction of specific plots
|
|
100
|
+
- ✅ Millimeter-based layout (journal-ready)
|
|
101
|
+
- ✅ Publication-quality style presets
|
|
102
|
+
- ✅ Dark theme support (data colors preserved)
|
|
103
|
+
- ✅ Seamless seaborn integration
|
|
104
|
+
- ✅ Crop figures to content with mm margins
|
|
105
|
+
- ✅ **Interactive GUI editor** with live preview
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Examples
|
|
110
|
+
|
|
111
|
+
📓 **[View Demo Notebook on nbviewer](https://nbviewer.org/github/ywatanabe1989/figrecipe/blob/main/examples/figrecipe_demo.ipynb)** (recommended)
|
|
112
|
+
|
|
113
|
+
The notebook includes side-by-side comparisons of original and reproduced figures.
|
|
114
|
+
|
|
115
|
+
Source: [examples/figrecipe_demo.ipynb](examples/figrecipe_demo.ipynb)
|
|
116
|
+
|
|
117
|
+
### Supported Plot Types
|
|
118
|
+
|
|
119
|
+
FigRecipe supports 46 matplotlib plot types, organized into 9 categories:
|
|
120
|
+
|
|
121
|
+
<details>
|
|
122
|
+
<summary><b>All Plot Types</b> (click to expand)</summary>
|
|
123
|
+
<p align="center">
|
|
124
|
+
<img src="docs/images/plot_types/all_plot_types.png" alt="All Plot Types" width="100%"/>
|
|
125
|
+
</p>
|
|
126
|
+
</details>
|
|
127
|
+
|
|
128
|
+
| Line & Curve | Scatter | Distribution |
|
|
129
|
+
|:---:|:---:|:---:|
|
|
130
|
+
|  |  |  |
|
|
131
|
+
|
|
132
|
+
| Bar & Categorical | Contour & Surface | 2D/Image/Matrix |
|
|
133
|
+
|:---:|:---:|:---:|
|
|
134
|
+
|  |  |  |
|
|
135
|
+
|
|
136
|
+
| Vector & Flow | Spectral & Signal | Special |
|
|
137
|
+
|:---:|:---:|:---:|
|
|
138
|
+
|  |  |  |
|
|
139
|
+
|
|
140
|
+
Generate all plots: `python examples/demo_plot_all.py`
|
|
141
|
+
|
|
142
|
+
## Installation
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
pip install figrecipe
|
|
146
|
+
|
|
147
|
+
# Optional extras
|
|
148
|
+
pip install figrecipe[seaborn] # seaborn + pandas support
|
|
149
|
+
pip install figrecipe[imaging] # image cropping (Pillow)
|
|
150
|
+
pip install figrecipe[all] # all extras
|
|
151
|
+
|
|
152
|
+
# Optional: for PDF export from notebooks (SVG → PDF)
|
|
153
|
+
sudo apt install inkscape # Linux
|
|
154
|
+
brew install inkscape # macOS
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Requirements:** Python >= 3.9
|
|
158
|
+
|
|
159
|
+
## Basic Usage
|
|
160
|
+
|
|
161
|
+
### Recording & Saving
|
|
162
|
+
|
|
163
|
+
``` python
|
|
164
|
+
import figrecipe as fr
|
|
165
|
+
# import figrecipe.pyplot as plt
|
|
166
|
+
import numpy as np
|
|
167
|
+
|
|
168
|
+
x = np.linspace(0, 10, 100)
|
|
169
|
+
y = np.sin(x)
|
|
170
|
+
|
|
171
|
+
fig, ax = fr.subplots() # or plt.subplots()
|
|
172
|
+
ax.plot(x, y, color='red', linewidth=2, id='sine_wave')
|
|
173
|
+
ax.set_xlabel('Time (s)')
|
|
174
|
+
ax.set_ylabel('Amplitude')
|
|
175
|
+
|
|
176
|
+
# Save image + recipe
|
|
177
|
+
img_path, yaml_path, result = fr.save(fig, 'figure.png')
|
|
178
|
+
# → creates: figure.png + figure.yaml
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Reproducing a Figure
|
|
182
|
+
|
|
183
|
+
``` python
|
|
184
|
+
import figrecipe as fr
|
|
185
|
+
|
|
186
|
+
fig, ax = fr.reproduce('figure.yaml')
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Extracting Plotted Data
|
|
190
|
+
|
|
191
|
+
``` python
|
|
192
|
+
import figrecipe as fr
|
|
193
|
+
|
|
194
|
+
data = fr.extract_data('figure.yaml')
|
|
195
|
+
# {'sine_wave': {'x': array([...]), 'y': array([...])}}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Millimeter-Based Layout (Publication-Ready)
|
|
199
|
+
|
|
200
|
+
``` python
|
|
201
|
+
fig, ax = fr.subplots(
|
|
202
|
+
axes_width_mm=60,
|
|
203
|
+
axes_height_mm=40,
|
|
204
|
+
margin_left_mm=15,
|
|
205
|
+
margin_bottom_mm=12,
|
|
206
|
+
)
|
|
207
|
+
```
|
|
208
|
+
This guarantees consistent sizing across editors, exports, and journals.
|
|
209
|
+
|
|
210
|
+
### Style Presets
|
|
211
|
+
|
|
212
|
+
``` python
|
|
213
|
+
fr.list_presets()
|
|
214
|
+
# ['MATPLOTLIB', 'SCITEX']
|
|
215
|
+
|
|
216
|
+
# Publication-quality preset (applied globally)
|
|
217
|
+
fr.load_style('SCITEX')
|
|
218
|
+
fig, ax = fr.subplots()
|
|
219
|
+
|
|
220
|
+
# Dark theme (UI-only, data colors preserved)
|
|
221
|
+
fr.load_style('SCITEX_DARK')
|
|
222
|
+
# or: fr.load_style('SCITEX', dark=True)
|
|
223
|
+
|
|
224
|
+
# Custom style
|
|
225
|
+
fr.load_style('/path/to/my_style.yaml')
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
See [src/figrecipe/styles/presets/](src/figrecipe/styles/presets/) for full examples.
|
|
229
|
+
|
|
230
|
+
### Interactive GUI Editor
|
|
231
|
+
|
|
232
|
+
``` python
|
|
233
|
+
import figrecipe as fr
|
|
234
|
+
import numpy as np
|
|
235
|
+
|
|
236
|
+
fig, ax = fr.subplots()
|
|
237
|
+
ax.plot(np.sin(np.linspace(0, 10, 100)))
|
|
238
|
+
|
|
239
|
+
# Launch browser-based editor
|
|
240
|
+
overrides = fr.edit(fig, port=5050)
|
|
241
|
+
|
|
242
|
+
# Returns style overrides when editor is closed (Ctrl+C)
|
|
243
|
+
# Apply overrides to future figures or save to custom YAML
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
<p align="center">
|
|
247
|
+
<img src="docs/images/gui_editor_demo.png" alt="FigRecipe GUI Editor" width="100%"/>
|
|
248
|
+
</p>
|
|
249
|
+
|
|
250
|
+
The editor provides:
|
|
251
|
+
- **Live preview** with real-time style updates
|
|
252
|
+
- **Theme switching** between SCITEX/MATPLOTLIB presets
|
|
253
|
+
- **Element selection** with hover highlighting
|
|
254
|
+
- **Property panels** for Figure, Axis, Legend, and Labels
|
|
255
|
+
- **Download** in PNG, SVG, PDF formats
|
|
256
|
+
- **Export** updated recipe YAML
|
|
257
|
+
|
|
258
|
+
| Axis Properties | Download Options | Dark Mode |
|
|
259
|
+
|:---:|:---:|:---:|
|
|
260
|
+
|  |  |  |
|
|
261
|
+
|
|
262
|
+
### Style Format (YAML)
|
|
263
|
+
|
|
264
|
+
``` yaml
|
|
265
|
+
# Timestamp: "2025-12-22 12:40:36 (ywatanabe)"
|
|
266
|
+
# File: ./src/figrecipe/styles/presets/SCITEX.yaml
|
|
267
|
+
# FIGRECIPE Style Preset
|
|
268
|
+
# ======================
|
|
269
|
+
# Publication-quality settings for scientific figures.
|
|
270
|
+
# Optimized for scientific journals with Arial font.
|
|
271
|
+
|
|
272
|
+
axes:
|
|
273
|
+
width_mm: 40
|
|
274
|
+
height_mm: 28
|
|
275
|
+
thickness_mm: 0.2
|
|
276
|
+
|
|
277
|
+
margins:
|
|
278
|
+
left_mm: 1
|
|
279
|
+
right_mm: 1
|
|
280
|
+
bottom_mm: 1
|
|
281
|
+
top_mm: 1
|
|
282
|
+
|
|
283
|
+
spacing:
|
|
284
|
+
horizontal_mm: 8
|
|
285
|
+
vertical_mm: 10
|
|
286
|
+
|
|
287
|
+
fonts:
|
|
288
|
+
family: "Arial"
|
|
289
|
+
axis_label_pt: 7
|
|
290
|
+
tick_label_pt: 7
|
|
291
|
+
title_pt: 8
|
|
292
|
+
suptitle_pt: 8
|
|
293
|
+
legend_pt: 6
|
|
294
|
+
annotation_pt: 6
|
|
295
|
+
|
|
296
|
+
padding:
|
|
297
|
+
label_pt: 2.0
|
|
298
|
+
tick_pt: 2.0
|
|
299
|
+
title_pt: 4.0
|
|
300
|
+
|
|
301
|
+
lines:
|
|
302
|
+
trace_mm: 0.2
|
|
303
|
+
errorbar_mm: 0.2
|
|
304
|
+
errorbar_cap_mm: 0.8
|
|
305
|
+
|
|
306
|
+
ticks:
|
|
307
|
+
length_mm: 0.8
|
|
308
|
+
thickness_mm: 0.2
|
|
309
|
+
direction: "out"
|
|
310
|
+
n_ticks: 4
|
|
311
|
+
|
|
312
|
+
markers:
|
|
313
|
+
size_mm: 0.8
|
|
314
|
+
scatter_mm: 0.8
|
|
315
|
+
edge_width_mm: null # None = no border (cleaner than 0)
|
|
316
|
+
|
|
317
|
+
legend:
|
|
318
|
+
frameon: false # No frame for clean look
|
|
319
|
+
bg: null # Background (null = use theme.legend_bg)
|
|
320
|
+
edgecolor: null # Frame edge color
|
|
321
|
+
alpha: 1.0 # Transparency
|
|
322
|
+
loc: "best"
|
|
323
|
+
|
|
324
|
+
output:
|
|
325
|
+
dpi: 300
|
|
326
|
+
transparent: true
|
|
327
|
+
format: "pdf"
|
|
328
|
+
|
|
329
|
+
behavior:
|
|
330
|
+
auto_scale_axes: true
|
|
331
|
+
hide_top_spine: true
|
|
332
|
+
hide_right_spine: true
|
|
333
|
+
grid: false
|
|
334
|
+
|
|
335
|
+
theme:
|
|
336
|
+
mode: "light"
|
|
337
|
+
dark:
|
|
338
|
+
figure_bg: "transparent"
|
|
339
|
+
axes_bg: "transparent"
|
|
340
|
+
legend_bg: "transparent"
|
|
341
|
+
text: "#d4d4d4"
|
|
342
|
+
spine: "#d4d4d4"
|
|
343
|
+
tick: "#d4d4d4"
|
|
344
|
+
grid: "#3a3a3a"
|
|
345
|
+
light:
|
|
346
|
+
figure_bg: "transparent"
|
|
347
|
+
axes_bg: "transparent"
|
|
348
|
+
legend_bg: "transparent"
|
|
349
|
+
text: "black"
|
|
350
|
+
spine: "black"
|
|
351
|
+
tick: "black"
|
|
352
|
+
grid: "#cccccc"
|
|
353
|
+
|
|
354
|
+
# SciTeX Color Palette (RGB format)
|
|
355
|
+
colors:
|
|
356
|
+
palette:
|
|
357
|
+
- [0, 128, 192] # blue
|
|
358
|
+
- [255, 70, 50] # red
|
|
359
|
+
- [20, 180, 20] # green
|
|
360
|
+
- [230, 160, 20] # yellow
|
|
361
|
+
- [200, 50, 255] # purple
|
|
362
|
+
- [20, 200, 200] # lightblue
|
|
363
|
+
- [228, 94, 50] # orange
|
|
364
|
+
- [255, 150, 200] # pink
|
|
365
|
+
|
|
366
|
+
# Named colors
|
|
367
|
+
white: [255, 255, 255]
|
|
368
|
+
black: [0, 0, 0]
|
|
369
|
+
blue: [0, 128, 192]
|
|
370
|
+
red: [255, 70, 50]
|
|
371
|
+
pink: [255, 150, 200]
|
|
372
|
+
green: [20, 180, 20]
|
|
373
|
+
yellow: [230, 160, 20]
|
|
374
|
+
gray: [128, 128, 128]
|
|
375
|
+
grey: [128, 128, 128]
|
|
376
|
+
purple: [200, 50, 255]
|
|
377
|
+
lightblue: [20, 200, 200]
|
|
378
|
+
brown: [128, 0, 0]
|
|
379
|
+
navy: [0, 0, 100]
|
|
380
|
+
orange: [228, 94, 50]
|
|
381
|
+
|
|
382
|
+
# Semantic
|
|
383
|
+
primary: [0, 128, 192]
|
|
384
|
+
secondary: [255, 70, 50]
|
|
385
|
+
accent: [20, 180, 20]
|
|
386
|
+
|
|
387
|
+
# EOF
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
### API Overview
|
|
392
|
+
|
|
393
|
+
| Import | Description |
|
|
394
|
+
|----------------------------------|---------------------------------------------------|
|
|
395
|
+
| `import figrecipe.pyplot as plt` | Drop-in replacement of `matplotlib.pyplot as plt` |
|
|
396
|
+
| `import figrecipe as fr` | Import figrecipe package |
|
|
397
|
+
|----------------------------------|---------------------------------------------------|
|
|
398
|
+
| Function | |
|
|
399
|
+
|----------------------------------|---------------------------------------------------|
|
|
400
|
+
| `fr.subplots()` | Create a recording-enabled figure |
|
|
401
|
+
| `fr.save(fig, 'fig.png')` | Save image + recipe |
|
|
402
|
+
| `fr.reproduce('fig.yaml')` | Reproduce figure from recipe |
|
|
403
|
+
| `fr.extract_data('fig.yaml')` | Extract plotted data |
|
|
404
|
+
| `fr.info('fig.yaml')` | Inspect recipe metadata |
|
|
405
|
+
| `fr.edit(fig)` | Launch interactive GUI editor |
|
|
406
|
+
| `fr.load_style()` | Load style preset (global) |
|
|
407
|
+
| `fr.list_presets()` | List available presets |
|
|
408
|
+
| `fr.crop('fig.png')` | Crop to content with mm margin |
|
|
409
|
+
|
|
410
|
+
## Positioning
|
|
411
|
+
|
|
412
|
+
FigRecipe focuses on *how* figures are constructed, not *what* they represent.
|
|
413
|
+
|
|
414
|
+
FigRecipe provides recording, reproduction, layout fidelity, and interactive editing.
|
|
415
|
+
|
|
416
|
+
Higher-level workflows (figures–tables–statistics bundle, integration with manuscript writing) are handled in:
|
|
417
|
+
|
|
418
|
+
FTS (Figure-Table-Statistics Bundle) in SciTeX Ecosystem:
|
|
419
|
+
https://github.com/ywatanabe1989/scitex-code
|
|
420
|
+
https://scitex.ai/vis/
|
|
421
|
+
https://scitex.ai/writer/
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
## License
|
|
425
|
+
|
|
426
|
+
AGPL-3.0 See [LICENSE](LICENSE)
|
|
427
|
+
.
|
|
428
|
+
|
|
429
|
+
<!-- EOF -->
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
figrecipe/__init__.py,sha256=JsgNGwbgX31NzXrTNEoI-8uu2jrFZXk7sxarPfi-6hs,13069
|
|
2
|
+
figrecipe/_recorder.py,sha256=23azIgt5qvJ9VPReqZjfTkokU0woCNHfXGyjrt0MvWk,13657
|
|
3
|
+
figrecipe/_recorder_utils.py,sha256=jmZILX7d6Ew591rr1R8_RuCG9BSwXYkdV-3Bdi03Pdk,3505
|
|
4
|
+
figrecipe/_seaborn.py,sha256=H_yDpHCB0F-6goQ6eY_3oe7LA3EhGanC7i2ScBnwcKE,8327
|
|
5
|
+
figrecipe/_serializer.py,sha256=aNz-7SNjweFBcdK_9FXcptgLTd_jHFqG8q5E7gTVImE,6248
|
|
6
|
+
figrecipe/_validator.py,sha256=Aevecjk8mCX-yp92BQkz9F5hxEPev9n-yQuDRaEO3CE,5821
|
|
7
|
+
figrecipe/plt.py,sha256=rFmUE3dzCIVPm_kmHjMhj2u20u0gpinYO7HEooi3joE,280
|
|
8
|
+
figrecipe/pyplot.py,sha256=WVdPgm-0R5Nw-wwNUMbUe9F1jn89DrwgYPhK6vXhqIc,5686
|
|
9
|
+
figrecipe/_api/__init__.py,sha256=vBKJR3846Vm6omM4gqN4tWBTjsMHXGNcw7l-CH8PKho,1132
|
|
10
|
+
figrecipe/_api/_extract.py,sha256=zf-i5gwwyxMfUQeO6YLE1BahoJaPY8-A_ImGMYodvag,2692
|
|
11
|
+
figrecipe/_api/_notebook.py,sha256=LrcuofzlCHqmL8AUHHuT0JAFU04QyjQZFLCImyzWBNU,1800
|
|
12
|
+
figrecipe/_api/_panel.py,sha256=W-Eieaiw3BBmfhqPljO8R5c4_KDfzEo9uaNhCqf7Lbk,1186
|
|
13
|
+
figrecipe/_api/_save.py,sha256=yCmsswF6FKaJRJZbck2pxlNcnBw6_DCAWQtSIzPuy0c,5388
|
|
14
|
+
figrecipe/_api/_seaborn_proxy.py,sha256=-SVjhXc6NsJ1A56Wuf4ZrfNm6rYOqERkwHzH95ZB4Gg,689
|
|
15
|
+
figrecipe/_api/_style_manager.py,sha256=9PnEVPKst5KPyz0BMiWLNqySZa4de1hLK12UII2O5Iw,3903
|
|
16
|
+
figrecipe/_api/_subplots.py,sha256=1tg891TI6XRH-7uEjrj0zzFroNR4JsGfjRAy0bXySaI,10423
|
|
17
|
+
figrecipe/_api/_validate.py,sha256=N3IH2EL-2kTnsZ4xRvfE8fv9djvbmrxquU8hwQJ4Z5E,2247
|
|
18
|
+
figrecipe/_dev/__init__.py,sha256=3ZwnimHw1pBHngkDi6DJsYr4CSX_hhn61RPiKFl16js,678
|
|
19
|
+
figrecipe/_dev/_plotters.py,sha256=HuOsI-EYquOt3AH44ltALaZJSGL_5F_gZrQ-Ov_mTfg,1997
|
|
20
|
+
figrecipe/_dev/_run_demos.py,sha256=fmEJoHiuzvsqsw64XiX0rqNv-CQMSjLe4Dv-yXoX-Kw,1520
|
|
21
|
+
figrecipe/_dev/demo_plotters/__init__.py,sha256=ji4zInjZIHtNrfqinUZZTEkzsqGGKhcTDURF-Q5xdaA,1577
|
|
22
|
+
figrecipe/_dev/demo_plotters/_categories.py,sha256=QcTSstQl32KVzexKdYQZvOhdqwMYtt3TV5tebp94f34,2262
|
|
23
|
+
figrecipe/_dev/demo_plotters/_figure_creators.py,sha256=ZDAf3xSs8phM3m4Z-Pfum4DtuCkAEMiVZ6f6QXFYZ1k,3205
|
|
24
|
+
figrecipe/_dev/demo_plotters/_helpers.py,sha256=UBGfEcaUMwrQyFPwEEKHANxAdyRuE35ocyDy8tOCDik,792
|
|
25
|
+
figrecipe/_dev/demo_plotters/_registry.py,sha256=V8GdPpV08nYa_gXOXwb7kVFqBYsdZjIMD1M_tsV8EzI,1414
|
|
26
|
+
figrecipe/_dev/demo_plotters/bar_categorical/__init__.py,sha256=xTdpJeVZpVphru4REyWkwmVzpMXosTMotYpoH3F4UMI,98
|
|
27
|
+
figrecipe/_dev/demo_plotters/bar_categorical/plot_bar.py,sha256=yq0RRH9Gp7SXeaaekfNM0UqXTiFR882pWceUO05BrJ0,530
|
|
28
|
+
figrecipe/_dev/demo_plotters/bar_categorical/plot_barh.py,sha256=UvldSfn-vVu_YdsLccfEC8ujkWQ0fmZdEZRRS9iM47Q,558
|
|
29
|
+
figrecipe/_dev/demo_plotters/contour_surface/__init__.py,sha256=1FV1bxhDa-hM5gtHhdG2uyz3dmKl3ZwUii6GAiiWMIo,98
|
|
30
|
+
figrecipe/_dev/demo_plotters/contour_surface/plot_contour.py,sha256=SWz4aJnnz3BxzGD61kouXFM_x3rL75IFvPPXXGE5_zk,624
|
|
31
|
+
figrecipe/_dev/demo_plotters/contour_surface/plot_contourf.py,sha256=ZsuwNwfNbnlOwFMYFsrIkAM3rJ-QAmgT26wYxxfGmk0,621
|
|
32
|
+
figrecipe/_dev/demo_plotters/contour_surface/plot_tricontour.py,sha256=VkvwyPPKl_1GGWHxLbfeQrUCK-uPQ3t31DMmkyE_g3w,623
|
|
33
|
+
figrecipe/_dev/demo_plotters/contour_surface/plot_tricontourf.py,sha256=mHF0WFnlHji65dXV347VYWsUB_LBIN68wLvRW9FZdwo,643
|
|
34
|
+
figrecipe/_dev/demo_plotters/contour_surface/plot_tripcolor.py,sha256=UMFi9PETxs_En6Tzk54_bF9qUHjnQq8beCj8ZM6NARs,671
|
|
35
|
+
figrecipe/_dev/demo_plotters/contour_surface/plot_triplot.py,sha256=Rkc-Y6zito57X2we1wfeGqM-GB0yBJDg7gkB8Py8doY,532
|
|
36
|
+
figrecipe/_dev/demo_plotters/distribution/__init__.py,sha256=oXHR5km1doGSwGMVND7sL4hpMeJSH_R2nf6sv5rstJU,95
|
|
37
|
+
figrecipe/_dev/demo_plotters/distribution/plot_boxplot.py,sha256=_FGUZKpKsCN0QkY3x3iD0T6SWVWIilqXQfnEdERnKms,543
|
|
38
|
+
figrecipe/_dev/demo_plotters/distribution/plot_ecdf.py,sha256=hjosy8Z10XXGrFcmkrF9Z7mMlZ-y2Bfku54kpEGs014,498
|
|
39
|
+
figrecipe/_dev/demo_plotters/distribution/plot_hist.py,sha256=7KDdldxZZ1yw1e2IVw8JC6l7r-AxhGapxHvjmgiPN10,486
|
|
40
|
+
figrecipe/_dev/demo_plotters/distribution/plot_hist2d.py,sha256=XES4qLGaE9yiVgzUehhH18I5SAmRr0BE-rq0J_SNcxw,512
|
|
41
|
+
figrecipe/_dev/demo_plotters/distribution/plot_violinplot.py,sha256=ssxe8YdXSlgtrk8sMjiaeUHAePpt4WUnCP_DLNu26q8,597
|
|
42
|
+
figrecipe/_dev/demo_plotters/image_matrix/__init__.py,sha256=-tlOADZ834JT92ldwpHo5YcrYaIXQooxGIjSoxCbH_g,95
|
|
43
|
+
figrecipe/_dev/demo_plotters/image_matrix/plot_hexbin.py,sha256=dcA2clgNpCndb8H2D8aTUcgsgDlk-eotUCvrJ-HUK1s,522
|
|
44
|
+
figrecipe/_dev/demo_plotters/image_matrix/plot_imshow.py,sha256=z8N70pjwnMqud9g83wszRdudZWSbCt_MoLukaq_XLl4,464
|
|
45
|
+
figrecipe/_dev/demo_plotters/image_matrix/plot_matshow.py,sha256=6j_VzV0yMtd9CErvzXXUL7O615sWcPqGdsdufM6urwo,472
|
|
46
|
+
figrecipe/_dev/demo_plotters/image_matrix/plot_pcolor.py,sha256=-G3K1l1m8WtVI_c9aIo1OsROb2o6O5YkMDWNZm3wmCE,596
|
|
47
|
+
figrecipe/_dev/demo_plotters/image_matrix/plot_pcolormesh.py,sha256=MPAr9yTn41IeWP2ixiWkVVZWJnDi3qTrBr1tZkW_1J8,650
|
|
48
|
+
figrecipe/_dev/demo_plotters/image_matrix/plot_spy.py,sha256=lby0AHDpbXCec2EHbOWMg6EpBp4quHxfrvHMfgaBAH0,602
|
|
49
|
+
figrecipe/_dev/demo_plotters/line_curve/__init__.py,sha256=ulzlSoSrGWZHiZeVKwpe3mI07AGlLMY7vAHbMYtl1vY,93
|
|
50
|
+
figrecipe/_dev/demo_plotters/line_curve/plot_errorbar.py,sha256=TIH1JPUJkepmnsS6CKAGmx5C4Mi2ho1nHmDzT3I_eew,583
|
|
51
|
+
figrecipe/_dev/demo_plotters/line_curve/plot_fill.py,sha256=U3F6YF05Wl68MDCe9-zdLjmRfN864X9o9Ty2D0AJ60k,585
|
|
52
|
+
figrecipe/_dev/demo_plotters/line_curve/plot_fill_between.py,sha256=EhcUIiGbK_8oLnQ-KIKckptM_gtMviJPnXVphwdV5PE,688
|
|
53
|
+
figrecipe/_dev/demo_plotters/line_curve/plot_fill_betweenx.py,sha256=ap4S91Ny6XKzJdS-xUyCrnDsG5sShkKbG5HbcR1g_YU,624
|
|
54
|
+
figrecipe/_dev/demo_plotters/line_curve/plot_plot.py,sha256=JejHS8JnGhhg99sTTHAWsWOJ_7RjumhmQEkJhRNA4xY,576
|
|
55
|
+
figrecipe/_dev/demo_plotters/line_curve/plot_stackplot.py,sha256=WUqYL3bqLurRCAPaDPHtRWeAtaIUOMbWPVS2vWrVlsw,622
|
|
56
|
+
figrecipe/_dev/demo_plotters/line_curve/plot_stairs.py,sha256=os3Elybe_vNarMo6wWUoQgxkBPhstebe6M67aCWPigQ,566
|
|
57
|
+
figrecipe/_dev/demo_plotters/line_curve/plot_step.py,sha256=_qMs8H1Vj3EaG8FnAUOyiDgnRu_PpmQ9tB_mqqWY6nE,517
|
|
58
|
+
figrecipe/_dev/demo_plotters/scatter_points/__init__.py,sha256=X6IcN5-ifXSIU4I_mPEiUg_MyIrHUbvwFtalEjeIK3E,97
|
|
59
|
+
figrecipe/_dev/demo_plotters/scatter_points/plot_scatter.py,sha256=-ZZGsRbgZSOvqMMGU0CrHKQkojeTfQPciC6eSorON5U,514
|
|
60
|
+
figrecipe/_dev/demo_plotters/special/__init__.py,sha256=B8vuWe_8LK8rl3bNr2I-57juNZ5gkLz4RO9eAof7chs,90
|
|
61
|
+
figrecipe/_dev/demo_plotters/special/plot_eventplot.py,sha256=0UFjOzUeI2Y8-f5VD6RsKqzBZAFekXrFeKHLDz_qvZY,578
|
|
62
|
+
figrecipe/_dev/demo_plotters/special/plot_loglog.py,sha256=7IiBJeFDB865Ly7uVXbUyMX9PklpdrKUDX95kLWEFcs,513
|
|
63
|
+
figrecipe/_dev/demo_plotters/special/plot_pie.py,sha256=T9aMOc7LAOVyfBBndtnzCJ6mWhD-vGrFUJ41oQgPzEw,632
|
|
64
|
+
figrecipe/_dev/demo_plotters/special/plot_semilogx.py,sha256=aDfCCiuZrbTgfiYD4wcq_5q66VE0FzUOG1h4V2boUBo,544
|
|
65
|
+
figrecipe/_dev/demo_plotters/special/plot_semilogy.py,sha256=lqEuQHnI92eWrVhYTzExPUEkRZBrR02-Cgebnu1lXBE,542
|
|
66
|
+
figrecipe/_dev/demo_plotters/special/plot_stem.py,sha256=-F7AkHxwnizJ7_nkFj_Jw2PD4kgI2mN-RgSyIKkU_XI,504
|
|
67
|
+
figrecipe/_dev/demo_plotters/spectral_signal/__init__.py,sha256=EZ054RSdE5pVo6gLkBxchneXQLHU5TDSDJ-ZjlE8-ZU,98
|
|
68
|
+
figrecipe/_dev/demo_plotters/spectral_signal/plot_acorr.py,sha256=URj5y4BwUpsaCdLZ3Z3PEnos0kTZSSSM90VSTAqo0xU,505
|
|
69
|
+
figrecipe/_dev/demo_plotters/spectral_signal/plot_angle_spectrum.py,sha256=aRR6pE1UIAU7vEPOVryvX8TinDoAX-V8Y48dYqr3qEE,697
|
|
70
|
+
figrecipe/_dev/demo_plotters/spectral_signal/plot_cohere.py,sha256=v0eRGcSo1i6f_pl9w87p9kI1MX6ag7zV55xH1_c3ews,671
|
|
71
|
+
figrecipe/_dev/demo_plotters/spectral_signal/plot_csd.py,sha256=RMPSipAyF3tZjuA6QZYbptEbRmUUCqzLy-PzhCv5_Es,673
|
|
72
|
+
figrecipe/_dev/demo_plotters/spectral_signal/plot_magnitude_spectrum.py,sha256=TbAyoyJ7INaLy8Gj7K0C2i8kr6slIqjP3BV5jDIOEHU,699
|
|
73
|
+
figrecipe/_dev/demo_plotters/spectral_signal/plot_phase_spectrum.py,sha256=D8Gvt66yFg-NMr9pBhWSOHvZC00sr73pI6Q-qymo2bs,685
|
|
74
|
+
figrecipe/_dev/demo_plotters/spectral_signal/plot_psd.py,sha256=_5F0cQu1reUvx0dfXWYZ1BuKCjsg2jowNzEYRmvMmuc,672
|
|
75
|
+
figrecipe/_dev/demo_plotters/spectral_signal/plot_specgram.py,sha256=MyPjy3XVgD40zgD8sUIe6AkzkOD18JWKDMIDyhThP6s,670
|
|
76
|
+
figrecipe/_dev/demo_plotters/spectral_signal/plot_xcorr.py,sha256=BUDU5phnG88UkJUdc4v-TGMR2RoPHQUNzCLwNhI7YpI,544
|
|
77
|
+
figrecipe/_dev/demo_plotters/vector_flow/__init__.py,sha256=ROy0D0-QghzH84asQm-QYQPY_z7W6E-ldk0FuQUOAqM,94
|
|
78
|
+
figrecipe/_dev/demo_plotters/vector_flow/plot_barbs.py,sha256=if9EVceghVPREOSEvo9_qZQym3G74gFDV0zVsY6fWqI,625
|
|
79
|
+
figrecipe/_dev/demo_plotters/vector_flow/plot_quiver.py,sha256=e3okVGvjZt_sqCEM_noikyPJ4HIxunH-RZosPVmuXAY,609
|
|
80
|
+
figrecipe/_dev/demo_plotters/vector_flow/plot_streamplot.py,sha256=IulKlBfpK8SIIau_E_msZ3cNk2_nqDstMae6TEnl8uI,618
|
|
81
|
+
figrecipe/_editor/__init__.py,sha256=9h3hE9b7QEH7A6rvSElNoqRzFR2l45dEWS9c40Ho_nk,8287
|
|
82
|
+
figrecipe/_editor/_flask_app.py,sha256=aANZAGjKn6nklXzTRUCyoSkwIkR5qPjnl58xb5hDpp8,8709
|
|
83
|
+
figrecipe/_editor/_helpers.py,sha256=fJ7L9nAUXWBu0KNst0AKqWm6Un3Z97L0EmIpGXHLAV4,8346
|
|
84
|
+
figrecipe/_editor/_hitmap_main.py,sha256=0uBCCx0ig9C09cD2av9GjGN4nE5Vc6IWLcMYoMnsXcs,5033
|
|
85
|
+
figrecipe/_editor/_overrides.py,sha256=Q7MWLo9bUBgnuYvPByC9TrYq_ajdBMPuKptw0CsohuY,8892
|
|
86
|
+
figrecipe/_editor/_preferences.py,sha256=410l4NLIiLG2p8VLDq0eMd-pE_xAaaGV9BZ2jsU5kjo,2834
|
|
87
|
+
figrecipe/_editor/_render_overrides.py,sha256=QD2dV4wO21jGg-ahmL1xsxLn0Nq1eh5nLyrFn0LS3EY,16076
|
|
88
|
+
figrecipe/_editor/_renderer.py,sha256=5C2Y5U7t8gc2nliheRWkt_lYlu5h_V-q1AuDv4TCvWk,5176
|
|
89
|
+
figrecipe/_editor/_routes_axis.py,sha256=7a6qPs-dfw2y4YzYlQzOXT1R7RNgheM0lu6pF-Fo3BY,15984
|
|
90
|
+
figrecipe/_editor/_routes_core.py,sha256=Ef-gTaGzd41pcz7Ec3gNwEGZRSxQ1n86wSdlbf7vVNg,9020
|
|
91
|
+
figrecipe/_editor/_routes_element.py,sha256=8VvOr3NgvmYOJednISlHQ6AOTIjPprE7uPz8XJE7QRA,10909
|
|
92
|
+
figrecipe/_editor/_routes_style.py,sha256=uTmgHqjmc3SI6Z67J3lDiaB0WkwzMsxMZRWfiRiwE04,7591
|
|
93
|
+
figrecipe/_editor/_bbox/__init__.py,sha256=GDoT3GdUClIZVg-m127ni31RqFz38owQcp9TK9K_DKQ,1248
|
|
94
|
+
figrecipe/_editor/_bbox/_collections.py,sha256=GC7XXvlbbkAXe_Ucm_TY7N5gSZOY57CePD7zfb5cB1Y,5153
|
|
95
|
+
figrecipe/_editor/_bbox/_elements.py,sha256=2SkwQwqlYh1Gc67Z1VxUmUvEAzxPEyLDR5lfwm5vqtw,4317
|
|
96
|
+
figrecipe/_editor/_bbox/_extract.py,sha256=FvDjHp8M2eYVr_4dmUXyu0BZeNH7LdSdgM93I-PmeRM,5393
|
|
97
|
+
figrecipe/_editor/_bbox/_extract_axes.py,sha256=tv1Y8pntAZtCnvcOY3-zyo1X7rjRKzOtOc6RqtKDWxM,9989
|
|
98
|
+
figrecipe/_editor/_bbox/_extract_text.py,sha256=YjJ0PnwoAQIBHJBKgyz0O6CU68qsk_u8wh3Ru2GeWVM,9530
|
|
99
|
+
figrecipe/_editor/_bbox/_lines.py,sha256=d_juASdeKD7emLb0_0EmLJIS3Ryqy3f3t54EPgZkp1s,4773
|
|
100
|
+
figrecipe/_editor/_bbox/_transforms.py,sha256=GRy-4pvuT5QW5TkhJg3bwRMfxD5gLEJ_O1SFHiddqb4,3850
|
|
101
|
+
figrecipe/_editor/_hitmap/__init__.py,sha256=gnJqTzXt4EJrY12Gj3norNlUVY3-iSXOcNBYn2PtkJA,1662
|
|
102
|
+
figrecipe/_editor/_hitmap/_colors.py,sha256=ycR7hs_Z5a6V6KOWkbvLB4jehaSJl0xXlYTOBsRo8hY,4270
|
|
103
|
+
figrecipe/_editor/_hitmap/_detect.py,sha256=xSCQ2XJLk6mW6f0Nj9ki4EJHXdKqvwijZf4c8q4cbLI,3651
|
|
104
|
+
figrecipe/_editor/_hitmap/_restore.py,sha256=sNgcfcLyOh3zD4Y96xi59vo2F_ey6HDZpPB4W-N9ZMI,4790
|
|
105
|
+
figrecipe/_editor/_hitmap/_artists/__init__.py,sha256=YSRIf44mgGWLpB4P0l6F65pBJkV_gHNAB9QLy7WVPhI,510
|
|
106
|
+
figrecipe/_editor/_hitmap/_artists/_collections.py,sha256=i6lA_TuZQuM15C0F7s84rK8nDecstPWhHWAzD4iHmUI,9763
|
|
107
|
+
figrecipe/_editor/_hitmap/_artists/_images.py,sha256=Lb1RX0EzhzFm6UIPFrt-URuOJWGo46tqT_ytV6KRKow,1659
|
|
108
|
+
figrecipe/_editor/_hitmap/_artists/_lines.py,sha256=ArMhY5U9UmIynG82viW7fzvQ7ftj9QUC9NWL_LD_DtE,3198
|
|
109
|
+
figrecipe/_editor/_hitmap/_artists/_patches.py,sha256=bX72IQwyp0eWQDEunez5Ur1Wwjr8EuT_KLy7dbGotz0,4429
|
|
110
|
+
figrecipe/_editor/_hitmap/_artists/_text.py,sha256=8Qif5Luw6o52CTiM2iiIOLdvem_rQhj6UY_Kovt0e70,5020
|
|
111
|
+
figrecipe/_editor/_templates/__init__.py,sha256=8Nh_sBMDYjAr2gw_t6Vrvyum_vsiWPDHapYBkkICvMs,5200
|
|
112
|
+
figrecipe/_editor/_templates/_html.py,sha256=JKPJaGqSTi-MT0c7btlEFnoV81fgXgkc7jQcXG0UtnQ,30112
|
|
113
|
+
figrecipe/_editor/_templates/_scripts/__init__.py,sha256=wdylmiUiV4FayNWX65cgNPH5Lx8W9HRLr4NpCCe-Bpw,3786
|
|
114
|
+
figrecipe/_editor/_templates/_scripts/_api.py,sha256=zrDSOF7-ERxWAYYCTZaCpX3UMF46op0LEtWeKM_7pAI,6498
|
|
115
|
+
figrecipe/_editor/_templates/_scripts/_colors.py,sha256=QQxwlnkQLBFCEUfTtspSemruzqVK2zBznElWwiBRDTE,17825
|
|
116
|
+
figrecipe/_editor/_templates/_scripts/_core.py,sha256=iu4Pene5nBIv8udgZVsHxwFftOtl6QhaUUfrh7VWitg,14494
|
|
117
|
+
figrecipe/_editor/_templates/_scripts/_debug_snapshot.py,sha256=Sq9jfSdcD071tew3cx1kRZfh_VKgNfoJUyImJmdsieg,6831
|
|
118
|
+
figrecipe/_editor/_templates/_scripts/_element_editor.py,sha256=SZX5CJtUBVOf4_y2Y0axJsbuCSHBcbR-SKJCOqSAy1o,11203
|
|
119
|
+
figrecipe/_editor/_templates/_scripts/_files.py,sha256=7tAs6w4Cn3JcwlSlRC3Ud_mHjzEm5Txp2r_IYLU2Fuk,5741
|
|
120
|
+
figrecipe/_editor/_templates/_scripts/_hitmap.py,sha256=VhKcYzgEQD4J8WdXo9cqXfJE5mTiWwhuyPdYwJ7UkrA,18665
|
|
121
|
+
figrecipe/_editor/_templates/_scripts/_inspector.py,sha256=F31I8dQtbBIB-5XAZjMiXpaQTt-826RJImrgRQvGYdo,11381
|
|
122
|
+
figrecipe/_editor/_templates/_scripts/_labels.py,sha256=Hhj8oEtD2uCSiH88t0KDbaDUjxsI741EebtH-8in5Cg,15828
|
|
123
|
+
figrecipe/_editor/_templates/_scripts/_legend_drag.py,sha256=uDkHUNR7Vtcc9AfZwIuEakojt3bfhppUPsx2b_pxZjQ,8399
|
|
124
|
+
figrecipe/_editor/_templates/_scripts/_modals.py,sha256=CCIAzvWB15QvvVL2PdPZuUmM7OQ522HWJ6mYu8IkJFk,7474
|
|
125
|
+
figrecipe/_editor/_templates/_scripts/_overlays.py,sha256=Anne_bi1cIDMGcSsd05pB7RrO1jjs0t6f5ce9RnohxQ,9963
|
|
126
|
+
figrecipe/_editor/_templates/_scripts/_panel_drag.py,sha256=YmlHPtGSHUSqZ6DLzO9EsO_AVCsWn0JXXDak4WEqUSA,12070
|
|
127
|
+
figrecipe/_editor/_templates/_scripts/_panel_position.py,sha256=MmeDZpkjGhgrdRDbXlu7EceFFSNOKt5rrrCftmuDuAo,9018
|
|
128
|
+
figrecipe/_editor/_templates/_scripts/_selection.py,sha256=D9Z3q5_8-GSagtD8cUAMltrKAH-pMzlcLaTavRPmDIM,8545
|
|
129
|
+
figrecipe/_editor/_templates/_scripts/_tabs.py,sha256=bC2K6-TBh2nk5RbAI3aeIvWCGGey1Xn3wFAo2XcV_00,3044
|
|
130
|
+
figrecipe/_editor/_templates/_scripts/_view_mode.py,sha256=KZQoaJplLPuk3JPtG-HD8pIZw2IrHKk5K14MI-rb-Dw,3701
|
|
131
|
+
figrecipe/_editor/_templates/_scripts/_zoom.py,sha256=sAxuFlBA7d6voEccx_uBnRBzTq9umLgaQUVDJ8SO9nQ,6272
|
|
132
|
+
figrecipe/_editor/_templates/_styles/__init__.py,sha256=WeIaGLoY9IiwI1jk-PTwRAbdLgx3fMg_F5Rq_ML4sUA,1867
|
|
133
|
+
figrecipe/_editor/_templates/_styles/_base.py,sha256=FVCl-GSsZPENrkWprnMBQayzlROF57oED6kO0E14OOQ,1342
|
|
134
|
+
figrecipe/_editor/_templates/_styles/_buttons.py,sha256=PIXIJCcP_HV0gEEKmd3hEzkKeLHUY0IKwy75bdYai3k,3626
|
|
135
|
+
figrecipe/_editor/_templates/_styles/_color_input.py,sha256=wGtjZSFC8kF1gImFtEZCPPWgT8P4wIslZFHJCXr-4Cw,2169
|
|
136
|
+
figrecipe/_editor/_templates/_styles/_controls.py,sha256=WAKqG67HFRRCKuyFFfW4Bn9EEoa2Uuy2qO060kbL6aI,5160
|
|
137
|
+
figrecipe/_editor/_templates/_styles/_dynamic_props.py,sha256=wGkJAlUDGZ5-5tOBqgZDADgoe7Eif8MXhNIKwX4SuAs,2687
|
|
138
|
+
figrecipe/_editor/_templates/_styles/_forms.py,sha256=-zjp08cQUMofHt8tvMdOhIih6767wx8utHiAyuCsYWs,2421
|
|
139
|
+
figrecipe/_editor/_templates/_styles/_hitmap.py,sha256=eKqzgLuVxeM9gllDmbte3dTroBRtT7E1J9aU_1linMs,4466
|
|
140
|
+
figrecipe/_editor/_templates/_styles/_inspector.py,sha256=5_vQlFsNG234jPCehBdZz3ZNJ-lgOXzinrp2RwI6fWY,2183
|
|
141
|
+
figrecipe/_editor/_templates/_styles/_labels.py,sha256=1zMnKiJc-3d2igw37bC-_cWBgNO5EWvLxC_Xrb0gHxg,2222
|
|
142
|
+
figrecipe/_editor/_templates/_styles/_modals.py,sha256=lsWz1fUYEroQ1WObFSfA_Ds94BvrT2vnXvNTNvPs1o0,1848
|
|
143
|
+
figrecipe/_editor/_templates/_styles/_overlays.py,sha256=pmZfdsPPPm8t3NEJXWedbZINBvxmOB5q1aNTt2azjwY,2143
|
|
144
|
+
figrecipe/_editor/_templates/_styles/_preview.py,sha256=rYsVUFGdTIPb0eRJEo2wDgjZuBBZCIXPXbbYtn0C7XQ,4758
|
|
145
|
+
figrecipe/_editor/_templates/_styles/_selection.py,sha256=G4aesebVMM03C20Q8xwt1T_C726h-LyKlxfokKdUjzU,1630
|
|
146
|
+
figrecipe/_params/_DECORATION_METHODS.py,sha256=8FKvRavY1Yy4KnsKVoaVr133W8WJW9wyelbQKmnL_ck,631
|
|
147
|
+
figrecipe/_params/_PLOTTING_METHODS.py,sha256=6S2SvXPQpQ0Y6ut-8kUjyheMNtiDEQCY1aB59XPq788,929
|
|
148
|
+
figrecipe/_params/__init__.py,sha256=EjlVg-n_DlASnSxQYW61kd8JnKeyo-1DMMusJUxm_io,245
|
|
149
|
+
figrecipe/_reproducer/__init__.py,sha256=2JwEbNz534S_C6pq9M8kCCDcW0u78EnlM9wwVOQMIsg,552
|
|
150
|
+
figrecipe/_reproducer/_core.py,sha256=vK2qXO-OjQWx6TLoI8QTR8OrgDWF1_nxoRCHDOFa8bE,15524
|
|
151
|
+
figrecipe/_reproducer/_custom_plots.py,sha256=hDiEZqHtQX29lLNxB6iI7G540C4TY90m7bMzgQblHPo,7636
|
|
152
|
+
figrecipe/_reproducer/_seaborn.py,sha256=ESgX7_ydI7ApSXNE9DDQM5g8KJFv2DlKO7v8eJKLMrk,2707
|
|
153
|
+
figrecipe/_reproducer/_violin.py,sha256=WJMKL6_uQRoLMW-yOmBA4iJxv_UCbIf-hskSaCPrM68,5686
|
|
154
|
+
figrecipe/_signatures/README.md,sha256=eDchfORRdfMAdlPBTKMP3PgcIQywhK3KB1yps3YIzYw,1085
|
|
155
|
+
figrecipe/_signatures/__init__.py,sha256=ekzkD0PG8dvRce7Rc3iRBo65GkOqYLP5hYBGIXfmaaQ,332
|
|
156
|
+
figrecipe/_signatures/_kwargs.py,sha256=eVvSXJd0oA5hfyD8_q-bAOKOVgiCyuqNX9aJIg2aMFk,10318
|
|
157
|
+
figrecipe/_signatures/_loader.py,sha256=HLiuD-rfF6-4pumTgCveugbJPHMwx-BXs0eX3-drwGw,6887
|
|
158
|
+
figrecipe/_signatures/_parsing.py,sha256=dehrhdTk8LtMPniTsi-UTiIrAqivnaVd99RCIvWCDyI,4300
|
|
159
|
+
figrecipe/_utils/__init__.py,sha256=TYh3wizq2WoUuopE8WZBvUTTSSJGud1EReb3INsSAM4,845
|
|
160
|
+
figrecipe/_utils/_crop.py,sha256=vOZuggtGIeJYYwRBugq5OebF3a5s5j0h_3STPtfhJjU,8474
|
|
161
|
+
figrecipe/_utils/_diff.py,sha256=cjRXjMrfXFKz6uZQOZ-XYifc0mzmHZyRXn_LY13K1SY,2354
|
|
162
|
+
figrecipe/_utils/_image_diff.py,sha256=LCXRbXqEtr_mI5Xpk1ju59Fw5B2UqNtvYZx_Uyh98Sw,5416
|
|
163
|
+
figrecipe/_utils/_numpy_io.py,sha256=YYUDtkyBEeXZ54iSpC_7CoxP33Yk1eoRbIabZYol-SY,4532
|
|
164
|
+
figrecipe/_utils/_units.py,sha256=EJiG4-Fle3C5oQ7vNIqG_Ms_vru_0NPj39ESEXO84ZY,4656
|
|
165
|
+
figrecipe/_wrappers/__init__.py,sha256=CcBUID5G6Mo_bNGpCaz5vbfB8CG7XtF-9lOm7kShQPw,214
|
|
166
|
+
figrecipe/_wrappers/_axes.py,sha256=GAXNM3_LRUzlffCTFtaxy1EjXXu7hY2LV1oo5GD3wGs,9201
|
|
167
|
+
figrecipe/_wrappers/_axes_helpers.py,sha256=ej6CkvtxVCLp8CIwGliYs6YV-fB4Cncc9BoVBpdIaf8,4143
|
|
168
|
+
figrecipe/_wrappers/_axes_plots.py,sha256=6FJY6gOnEDJ5w7UDdArLHVBEIZQqBF6nx3Y2SDeEPVA,11334
|
|
169
|
+
figrecipe/_wrappers/_axes_seaborn.py,sha256=IryjtLnoUC-ezf4sk9oe3ZzYUPC8PpGgxYkYBspj1s8,4837
|
|
170
|
+
figrecipe/_wrappers/_figure.py,sha256=AEaVA3YY6DyH8Z4chD6Cy4ZoMKKwpQBZQnpjyhTSX9s,15396
|
|
171
|
+
figrecipe/_wrappers/_panel_labels.py,sha256=EI3uySQ-rKe-H9IoFy6xh6_woAjGjPpU0O9zTSISNqE,3211
|
|
172
|
+
figrecipe/_wrappers/_plot_helpers.py,sha256=cwgVUTVyhNLZVMmzVopAcDopp0AoWlSndN6foJ2TTuQ,3613
|
|
173
|
+
figrecipe/_wrappers/_violin_helpers.py,sha256=A8Z9MqHRmzT59eyUHuhQNfUOasA7N2GWv40fqoZB_aY,4496
|
|
174
|
+
figrecipe/styles/__init__.py,sha256=ex3pAljdQ3lwQ-u5aEc6wIRZfnxjRs8lJptfuArw16Y,1152
|
|
175
|
+
figrecipe/styles/_dotdict.py,sha256=z4nCFQQPZm4EZ-BXW86Uuhuz5wDqqEtJoDleMPterTk,2118
|
|
176
|
+
figrecipe/styles/_finalize.py,sha256=QddHTtaumyDrgZGd4Vguj7bPfn2Q-k8-v9pm5MNkIVA,4377
|
|
177
|
+
figrecipe/styles/_fonts.py,sha256=SmVkhWz_0d6Rg1uWbyqSjwzHBMIpWkwEv7vBgOR6ONs,1997
|
|
178
|
+
figrecipe/styles/_kwargs_converter.py,sha256=PGxjslnrSmGab20g0LXBOEdlBbjwa1VSonoQo3xKXGQ,7975
|
|
179
|
+
figrecipe/styles/_plot_styles.py,sha256=T19TAk0o8I7-ybMK4NnHKj6q2lvs2JjA7KalVrtOmTw,6353
|
|
180
|
+
figrecipe/styles/_style_applier.py,sha256=M13f6KdhbWcWXgXVtOghc4Zo0-MH3OWTXBdWPVASFp4,9541
|
|
181
|
+
figrecipe/styles/_style_loader.py,sha256=5lqfzZHn7Q1cjjxp1i3CBDZ-7qJ6jGM-p8q3I98pWW8,11121
|
|
182
|
+
figrecipe/styles/_themes.py,sha256=vxXyR4uPZ7A9xbf7IJYsfmtMjwxB7_xVJni8b90dA84,5040
|
|
183
|
+
figrecipe/styles/presets/MATPLOTLIB.yaml,sha256=E1uap6XsmlY1_wvdb-8Adpal0zQejxS6zGR_5wZADmA,1839
|
|
184
|
+
figrecipe/styles/presets/SCITEX.yaml,sha256=IH1uOGngZBwsLqEZN2yfj89WYW1LI7H__5Yx0ALsGb4,4970
|
|
185
|
+
figrecipe-0.7.4.dist-info/METADATA,sha256=gA-NB9V1pFG1JT9uOn_nCNOM3fCLu_E4NFjbP8BCK1Y,12713
|
|
186
|
+
figrecipe-0.7.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
187
|
+
figrecipe-0.7.4.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
|
|
188
|
+
figrecipe-0.7.4.dist-info/RECORD,,
|