scitex 2.10.2__py3-none-any.whl → 2.11.0__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 (363) hide show
  1. scitex/__init__.py +1 -4
  2. scitex/__version__.py +1 -1
  3. scitex/_install_guide.py +14 -2
  4. scitex/bridge/_figrecipe.py +1 -1
  5. scitex/bridge/_helpers.py +1 -1
  6. scitex/bridge/_plt_vis.py +1 -1
  7. scitex/bridge/_stats_plt.py +1 -1
  8. scitex/bridge/_stats_vis.py +2 -2
  9. scitex/{fig → canvas}/__init__.py +84 -96
  10. scitex/{fig → canvas}/backend/_parser.py +1 -1
  11. scitex/{fig → canvas}/canvas.py +13 -14
  12. scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
  13. scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
  14. scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
  15. scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
  16. scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
  17. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
  18. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
  19. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
  20. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
  21. scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
  22. scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
  23. scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
  24. scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
  25. scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
  26. scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
  27. scitex/{fig → canvas}/io/__init__.py +32 -38
  28. scitex/{fig → canvas}/io/_bundle.py +217 -154
  29. scitex/{fig → canvas}/io/_canvas.py +1 -1
  30. scitex/{fig → canvas}/io/_data.py +1 -1
  31. scitex/{fig → canvas}/io/_export.py +1 -1
  32. scitex/{fig → canvas}/io/_load.py +1 -1
  33. scitex/{fig → canvas}/io/_panel.py +1 -1
  34. scitex/{fig → canvas}/io/_save.py +1 -1
  35. scitex/{fig → canvas}/model/__init__.py +1 -1
  36. scitex/{fig → canvas}/model/_annotations.py +1 -1
  37. scitex/{fig → canvas}/model/_axes.py +1 -1
  38. scitex/{fig → canvas}/model/_figure.py +1 -1
  39. scitex/{fig → canvas}/model/_guides.py +1 -1
  40. scitex/{fig → canvas}/model/_plot.py +1 -1
  41. scitex/{fig → canvas}/model/_styles.py +1 -1
  42. scitex/{fig → canvas}/utils/__init__.py +1 -1
  43. scitex/cli/convert.py +10 -6
  44. scitex/diagram/README.md +7 -7
  45. scitex/io/__init__.py +7 -19
  46. scitex/io/_load.py +15 -19
  47. scitex/io/_load_modules/_canvas.py +2 -2
  48. scitex/io/_load_modules/_con.py +5 -5
  49. scitex/io/_load_modules/_eeg.py +16 -12
  50. scitex/io/_save.py +11 -16
  51. scitex/io/_save_modules/__init__.py +6 -10
  52. scitex/io/_save_modules/_canvas.py +3 -3
  53. scitex/io/_save_modules/_plot_bundle.py +112 -0
  54. scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
  55. scitex/io/_save_modules/_stx_bundle.py +16 -16
  56. scitex/io/bundle/README.md +89 -80
  57. scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
  58. scitex/io/bundle/__init__.py +67 -35
  59. scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
  60. scitex/io/bundle/_core.py +184 -97
  61. scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
  62. scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
  63. scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
  64. scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
  65. scitex/io/bundle/_manifest.py +99 -0
  66. scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
  67. scitex/io/bundle/_nested.py +113 -100
  68. scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
  69. scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
  70. scitex/io/bundle/_types.py +41 -16
  71. scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
  72. scitex/io/bundle/_zip.py +21 -31
  73. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
  74. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
  75. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
  76. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
  77. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
  78. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
  79. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
  80. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
  81. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
  82. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
  83. scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
  84. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
  85. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
  86. scitex/io/bundle/schemas/__init__.py +30 -0
  87. scitex/parallel/_run.py +5 -4
  88. scitex/path/_find.py +60 -83
  89. scitex/path/_get_module_path.py +23 -21
  90. scitex/path/_get_spath.py +6 -27
  91. scitex/path/_getsize.py +23 -9
  92. scitex/path/_increment_version.py +31 -38
  93. scitex/path/_mk_spath.py +26 -29
  94. scitex/path/_path.py +5 -12
  95. scitex/path/_split.py +27 -15
  96. scitex/path/_this_path.py +23 -9
  97. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
  98. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
  99. scitex/plt/gallery/_generate.py +76 -50
  100. scitex/plt/io/__init__.py +17 -19
  101. scitex/plt/io/_bundle.py +99 -52
  102. scitex/plt/io/_layered_bundle.py +303 -168
  103. scitex/plt/utils/_csv_column_naming.py +250 -118
  104. scitex/schema/__init__.py +69 -73
  105. scitex/schema/_canvas.py +1 -1
  106. scitex/schema/_stats.py +2 -2
  107. scitex/stats/__init__.py +30 -33
  108. scitex/stats/_schema.py +1 -1
  109. scitex/stats/io/__init__.py +10 -11
  110. scitex/stats/io/_bundle.py +16 -16
  111. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/METADATA +191 -72
  112. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/RECORD +237 -360
  113. scitex/fig/editor/_defaults.py +0 -300
  114. scitex/fig/editor/edit/panel_loader.py +0 -232
  115. scitex/fig/editor/flask_editor/_bbox.py +0 -1299
  116. scitex/fig/editor/flask_editor/_core.py +0 -1429
  117. scitex/fig/editor/flask_editor/_renderer.py +0 -813
  118. scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
  119. scitex/fts/README.md +0 -262
  120. scitex/fts/TODO.md +0 -66
  121. scitex/fts/__init__.py +0 -90
  122. scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
  123. scitex/fts/_bundle/__init__.py +0 -38
  124. scitex/fts/_bundle/_utils/__init__.py +0 -55
  125. scitex/fts/_bundle/_utils/_const.py +0 -26
  126. scitex/fts/_bundle/_utils/_errors.py +0 -73
  127. scitex/fts/_bundle/_utils/_generate.py +0 -21
  128. scitex/fts/_bundle/_utils/_types.py +0 -76
  129. scitex/fts/_bundle/_zipbundle.py +0 -165
  130. scitex/fts/_fig/__init__.py +0 -22
  131. scitex/fts/_fig/_backend/_parser.py +0 -188
  132. scitex/fts/_fig/_editor/__init__.py +0 -14
  133. scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
  134. scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
  135. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
  136. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
  137. scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
  138. scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
  139. scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
  140. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
  141. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
  142. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
  143. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
  144. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
  145. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
  146. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
  147. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
  148. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
  149. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
  150. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
  151. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
  152. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
  153. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
  154. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
  155. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
  156. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
  157. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
  158. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
  159. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
  160. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
  161. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
  162. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
  163. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
  164. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
  165. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
  166. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
  167. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
  168. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
  169. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
  170. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
  171. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
  172. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
  173. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
  174. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
  175. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
  176. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
  177. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
  178. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
  179. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
  180. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
  181. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
  182. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
  183. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
  184. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
  185. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
  186. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
  187. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
  188. scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
  189. scitex/fts/_fig/_models/_Annotations.py +0 -115
  190. scitex/fts/_fig/_models/_Axes.py +0 -152
  191. scitex/fts/_fig/_models/_Figure.py +0 -138
  192. scitex/fts/_fig/_models/_Plot.py +0 -123
  193. scitex/fts/_fig/_utils/_plot_layout.py +0 -397
  194. scitex/fts/_kinds/_figure/_composite.py +0 -345
  195. scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
  196. scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
  197. scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
  198. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
  199. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
  200. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
  201. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
  202. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
  203. scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
  204. scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
  205. scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
  206. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
  207. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
  208. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
  209. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
  210. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
  211. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
  212. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
  213. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
  214. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
  215. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
  216. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
  217. scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
  218. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
  219. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
  220. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
  221. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
  222. scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
  223. scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
  224. scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
  225. scitex/fts/_kinds/_table/_latex/_export.py +0 -279
  226. scitex/fts/_stats/__init__.py +0 -48
  227. scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
  228. scitex/fts/_stats/_dataclasses/__init__.py +0 -48
  229. scitex/fts/_tables/__init__.py +0 -65
  230. scitex/fts/_tables/_latex/__init__.py +0 -93
  231. scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
  232. scitex/fts/_tables/_latex/_editor/_app.py +0 -725
  233. scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
  234. scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
  235. scitex/fts/_tables/_latex/_table_exporter.py +0 -362
  236. scitex/fts/_tables/_latex/_utils.py +0 -369
  237. scitex/fts/_tables/_latex/_validator.py +0 -445
  238. scitex/io/_save_modules/_pltz_bundle.py +0 -356
  239. /scitex/{fig → canvas}/README.md +0 -0
  240. /scitex/{fig → canvas}/backend/__init__.py +0 -0
  241. /scitex/{fig → canvas}/backend/_export.py +0 -0
  242. /scitex/{fig → canvas}/backend/_render.py +0 -0
  243. /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
  244. /scitex/{fig → canvas}/editor/__init__.py +0 -0
  245. /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
  246. /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
  247. /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
  248. /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
  249. /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
  250. /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
  251. /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
  252. /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
  253. /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
  254. /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
  255. /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
  256. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
  257. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
  258. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
  259. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
  260. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
  261. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
  262. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
  263. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
  264. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
  265. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
  266. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
  267. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
  268. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
  269. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
  270. /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
  271. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
  272. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
  273. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
  274. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
  275. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
  276. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
  277. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
  278. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
  279. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
  280. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
  281. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
  282. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
  283. /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
  284. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
  285. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
  286. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
  287. /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
  288. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
  289. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
  290. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
  291. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
  292. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
  293. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
  294. /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
  295. /scitex/{fig → canvas}/io/_directory.py +0 -0
  296. /scitex/{fig → canvas}/model/_plot_types.py +0 -0
  297. /scitex/{fig → canvas}/utils/_defaults.py +0 -0
  298. /scitex/{fig → canvas}/utils/_validate.py +0 -0
  299. /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
  300. /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
  301. /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
  302. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
  303. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
  304. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
  305. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
  306. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
  307. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
  308. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
  309. /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
  310. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
  311. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
  312. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
  313. /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
  314. /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
  315. /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
  316. /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
  317. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
  318. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
  319. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
  320. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
  321. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
  322. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
  323. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
  324. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
  325. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
  326. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
  327. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
  328. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
  329. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
  330. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
  331. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
  332. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
  333. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
  334. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
  335. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
  336. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
  337. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
  338. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
  339. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
  340. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
  341. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
  342. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
  343. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
  344. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
  345. /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
  346. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
  347. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
  348. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
  349. /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
  350. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
  351. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
  352. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
  353. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
  354. /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
  355. /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
  356. /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
  357. /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
  358. /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
  359. /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
  360. /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
  361. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
  362. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
  363. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  # Timestamp: 2025-12-08
