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.
- scitex/__init__.py +1 -4
- scitex/__version__.py +1 -1
- scitex/_install_guide.py +14 -2
- scitex/bridge/_figrecipe.py +1 -1
- scitex/bridge/_helpers.py +1 -1
- scitex/bridge/_plt_vis.py +1 -1
- scitex/bridge/_stats_plt.py +1 -1
- scitex/bridge/_stats_vis.py +2 -2
- scitex/{fig → canvas}/__init__.py +84 -96
- scitex/{fig → canvas}/backend/_parser.py +1 -1
- scitex/{fig → canvas}/canvas.py +13 -14
- scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
- scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
- scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
- scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
- scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
- scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
- scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
- scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
- scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
- scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
- scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
- scitex/{fig → canvas}/io/__init__.py +32 -38
- scitex/{fig → canvas}/io/_bundle.py +217 -154
- scitex/{fig → canvas}/io/_canvas.py +1 -1
- scitex/{fig → canvas}/io/_data.py +1 -1
- scitex/{fig → canvas}/io/_export.py +1 -1
- scitex/{fig → canvas}/io/_load.py +1 -1
- scitex/{fig → canvas}/io/_panel.py +1 -1
- scitex/{fig → canvas}/io/_save.py +1 -1
- scitex/{fig → canvas}/model/__init__.py +1 -1
- scitex/{fig → canvas}/model/_annotations.py +1 -1
- scitex/{fig → canvas}/model/_axes.py +1 -1
- scitex/{fig → canvas}/model/_figure.py +1 -1
- scitex/{fig → canvas}/model/_guides.py +1 -1
- scitex/{fig → canvas}/model/_plot.py +1 -1
- scitex/{fig → canvas}/model/_styles.py +1 -1
- scitex/{fig → canvas}/utils/__init__.py +1 -1
- scitex/cli/convert.py +10 -6
- scitex/diagram/README.md +7 -7
- scitex/io/__init__.py +7 -19
- scitex/io/_load.py +15 -19
- scitex/io/_load_modules/_canvas.py +2 -2
- scitex/io/_load_modules/_con.py +5 -5
- scitex/io/_load_modules/_eeg.py +16 -12
- scitex/io/_save.py +11 -16
- scitex/io/_save_modules/__init__.py +6 -10
- scitex/io/_save_modules/_canvas.py +3 -3
- scitex/io/_save_modules/_plot_bundle.py +112 -0
- scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
- scitex/io/_save_modules/_stx_bundle.py +16 -16
- scitex/io/bundle/README.md +89 -80
- scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
- scitex/io/bundle/__init__.py +67 -35
- scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
- scitex/io/bundle/_core.py +184 -97
- scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
- scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
- scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
- scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
- scitex/io/bundle/_manifest.py +99 -0
- scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
- scitex/io/bundle/_nested.py +113 -100
- scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
- scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
- scitex/io/bundle/_types.py +41 -16
- scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
- scitex/io/bundle/_zip.py +21 -31
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
- scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
- scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
- scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
- scitex/io/bundle/schemas/__init__.py +30 -0
- scitex/parallel/_run.py +5 -4
- scitex/path/_find.py +60 -83
- scitex/path/_get_module_path.py +23 -21
- scitex/path/_get_spath.py +6 -27
- scitex/path/_getsize.py +23 -9
- scitex/path/_increment_version.py +31 -38
- scitex/path/_mk_spath.py +26 -29
- scitex/path/_path.py +5 -12
- scitex/path/_split.py +27 -15
- scitex/path/_this_path.py +23 -9
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
- scitex/plt/gallery/_generate.py +76 -50
- scitex/plt/io/__init__.py +17 -19
- scitex/plt/io/_bundle.py +99 -52
- scitex/plt/io/_layered_bundle.py +303 -168
- scitex/plt/utils/_csv_column_naming.py +250 -118
- scitex/schema/__init__.py +69 -73
- scitex/schema/_canvas.py +1 -1
- scitex/schema/_stats.py +2 -2
- scitex/stats/__init__.py +30 -33
- scitex/stats/_schema.py +1 -1
- scitex/stats/io/__init__.py +10 -11
- scitex/stats/io/_bundle.py +16 -16
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/METADATA +191 -72
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/RECORD +237 -360
- scitex/fig/editor/_defaults.py +0 -300
- scitex/fig/editor/edit/panel_loader.py +0 -232
- scitex/fig/editor/flask_editor/_bbox.py +0 -1299
- scitex/fig/editor/flask_editor/_core.py +0 -1429
- scitex/fig/editor/flask_editor/_renderer.py +0 -813
- scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
- scitex/fts/README.md +0 -262
- scitex/fts/TODO.md +0 -66
- scitex/fts/__init__.py +0 -90
- scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
- scitex/fts/_bundle/__init__.py +0 -38
- scitex/fts/_bundle/_utils/__init__.py +0 -55
- scitex/fts/_bundle/_utils/_const.py +0 -26
- scitex/fts/_bundle/_utils/_errors.py +0 -73
- scitex/fts/_bundle/_utils/_generate.py +0 -21
- scitex/fts/_bundle/_utils/_types.py +0 -76
- scitex/fts/_bundle/_zipbundle.py +0 -165
- scitex/fts/_fig/__init__.py +0 -22
- scitex/fts/_fig/_backend/_parser.py +0 -188
- scitex/fts/_fig/_editor/__init__.py +0 -14
- scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
- scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
- scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
- scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
- scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
- scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
- scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
- scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
- scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
- scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
- scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
- scitex/fts/_fig/_models/_Annotations.py +0 -115
- scitex/fts/_fig/_models/_Axes.py +0 -152
- scitex/fts/_fig/_models/_Figure.py +0 -138
- scitex/fts/_fig/_models/_Plot.py +0 -123
- scitex/fts/_fig/_utils/_plot_layout.py +0 -397
- scitex/fts/_kinds/_figure/_composite.py +0 -345
- scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
- scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
- scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
- scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
- scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
- scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
- scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
- scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
- scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
- scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
- scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
- scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
- scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
- scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
- scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
- scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
- scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
- scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
- scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
- scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
- scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
- scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
- scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
- scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
- scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
- scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
- scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
- scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
- scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
- scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
- scitex/fts/_kinds/_table/_latex/_export.py +0 -279
- scitex/fts/_stats/__init__.py +0 -48
- scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
- scitex/fts/_stats/_dataclasses/__init__.py +0 -48
- scitex/fts/_tables/__init__.py +0 -65
- scitex/fts/_tables/_latex/__init__.py +0 -93
- scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
- scitex/fts/_tables/_latex/_editor/_app.py +0 -725
- scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
- scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
- scitex/fts/_tables/_latex/_table_exporter.py +0 -362
- scitex/fts/_tables/_latex/_utils.py +0 -369
- scitex/fts/_tables/_latex/_validator.py +0 -445
- scitex/io/_save_modules/_pltz_bundle.py +0 -356
- /scitex/{fig → canvas}/README.md +0 -0
- /scitex/{fig → canvas}/backend/__init__.py +0 -0
- /scitex/{fig → canvas}/backend/_export.py +0 -0
- /scitex/{fig → canvas}/backend/_render.py +0 -0
- /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
- /scitex/{fig → canvas}/editor/__init__.py +0 -0
- /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
- /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
- /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
- /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
- /scitex/{fig → canvas}/io/_directory.py +0 -0
- /scitex/{fig → canvas}/model/_plot_types.py +0 -0
- /scitex/{fig → canvas}/utils/_defaults.py +0 -0
- /scitex/{fig → canvas}/utils/_validate.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
- {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
|
-
{
|
|
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
|
-
-
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
"
|
|
39
|
+
"sanitize_id",
|
|
43
40
|
"get_unique_trace_id",
|
|
44
41
|
]
|
|
45
42
|
|
|
46
43
|
|
|
47
|
-
def
|
|
48
|
-
"""Sanitize
|
|
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
|
-
|
|
56
|
-
Raw
|
|
52
|
+
raw_id : str
|
|
53
|
+
Raw identifier (label, id kwarg, or generated)
|
|
57
54
|
|
|
58
55
|
Returns
|
|
59
56
|
-------
|
|
60
57
|
str
|
|
61
|
-
Sanitized
|
|
58
|
+
Sanitized ID safe for CSV column names
|
|
62
59
|
|
|
63
60
|
Examples
|
|
64
61
|
--------
|
|
65
|
-
>>>
|
|
62
|
+
>>> sanitize_id("sin(x)")
|
|
66
63
|
'sin-x'
|
|
67
|
-
>>>
|
|
64
|
+
>>> sanitize_id("My Data")
|
|
68
65
|
'my-data'
|
|
66
|
+
>>> sanitize_id("hello_world")
|
|
67
|
+
'hello-world'
|
|
69
68
|
"""
|
|
70
|
-
if not
|
|
71
|
-
return "
|
|
69
|
+
if not raw_id:
|
|
70
|
+
return "0"
|
|
72
71
|
|
|
73
|
-
# Replace problematic characters with hyphen
|
|
74
|
-
sanitized = str(
|
|
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 "
|
|
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 =
|
|
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,
|
|
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:
|
|
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
|
-
|
|
157
|
+
User-provided trace identifier. If None, uses trace_index.
|
|
165
158
|
trace_index : int, optional
|
|
166
|
-
|
|
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 "
|
|
164
|
+
Column prefix like "r0c0_plot-sine_"
|
|
172
165
|
|
|
173
166
|
Examples
|
|
174
167
|
--------
|
|
175
|
-
>>> get_csv_column_prefix(trace_id="sine")
|
|
176
|
-
'
|
|
177
|
-
>>> get_csv_column_prefix(ax_row=1, ax_col=2, trace_index=0)
|
|
178
|
-
'
|
|
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 =
|
|
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"
|
|
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:
|
|
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
|
-
|
|
312
|
+
User-provided trace identifier. May contain method prefix (e.g., "plot_0")
|
|
213
313
|
trace_index : int, optional
|
|
214
|
-
|
|
314
|
+
Auto-generated index when no trace_id provided
|
|
215
315
|
|
|
216
316
|
Returns
|
|
217
317
|
-------
|
|
218
318
|
str
|
|
219
|
-
Full column name like "
|
|
319
|
+
Full column name like "r0c0_plot-sine_x"
|
|
220
320
|
|
|
221
321
|
Examples
|
|
222
322
|
--------
|
|
223
|
-
>>> get_csv_column_name("x", trace_id="
|
|
224
|
-
'
|
|
225
|
-
>>> get_csv_column_name("y", ax_row=1, ax_col=2, trace_index=0)
|
|
226
|
-
'
|
|
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
|
-
|
|
229
|
-
|
|
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
|
-
|
|
238
|
-
-
|
|
239
|
-
-
|
|
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
|
|
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("
|
|
259
|
-
{'ax_row': 0, 'ax_col': 0, 'trace_id': 'sine', 'variable': 'x', 'valid': True}
|
|
260
|
-
>>> parse_csv_column_name("
|
|
261
|
-
{'ax_row': 1, 'ax_col': 2, 'trace_id': '
|
|
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
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
result["
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
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
|
|