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.
Files changed (189) hide show
  1. figrecipe/__init__.py +220 -819
  2. figrecipe/_api/__init__.py +48 -0
  3. figrecipe/_api/_extract.py +108 -0
  4. figrecipe/_api/_notebook.py +61 -0
  5. figrecipe/_api/_panel.py +46 -0
  6. figrecipe/_api/_save.py +191 -0
  7. figrecipe/_api/_seaborn_proxy.py +34 -0
  8. figrecipe/_api/_style_manager.py +153 -0
  9. figrecipe/_api/_subplots.py +333 -0
  10. figrecipe/_api/_validate.py +82 -0
  11. figrecipe/_dev/__init__.py +29 -0
  12. figrecipe/_dev/_plotters.py +76 -0
  13. figrecipe/_dev/_run_demos.py +56 -0
  14. figrecipe/_dev/demo_plotters/__init__.py +64 -0
  15. figrecipe/_dev/demo_plotters/_categories.py +81 -0
  16. figrecipe/_dev/demo_plotters/_figure_creators.py +119 -0
  17. figrecipe/_dev/demo_plotters/_helpers.py +31 -0
  18. figrecipe/_dev/demo_plotters/_registry.py +50 -0
  19. figrecipe/_dev/demo_plotters/bar_categorical/__init__.py +4 -0
  20. figrecipe/_dev/demo_plotters/bar_categorical/plot_bar.py +25 -0
  21. figrecipe/_dev/demo_plotters/bar_categorical/plot_barh.py +25 -0
  22. figrecipe/_dev/demo_plotters/contour_surface/__init__.py +4 -0
  23. figrecipe/_dev/demo_plotters/contour_surface/plot_contour.py +30 -0
  24. figrecipe/_dev/demo_plotters/contour_surface/plot_contourf.py +29 -0
  25. figrecipe/_dev/demo_plotters/contour_surface/plot_tricontour.py +28 -0
  26. figrecipe/_dev/demo_plotters/contour_surface/plot_tricontourf.py +28 -0
  27. figrecipe/_dev/demo_plotters/contour_surface/plot_tripcolor.py +29 -0
  28. figrecipe/_dev/demo_plotters/contour_surface/plot_triplot.py +25 -0
  29. figrecipe/_dev/demo_plotters/distribution/__init__.py +4 -0
  30. figrecipe/_dev/demo_plotters/distribution/plot_boxplot.py +24 -0
  31. figrecipe/_dev/demo_plotters/distribution/plot_ecdf.py +24 -0
  32. figrecipe/_dev/demo_plotters/distribution/plot_hist.py +24 -0
  33. figrecipe/_dev/demo_plotters/distribution/plot_hist2d.py +25 -0
  34. figrecipe/_dev/demo_plotters/distribution/plot_violinplot.py +25 -0
  35. figrecipe/_dev/demo_plotters/image_matrix/__init__.py +4 -0
  36. figrecipe/_dev/demo_plotters/image_matrix/plot_hexbin.py +25 -0
  37. figrecipe/_dev/demo_plotters/image_matrix/plot_imshow.py +23 -0
  38. figrecipe/_dev/demo_plotters/image_matrix/plot_matshow.py +23 -0
  39. figrecipe/_dev/demo_plotters/image_matrix/plot_pcolor.py +29 -0
  40. figrecipe/_dev/demo_plotters/image_matrix/plot_pcolormesh.py +29 -0
  41. figrecipe/_dev/demo_plotters/image_matrix/plot_spy.py +29 -0
  42. figrecipe/_dev/demo_plotters/line_curve/__init__.py +4 -0
  43. figrecipe/_dev/demo_plotters/line_curve/plot_errorbar.py +28 -0
  44. figrecipe/_dev/demo_plotters/line_curve/plot_fill.py +29 -0
  45. figrecipe/_dev/demo_plotters/line_curve/plot_fill_between.py +30 -0
  46. figrecipe/_dev/demo_plotters/line_curve/plot_fill_betweenx.py +28 -0
  47. figrecipe/_dev/demo_plotters/line_curve/plot_plot.py +28 -0
  48. figrecipe/_dev/demo_plotters/line_curve/plot_stackplot.py +29 -0
  49. figrecipe/_dev/demo_plotters/line_curve/plot_stairs.py +27 -0
  50. figrecipe/_dev/demo_plotters/line_curve/plot_step.py +27 -0
  51. figrecipe/_dev/demo_plotters/scatter_points/__init__.py +4 -0
  52. figrecipe/_dev/demo_plotters/scatter_points/plot_scatter.py +24 -0
  53. figrecipe/_dev/demo_plotters/special/__init__.py +4 -0
  54. figrecipe/_dev/demo_plotters/special/plot_eventplot.py +25 -0
  55. figrecipe/_dev/demo_plotters/special/plot_loglog.py +27 -0
  56. figrecipe/_dev/demo_plotters/special/plot_pie.py +27 -0
  57. figrecipe/_dev/demo_plotters/special/plot_semilogx.py +27 -0
  58. figrecipe/_dev/demo_plotters/special/plot_semilogy.py +27 -0
  59. figrecipe/_dev/demo_plotters/special/plot_stem.py +27 -0
  60. figrecipe/_dev/demo_plotters/spectral_signal/__init__.py +4 -0
  61. figrecipe/_dev/demo_plotters/spectral_signal/plot_acorr.py +24 -0
  62. figrecipe/_dev/demo_plotters/spectral_signal/plot_angle_spectrum.py +28 -0
  63. figrecipe/_dev/demo_plotters/spectral_signal/plot_cohere.py +29 -0
  64. figrecipe/_dev/demo_plotters/spectral_signal/plot_csd.py +29 -0
  65. figrecipe/_dev/demo_plotters/spectral_signal/plot_magnitude_spectrum.py +28 -0
  66. figrecipe/_dev/demo_plotters/spectral_signal/plot_phase_spectrum.py +28 -0
  67. figrecipe/_dev/demo_plotters/spectral_signal/plot_psd.py +29 -0
  68. figrecipe/_dev/demo_plotters/spectral_signal/plot_specgram.py +30 -0
  69. figrecipe/_dev/demo_plotters/spectral_signal/plot_xcorr.py +25 -0
  70. figrecipe/_dev/demo_plotters/vector_flow/__init__.py +4 -0
  71. figrecipe/_dev/demo_plotters/vector_flow/plot_barbs.py +30 -0
  72. figrecipe/_dev/demo_plotters/vector_flow/plot_quiver.py +30 -0
  73. figrecipe/_dev/demo_plotters/vector_flow/plot_streamplot.py +30 -0
  74. figrecipe/_editor/__init__.py +278 -0
  75. figrecipe/_editor/_bbox/__init__.py +43 -0
  76. figrecipe/_editor/_bbox/_collections.py +177 -0
  77. figrecipe/_editor/_bbox/_elements.py +159 -0
  78. figrecipe/_editor/_bbox/_extract.py +256 -0
  79. figrecipe/_editor/_bbox/_extract_axes.py +370 -0
  80. figrecipe/_editor/_bbox/_extract_text.py +342 -0
  81. figrecipe/_editor/_bbox/_lines.py +173 -0
  82. figrecipe/_editor/_bbox/_transforms.py +146 -0
  83. figrecipe/_editor/_flask_app.py +258 -0
  84. figrecipe/_editor/_helpers.py +242 -0
  85. figrecipe/_editor/_hitmap/__init__.py +76 -0
  86. figrecipe/_editor/_hitmap/_artists/__init__.py +21 -0
  87. figrecipe/_editor/_hitmap/_artists/_collections.py +345 -0
  88. figrecipe/_editor/_hitmap/_artists/_images.py +68 -0
  89. figrecipe/_editor/_hitmap/_artists/_lines.py +107 -0
  90. figrecipe/_editor/_hitmap/_artists/_patches.py +163 -0
  91. figrecipe/_editor/_hitmap/_artists/_text.py +190 -0
  92. figrecipe/_editor/_hitmap/_colors.py +181 -0
  93. figrecipe/_editor/_hitmap/_detect.py +137 -0
  94. figrecipe/_editor/_hitmap/_restore.py +154 -0
  95. figrecipe/_editor/_hitmap_main.py +182 -0
  96. figrecipe/_editor/_overrides.py +318 -0
  97. figrecipe/_editor/_preferences.py +135 -0
  98. figrecipe/_editor/_render_overrides.py +480 -0
  99. figrecipe/_editor/_renderer.py +199 -0
  100. figrecipe/_editor/_routes_axis.py +453 -0
  101. figrecipe/_editor/_routes_core.py +284 -0
  102. figrecipe/_editor/_routes_element.py +317 -0
  103. figrecipe/_editor/_routes_style.py +223 -0
  104. figrecipe/_editor/_templates/__init__.py +152 -0
  105. figrecipe/_editor/_templates/_html.py +502 -0
  106. figrecipe/_editor/_templates/_scripts/__init__.py +120 -0
  107. figrecipe/_editor/_templates/_scripts/_api.py +228 -0
  108. figrecipe/_editor/_templates/_scripts/_colors.py +485 -0
  109. figrecipe/_editor/_templates/_scripts/_core.py +436 -0
  110. figrecipe/_editor/_templates/_scripts/_debug_snapshot.py +186 -0
  111. figrecipe/_editor/_templates/_scripts/_element_editor.py +310 -0
  112. figrecipe/_editor/_templates/_scripts/_files.py +195 -0
  113. figrecipe/_editor/_templates/_scripts/_hitmap.py +509 -0
  114. figrecipe/_editor/_templates/_scripts/_inspector.py +315 -0
  115. figrecipe/_editor/_templates/_scripts/_labels.py +464 -0
  116. figrecipe/_editor/_templates/_scripts/_legend_drag.py +265 -0
  117. figrecipe/_editor/_templates/_scripts/_modals.py +226 -0
  118. figrecipe/_editor/_templates/_scripts/_overlays.py +292 -0
  119. figrecipe/_editor/_templates/_scripts/_panel_drag.py +334 -0
  120. figrecipe/_editor/_templates/_scripts/_panel_position.py +279 -0
  121. figrecipe/_editor/_templates/_scripts/_selection.py +237 -0
  122. figrecipe/_editor/_templates/_scripts/_tabs.py +89 -0
  123. figrecipe/_editor/_templates/_scripts/_view_mode.py +107 -0
  124. figrecipe/_editor/_templates/_scripts/_zoom.py +179 -0
  125. figrecipe/_editor/_templates/_styles/__init__.py +69 -0
  126. figrecipe/_editor/_templates/_styles/_base.py +64 -0
  127. figrecipe/_editor/_templates/_styles/_buttons.py +206 -0
  128. figrecipe/_editor/_templates/_styles/_color_input.py +123 -0
  129. figrecipe/_editor/_templates/_styles/_controls.py +265 -0
  130. figrecipe/_editor/_templates/_styles/_dynamic_props.py +144 -0
  131. figrecipe/_editor/_templates/_styles/_forms.py +126 -0
  132. figrecipe/_editor/_templates/_styles/_hitmap.py +184 -0
  133. figrecipe/_editor/_templates/_styles/_inspector.py +90 -0
  134. figrecipe/_editor/_templates/_styles/_labels.py +118 -0
  135. figrecipe/_editor/_templates/_styles/_modals.py +98 -0
  136. figrecipe/_editor/_templates/_styles/_overlays.py +130 -0
  137. figrecipe/_editor/_templates/_styles/_preview.py +225 -0
  138. figrecipe/_editor/_templates/_styles/_selection.py +73 -0
  139. figrecipe/_params/_DECORATION_METHODS.py +33 -0
  140. figrecipe/_params/_PLOTTING_METHODS.py +58 -0
  141. figrecipe/_params/__init__.py +9 -0
  142. figrecipe/_recorder.py +92 -110
  143. figrecipe/_recorder_utils.py +124 -0
  144. figrecipe/_reproducer/__init__.py +18 -0
  145. figrecipe/_reproducer/_core.py +498 -0
  146. figrecipe/_reproducer/_custom_plots.py +279 -0
  147. figrecipe/_reproducer/_seaborn.py +100 -0
  148. figrecipe/_reproducer/_violin.py +186 -0
  149. figrecipe/_seaborn.py +14 -9
  150. figrecipe/_serializer.py +2 -2
  151. figrecipe/_signatures/README.md +68 -0
  152. figrecipe/_signatures/__init__.py +12 -2
  153. figrecipe/_signatures/_kwargs.py +273 -0
  154. figrecipe/_signatures/_loader.py +114 -57
  155. figrecipe/_signatures/_parsing.py +147 -0
  156. figrecipe/_utils/__init__.py +6 -4
  157. figrecipe/_utils/_crop.py +10 -4
  158. figrecipe/_utils/_image_diff.py +37 -33
  159. figrecipe/_utils/_numpy_io.py +0 -1
  160. figrecipe/_utils/_units.py +11 -3
  161. figrecipe/_validator.py +12 -3
  162. figrecipe/_wrappers/_axes.py +193 -170
  163. figrecipe/_wrappers/_axes_helpers.py +136 -0
  164. figrecipe/_wrappers/_axes_plots.py +418 -0
  165. figrecipe/_wrappers/_axes_seaborn.py +157 -0
  166. figrecipe/_wrappers/_figure.py +277 -18
  167. figrecipe/_wrappers/_panel_labels.py +127 -0
  168. figrecipe/_wrappers/_plot_helpers.py +143 -0
  169. figrecipe/_wrappers/_violin_helpers.py +180 -0
  170. figrecipe/plt.py +0 -1
  171. figrecipe/pyplot.py +2 -1
  172. figrecipe/styles/__init__.py +12 -11
  173. figrecipe/styles/_dotdict.py +72 -0
  174. figrecipe/styles/_finalize.py +134 -0
  175. figrecipe/styles/_fonts.py +77 -0
  176. figrecipe/styles/_kwargs_converter.py +178 -0
  177. figrecipe/styles/_plot_styles.py +209 -0
  178. figrecipe/styles/_style_applier.py +60 -202
  179. figrecipe/styles/_style_loader.py +73 -121
  180. figrecipe/styles/_themes.py +151 -0
  181. figrecipe/styles/presets/MATPLOTLIB.yaml +95 -0
  182. figrecipe/styles/presets/SCITEX.yaml +181 -0
  183. figrecipe-0.7.4.dist-info/METADATA +429 -0
  184. figrecipe-0.7.4.dist-info/RECORD +188 -0
  185. figrecipe/_reproducer.py +0 -358
  186. figrecipe-0.5.0.dist-info/METADATA +0 -336
  187. figrecipe-0.5.0.dist-info/RECORD +0 -26
  188. {figrecipe-0.5.0.dist-info → figrecipe-0.7.4.dist-info}/WHEEL +0 -0
  189. {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
+ [![PyPI version](https://badge.fury.io/py/figrecipe.svg)](https://badge.fury.io/py/figrecipe)
72
+ [![Tests](https://github.com/ywatanabe1989/figrecipe/actions/workflows/test.yml/badge.svg)](https://github.com/ywatanabe1989/figrecipe/actions/workflows/test.yml)
73
+ [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](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
+ | ![Line](docs/images/plot_types/category_line_curve.png) | ![Scatter](docs/images/plot_types/category_scatter_points.png) | ![Distribution](docs/images/plot_types/category_distribution.png) |
131
+
132
+ | Bar & Categorical | Contour & Surface | 2D/Image/Matrix |
133
+ |:---:|:---:|:---:|
134
+ | ![Bar](docs/images/plot_types/category_bar_categorical.png) | ![Contour](docs/images/plot_types/category_contour_surface.png) | ![Image](docs/images/plot_types/category_2d_image_matrix.png) |
135
+
136
+ | Vector & Flow | Spectral & Signal | Special |
137
+ |:---:|:---:|:---:|
138
+ | ![Vector](docs/images/plot_types/category_vector_flow.png) | ![Spectral](docs/images/plot_types/category_spectral_signal.png) | ![Special](docs/images/plot_types/category_special.png) |
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
+ | ![Axis Panel](docs/images/editor_axis_panel.png) | ![Download](docs/images/editor_download_options.png) | ![Dark Mode](docs/images/editor_dark_mode.png) |
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,,