4
3
  # File: ./src/scitex/plt/utils/_csv_column_naming.py
5
4
 
@@ -10,68 +9,68 @@ This module ensures consistent column naming between:
10
9
  - CSV export (_export_as_csv)
11
10
  - JSON metadata (_collect_figure_metadata)
12
11
  - GUI editors (reading CSV data back)
12
+ - figrecipe compatibility
13
13
 
14
- Column naming convention:
15
- {domain-name-value}_{domain-name-value}_...
16
-
17
- - Underscore (_) separates different domains
18
- - Hyphen (-) within domain name and between name-value
19
-
20
- Format:
21
- ax-row-{row}-col-{col}_trace-id-{trace_id}_variable-{variable}
14
+ Column naming convention (figrecipe-compatible):
15
+ r{row}c{col}_{caller}-{id}_{var}
22
16
 
23
17
  Where:
24
- - ax-row-{row}-col-{col}: axes position in grid
25
- - trace-id-{id}: unique identifier for the trace, which can be:
26
- * User-provided id kwarg (e.g., "sine", "my-data")
27
- * Generated from label (e.g., "sin-x" from "sin(x)")
28
- * Auto-generated index (e.g., "0", "1")
29
- - variable-{var}: type of data variable (e.g., "x", "y", "bins", "heights")
18
+ - r{row}c{col}: axes position in grid (e.g., r0c0, r1c2)
19
+ - {caller}: plotting method name (e.g., plot, scatter, bar)
20
+ - {id}: user-provided id kwarg OR auto-generated per-method counter
21
+ - {var}: variable name (e.g., x, y, bins, heights)
30
22
 
31
23
  Examples:
32
- ax-row-0-col-0_trace-id-sine_variable-x (row 0, col 0, id "sine", x)
33
- ax-row-0-col-0_trace-id-sine_variable-y (row 0, col 0, id "sine", y)
34
- ax-row-0-col-1_trace-id-0_variable-x (row 0, col 1, auto id 0, x)
35
- ax-row-1-col-0_trace-id-my-data_variable-bins (row 1, col 0, "my-data", bins)
24
+ r0c0_plot-0_x (row 0, col 0, plot method, auto-id 0, x variable)
25
+ r0c0_plot-sine_y (row 0, col 0, plot method, id "sine", y variable)
26
+ r0c1_scatter-0_x (row 0, col 1, scatter method, auto-id 0, x)
27
+ r1c0_bar-sales_height (row 1, col 0, bar method, id "sales", height)
28
+
29
+ Legacy format (still supported for parsing):
30
+ ax-row-{row}-col-{col}_trace-id-{id}_variable-{var}
36
31
  """
37
32
 
33
+ import re
34
+
38
35
  __all__ = [
39
36
  "get_csv_column_name",
40
37
  "get_csv_column_prefix",
41
38
  "parse_csv_column_name",
42
- "sanitize_trace_id",
39
+ "sanitize_id",
43
40
  "get_unique_trace_id",
44
41
  ]
45
42
 
46
43
 
47
- def sanitize_trace_id(trace_id: str) -> str:
48
- """Sanitize trace ID for use in CSV column names.
44
+ def sanitize_id(raw_id: str) -> str:
45
+ """Sanitize ID for use in CSV column names.
49
46
 
50
47
  Removes or replaces characters that could cause issues in column names.
51
48
  Uses hyphen (-) for word separation within values.
52
49
 
53
50
  Parameters
54
51
  ----------
55
- trace_id : str
56
- Raw trace identifier (label, id kwarg, or generated)
52
+ raw_id : str
53
+ Raw identifier (label, id kwarg, or generated)
57
54
 
58
55
  Returns
59
56
  -------
60
57
  str
61
- Sanitized trace ID safe for CSV column names
58
+ Sanitized ID safe for CSV column names
62
59
 
63
60
  Examples
64
61
  --------
65
- >>> sanitize_trace_id("sin(x)")
62
+ >>> sanitize_id("sin(x)")
66
63
  'sin-x'
67
- >>> sanitize_trace_id("My Data")
64
+ >>> sanitize_id("My Data")
68
65
  'my-data'
66
+ >>> sanitize_id("hello_world")
67
+ 'hello-world'
69
68
  """
70
- if not trace_id:
71
- return "unnamed"
69
+ if not raw_id:
70
+ return "0"
72
71
 
73
- # Replace problematic characters with hyphen (word separator within values)
74
- sanitized = str(trace_id).lower()
72
+ # Replace problematic characters with hyphen
73
+ sanitized = str(raw_id).lower()
75
74
  result = []
76
75
  for char in sanitized:
77
76
  if char.isalnum():
@@ -89,16 +88,16 @@ def sanitize_trace_id(trace_id: str) -> str:
89
88
  # Remove leading/trailing hyphens
90
89
  sanitized = sanitized.strip("-")
91
90
 
92
- return sanitized if sanitized else "unnamed"
91
+ return sanitized if sanitized else "0"
92
+
93
+
94
+ # Backward compatibility alias
95
+ sanitize_trace_id = sanitize_id
93
96
 
94
97
 
95
98
  def get_unique_trace_id(trace_id: str, existing_ids: set) -> str:
96
99
  """Get unique trace ID, adding suffix if collision detected.
97
100
 
98
- This function ensures trace IDs remain unique even when multiple traces
99
- have IDs that sanitize to the same value (e.g., "A" and "a" both become "a").
100
- When a collision is detected, suffixes are added: a -> a-1 -> a-2, etc.
101
-
102
101
  Parameters
103
102
  ----------
104
103
  trace_id : str
@@ -116,20 +115,10 @@ def get_unique_trace_id(trace_id: str, existing_ids: set) -> str:
116
115
  >>> ids = set()
117
116
  >>> get_unique_trace_id("A", ids)
118
117
  'a'
119
- >>> ids
120
- {'a'}
121
118
  >>> get_unique_trace_id("a", ids) # collision!
122
119
  'a-1'
123
- >>> ids
124
- {'a', 'a-1'}
125
- >>> get_unique_trace_id("A ", ids) # another collision!
126
- 'a-2'
127
- >>> ids
128
- {'a', 'a-1', 'a-2'}
129
- >>> get_unique_trace_id("B", ids) # no collision
130
- 'b'
131
120
  """
132
- base_id = sanitize_trace_id(trace_id)
121
+ base_id = sanitize_id(trace_id)
133
122
 
134
123
  if base_id not in existing_ids:
135
124
  existing_ids.add(base_id)
@@ -146,13 +135,15 @@ def get_unique_trace_id(trace_id: str, existing_ids: set) -> str:
146
135
 
147
136
 
148
137
  def get_csv_column_prefix(
149
- ax_row: int = 0, ax_col: int = 0, trace_id: str = None, trace_index: int = None
138
+ ax_row: int = 0,
139
+ ax_col: int = 0,
140
+ caller: str = "plot",
141
+ trace_id: str = None,
142
+ trace_index: int = None,
150
143
  ) -> str:
151
144
  """Get CSV column prefix for a trace.
152
145
 
153
- Format: ax-row-{row}-col-{col}_trace-id-{id}_variable-
154
- - Underscore (_) separates domains
155
- - Hyphen (-) within domain names and between name-value
146
+ Format: r{row}c{col}_{caller}-{id}_
156
147
 
157
148
  Parameters
158
149
  ----------
@@ -160,45 +151,152 @@ def get_csv_column_prefix(
160
151
  Row position of axes in grid (default: 0)
161
152
  ax_col : int
162
153
  Column position of axes in grid (default: 0)
154
+ caller : str
155
+ Plotting method name (default: "plot")
163
156
  trace_id : str, optional
164
- Trace identifier (from label or id kwarg). If None, uses trace_index.
157
+ User-provided trace identifier. If None, uses trace_index.
165
158
  trace_index : int, optional
166
- Index of trace when no trace_id is provided (default: 0)
159
+ Auto-generated index when no trace_id provided (default: 0)
167
160
 
168
161
  Returns
169
162
  -------
170
163
  str
171
- Column prefix like "ax-row-0-col-0_trace-id-sine_variable-"
164
+ Column prefix like "r0c0_plot-sine_"
172
165
 
173
166
  Examples
174
167
  --------
175
- >>> get_csv_column_prefix(trace_id="sine")
176
- 'ax-row-0-col-0_trace-id-sine_variable-'
177
- >>> get_csv_column_prefix(ax_row=1, ax_col=2, trace_index=0)
178
- 'ax-row-1-col-2_trace-id-0_variable-'
168
+ >>> get_csv_column_prefix(caller="plot", trace_id="sine")
169
+ 'r0c0_plot-sine_'
170
+ >>> get_csv_column_prefix(ax_row=1, ax_col=2, caller="scatter", trace_index=0)
171
+ 'r1c2_scatter-0_'
179
172
  """
180
173
  if trace_id:
181
- safe_id = sanitize_trace_id(trace_id)
174
+ safe_id = sanitize_id(trace_id)
182
175
  elif trace_index is not None:
183
176
  safe_id = str(trace_index)
184
177
  else:
185
178
  safe_id = "0"
186
179
 
187
- return f"ax-row-{ax_row}-col-{ax_col}_trace-id-{safe_id}_variable-"
180
+ return f"r{ax_row}c{ax_col}_{caller}-{safe_id}_"
181
+
182
+
183
+ def _extract_caller_and_id(trace_id: str) -> tuple:
184
+ """Extract caller (method) and id from a combined trace_id.
185
+
186
+ Handles various formats:
187
+ - "plot_0" -> ("plot", "0")
188
+ - "scatter_1" -> ("scatter", "1")
189
+ - "stx_line_0" -> ("stx_line", "0")
190
+ - "sine" -> ("plot", "sine") # user-provided, default to "plot"
191
+ - "plot-sine" -> ("plot", "sine")
192
+
193
+ Parameters
194
+ ----------
195
+ trace_id : str
196
+ Combined trace identifier
197
+
198
+ Returns
199
+ -------
200
+ tuple
201
+ (caller, id)
202
+ """
203
+ if not trace_id:
204
+ return ("plot", "0")
205
+
206
+ # Known method prefixes (order matters - longer first)
207
+ known_methods = [
208
+ "stx_line",
209
+ "stx_scatter",
210
+ "stx_bar",
211
+ "stx_barh",
212
+ "stx_box",
213
+ "stx_violin",
214
+ "stx_heatmap",
215
+ "stx_image",
216
+ "stx_imshow",
217
+ "stx_contour",
218
+ "stx_raster",
219
+ "stx_conf_mat",
220
+ "stx_joyplot",
221
+ "stx_rectangle",
222
+ "stx_fillv",
223
+ "stx_kde",
224
+ "stx_ecdf",
225
+ "stx_mean_std",
226
+ "stx_mean_ci",
227
+ "stx_median_iqr",
228
+ "stx_shaded_line",
229
+ "stx_errorbar",
230
+ "stx_fill_between",
231
+ "sns_boxplot",
232
+ "sns_violinplot",
233
+ "sns_barplot",
234
+ "sns_histplot",
235
+ "sns_kdeplot",
236
+ "sns_scatterplot",
237
+ "sns_lineplot",
238
+ "sns_swarmplot",
239
+ "sns_stripplot",
240
+ "sns_heatmap",
241
+ "sns_jointplot",
242
+ "sns_pairplot",
243
+ "plot_scatter",
244
+ "plot_box",
245
+ "plot_imshow",
246
+ "plot_kde",
247
+ "plot",
248
+ "scatter",
249
+ "bar",
250
+ "barh",
251
+ "hist",
252
+ "boxplot",
253
+ "violinplot",
254
+ "errorbar",
255
+ "fill_between",
256
+ "contour",
257
+ "contourf",
258
+ "imshow",
259
+ "pcolormesh",
260
+ "quiver",
261
+ "streamplot",
262
+ "stem",
263
+ "step",
264
+ "pie",
265
+ "hexbin",
266
+ "matshow",
267
+ "eventplot",
268
+ "stackplot",
269
+ "fill",
270
+ "text",
271
+ "annotate",
272
+ ]
273
+
274
+ # Check if trace_id starts with a known method
275
+ for method in known_methods:
276
+ # Check with underscore separator (e.g., "plot_0", "stx_line_0")
277
+ if trace_id.startswith(f"{method}_"):
278
+ remainder = trace_id[len(method) + 1 :]
279
+ return (method, remainder if remainder else "0")
280
+ # Check with hyphen separator (e.g., "plot-sine")
281
+ if trace_id.startswith(f"{method}-"):
282
+ remainder = trace_id[len(method) + 1 :]
283
+ return (method, remainder if remainder else "0")
284
+
285
+ # No known method prefix - assume user-provided ID, default caller to "plot"
286
+ return ("plot", trace_id)
188
287
 
189
288
 
190
289
  def get_csv_column_name(
191
290
  variable: str,
192
291
  ax_row: int = 0,
193
292
  ax_col: int = 0,
293
+ caller: str = None,
194
294
  trace_id: str = None,
195
295
  trace_index: int = None,
196
296
  ) -> str:
197
297
  """Get full CSV column name for a data field.
198
298
 
199
- Format: ax-row-{row}-col-{col}_trace-id-{id}_variable-{var}
200
- - Underscore (_) separates domains
201
- - Hyphen (-) within domain names and between name-value
299
+ Format: r{row}c{col}_{caller}-{id}_{var}
202
300
 
203
301
  Parameters
204
302
  ----------
@@ -208,25 +306,34 @@ def get_csv_column_name(
208
306
  Row position of axes in grid (default: 0)
209
307
  ax_col : int
210
308
  Column position of axes in grid (default: 0)
309
+ caller : str, optional
310
+ Plotting method name. If None, extracted from trace_id or defaults to "plot"
211
311
  trace_id : str, optional
212
- Trace identifier (from label or id kwarg)
312
+ User-provided trace identifier. May contain method prefix (e.g., "plot_0")
213
313
  trace_index : int, optional
214
- Index of trace when no trace_id is provided
314
+ Auto-generated index when no trace_id provided
215
315
 
216
316
  Returns
217
317
  -------
218
318
  str
219
- Full column name like "ax-row-0-col-0_trace-id-sine_variable-x"
319
+ Full column name like "r0c0_plot-sine_x"
220
320
 
221
321
  Examples
222
322
  --------
223
- >>> get_csv_column_name("x", trace_id="sin(x)")
224
- 'ax-row-0-col-0_trace-id-sin-x_variable-x'
225
- >>> get_csv_column_name("y", ax_row=1, ax_col=2, trace_index=0)
226
- 'ax-row-1-col-2_trace-id-0_variable-y'
323
+ >>> get_csv_column_name("x", caller="plot", trace_id="sine")
324
+ 'r0c0_plot-sine_x'
325
+ >>> get_csv_column_name("y", ax_row=1, ax_col=2, caller="scatter", trace_index=0)
326
+ 'r1c2_scatter-0_y'
327
+ >>> get_csv_column_name("x", trace_id="plot_0") # backward compatible
328
+ 'r0c0_plot-0_x'
227
329
  """
228
- prefix = get_csv_column_prefix(ax_row, ax_col, trace_id, trace_index)
229
- # Variable names are simple (x, y, bins, etc.)
330
+ # If caller not provided, try to extract from trace_id
331
+ if caller is None and trace_id:
332
+ caller, trace_id = _extract_caller_and_id(trace_id)
333
+ elif caller is None:
334
+ caller = "plot"
335
+
336
+ prefix = get_csv_column_prefix(ax_row, ax_col, caller, trace_id, trace_index)
230
337
  safe_variable = variable.lower()
231
338
  return f"{prefix}{safe_variable}"
232
339
 
@@ -234,14 +341,14 @@ def get_csv_column_name(
234
341
  def parse_csv_column_name(column_name: str) -> dict:
235
342
  """Parse CSV column name to extract components.
236
343
 
237
- Format: ax-row-{row}-col-{col}_trace-id-{id}_variable-{var}
238
- - Underscore (_) separates domains
239
- - Hyphen (-) within domain names and between name-value
344
+ Supports both new format and legacy format:
345
+ - New: r{row}c{col}_{caller}-{id}_{var}
346
+ - Legacy: ax-row-{row}-col-{col}_trace-id-{id}_variable-{var}
240
347
 
241
348
  Parameters
242
349
  ----------
243
350
  column_name : str
244
- Full column name (e.g., "ax-row-0-col-0_trace-id-sine_variable-x")
351
+ Full column name
245
352
 
246
353
  Returns
247
354
  -------
@@ -249,61 +356,73 @@ def parse_csv_column_name(column_name: str) -> dict:
249
356
  Dictionary with keys:
250
357
  - ax_row: int
251
358
  - ax_col: int
359
+ - caller: str (method name, empty for legacy format)
252
360
  - trace_id: str
253
361
  - variable: str
254
362
  - valid: bool (True if parsing succeeded)
255
363
 
256
364
  Examples
257
365
  --------
258
- >>> parse_csv_column_name("ax-row-0-col-0_trace-id-sine_variable-x")
259
- {'ax_row': 0, 'ax_col': 0, 'trace_id': 'sine', 'variable': 'x', 'valid': True}
260
- >>> parse_csv_column_name("ax-row-1-col-2_trace-id-my-data_variable-bins")
261
- {'ax_row': 1, 'ax_col': 2, 'trace_id': 'my-data', 'variable': 'bins', 'valid': True}
366
+ >>> parse_csv_column_name("r0c0_plot-sine_x")
367
+ {'ax_row': 0, 'ax_col': 0, 'caller': 'plot', 'trace_id': 'sine', 'variable': 'x', 'valid': True}
368
+ >>> parse_csv_column_name("r1c2_scatter-0_y")
369
+ {'ax_row': 1, 'ax_col': 2, 'caller': 'scatter', 'trace_id': '0', 'variable': 'y', 'valid': True}
262
370
  """
263
371
  result = {
264
372
  "ax_row": 0,
265
373
  "ax_col": 0,
374
+ "caller": "",
266
375
  "trace_id": "",
267
376
  "variable": "",
268
377
  "valid": False,
269
378
  }
270
379
 
271
- if not column_name or not column_name.startswith("ax-row-"):
380
+ if not column_name:
381
+ return result
382
+
383
+ # Try new format: r{row}c{col}_{caller}-{id}_{var}
384
+ new_pattern = re.compile(r"^r(\d+)c(\d+)_([a-z_]+)-([^_]+)_([a-z]+)$")
385
+ match = new_pattern.match(column_name)
386
+ if match:
387
+ result["ax_row"] = int(match.group(1))
388
+ result["ax_col"] = int(match.group(2))
389
+ result["caller"] = match.group(3)
390
+ result["trace_id"] = match.group(4)
391
+ result["variable"] = match.group(5)
392
+ result["valid"] = True
272
393
  return result
273
394
 
274
- try:
275
- # Split by underscore to get domain groups
276
- parts = column_name.split("_")
277
- # Expected: ["ax-row-0-col-0", "trace-id-sine", "variable-x"]
278
-
279
- for part in parts:
280
- if part.startswith("ax-row-"):
281
- # Parse ax-row-{row}-col-{col}
282
- # Remove "ax-row-" prefix and split by "-col-"
283
- rest = part[7:] # Remove "ax-row-"
284
- if "-col-" in rest:
285
- row_str, col_str = rest.split("-col-")
286
- result["ax_row"] = int(row_str)
287
- result["ax_col"] = int(col_str)
288
- elif part.startswith("trace-id-"):
289
- # Extract trace id (everything after "trace-id-")
290
- result["trace_id"] = part[9:]
291
- elif part.startswith("variable-"):
292
- # Extract variable (everything after "variable-")
293
- result["variable"] = part[9:]
294
-
295
- # Validate we got all required fields
296
- if result["variable"]:
297
- result["valid"] = True
298
-
299
- except (ValueError, IndexError):
300
- pass
395
+ # Try legacy format: ax-row-{row}-col-{col}_trace-id-{id}_variable-{var}
396
+ if column_name.startswith("ax-row-"):
397
+ try:
398
+ parts = column_name.split("_")
399
+ for part in parts:
400
+ if part.startswith("ax-row-"):
401
+ rest = part[7:]
402
+ if "-col-" in rest:
403
+ row_str, col_str = rest.split("-col-")
404
+ result["ax_row"] = int(row_str)
405
+ result["ax_col"] = int(col_str)
406
+ elif part.startswith("trace-id-"):
407
+ result["trace_id"] = part[9:]
408
+ elif part.startswith("variable-"):
409
+ result["variable"] = part[9:]
410
+
411
+ if result["variable"]:
412
+ result["valid"] = True
413
+ except (ValueError, IndexError):
414
+ pass
301
415
 
302
416
  return result
303
417
 
304
418
 
305
419
  def get_trace_columns_from_df(
306
- df, trace_id: str = None, trace_index: int = None, ax_row: int = 0, ax_col: int = 0
420
+ df,
421
+ caller: str = None,
422
+ trace_id: str = None,
423
+ trace_index: int = None,
424
+ ax_row: int = 0,
425
+ ax_col: int = 0,
307
426
  ) -> dict:
308
427
  """Find CSV columns for a specific trace in a DataFrame.
309
428
 
@@ -311,6 +430,8 @@ def get_trace_columns_from_df(
311
430
  ----------
312
431
  df : pandas.DataFrame
313
432
  DataFrame with CSV data
433
+ caller : str, optional
434
+ Plotting method name to filter by
314
435
  trace_id : str, optional
315
436
  Trace identifier to search for
316
437
  trace_index : int, optional
@@ -323,18 +444,29 @@ def get_trace_columns_from_df(
323
444
  Returns
324
445
  -------
325
446
  dict
326
- Dictionary mapping variable names to column names, e.g.:
327
- {'x': 'ax-row-0-col-0_trace-id-sine_variable-x',
328
- 'y': 'ax-row-0-col-0_trace-id-sine_variable-y'}
447
+ Dictionary mapping variable names to column names
329
448
  """
330
449
  result = {}
331
- prefix = get_csv_column_prefix(ax_row, ax_col, trace_id, trace_index)
332
450
 
333
- for col in df.columns:
334
- if col.startswith(prefix):
335
- # Extract variable from column name
336
- variable = col[len(prefix):]
337
- result[variable] = col
451
+ if caller:
452
+ prefix = get_csv_column_prefix(ax_row, ax_col, caller, trace_id, trace_index)
453
+ for col in df.columns:
454
+ if col.startswith(prefix):
455
+ variable = col[len(prefix) :]
456
+ result[variable] = col
457
+ else:
458
+ # Search all columns matching position and trace
459
+ for col in df.columns:
460
+ parsed = parse_csv_column_name(col)
461
+ if (
462
+ parsed["valid"]
463
+ and parsed["ax_row"] == ax_row
464
+ and parsed["ax_col"] == ax_col
465
+ ):
466
+ if trace_id and parsed["trace_id"] == sanitize_id(trace_id):
467
+ result[parsed["variable"]] = col
468
+ elif trace_index is not None and parsed["trace_id"] == str(trace_index):
469
+ result[parsed["variable"]] = col
338
470
 
339
471
  return result
340
472