scitex 2.7.0__py3-none-any.whl → 2.8.1__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 +6 -2
- scitex/__version__.py +1 -1
- scitex/audio/README.md +52 -0
- scitex/audio/__init__.py +384 -0
- scitex/audio/__main__.py +129 -0
- scitex/audio/_tts.py +334 -0
- scitex/audio/engines/__init__.py +44 -0
- scitex/audio/engines/base.py +275 -0
- scitex/audio/engines/elevenlabs_engine.py +143 -0
- scitex/audio/engines/gtts_engine.py +162 -0
- scitex/audio/engines/pyttsx3_engine.py +131 -0
- scitex/audio/mcp_server.py +757 -0
- scitex/bridge/_helpers.py +1 -1
- scitex/bridge/_plt_vis.py +1 -1
- scitex/bridge/_stats_vis.py +1 -1
- scitex/dev/plt/__init__.py +272 -0
- scitex/dev/plt/plot_mpl_axhline.py +28 -0
- scitex/dev/plt/plot_mpl_axhspan.py +28 -0
- scitex/dev/plt/plot_mpl_axvline.py +28 -0
- scitex/dev/plt/plot_mpl_axvspan.py +28 -0
- scitex/dev/plt/plot_mpl_bar.py +29 -0
- scitex/dev/plt/plot_mpl_barh.py +29 -0
- scitex/dev/plt/plot_mpl_boxplot.py +28 -0
- scitex/dev/plt/plot_mpl_contour.py +31 -0
- scitex/dev/plt/plot_mpl_contourf.py +31 -0
- scitex/dev/plt/plot_mpl_errorbar.py +30 -0
- scitex/dev/plt/plot_mpl_eventplot.py +28 -0
- scitex/dev/plt/plot_mpl_fill.py +30 -0
- scitex/dev/plt/plot_mpl_fill_between.py +31 -0
- scitex/dev/plt/plot_mpl_hexbin.py +28 -0
- scitex/dev/plt/plot_mpl_hist.py +28 -0
- scitex/dev/plt/plot_mpl_hist2d.py +28 -0
- scitex/dev/plt/plot_mpl_imshow.py +29 -0
- scitex/dev/plt/plot_mpl_pcolormesh.py +31 -0
- scitex/dev/plt/plot_mpl_pie.py +29 -0
- scitex/dev/plt/plot_mpl_plot.py +29 -0
- scitex/dev/plt/plot_mpl_quiver.py +31 -0
- scitex/dev/plt/plot_mpl_scatter.py +28 -0
- scitex/dev/plt/plot_mpl_stackplot.py +31 -0
- scitex/dev/plt/plot_mpl_stem.py +29 -0
- scitex/dev/plt/plot_mpl_step.py +29 -0
- scitex/dev/plt/plot_mpl_violinplot.py +28 -0
- scitex/dev/plt/plot_sns_barplot.py +29 -0
- scitex/dev/plt/plot_sns_boxplot.py +29 -0
- scitex/dev/plt/plot_sns_heatmap.py +28 -0
- scitex/dev/plt/plot_sns_histplot.py +29 -0
- scitex/dev/plt/plot_sns_kdeplot.py +29 -0
- scitex/dev/plt/plot_sns_lineplot.py +31 -0
- scitex/dev/plt/plot_sns_scatterplot.py +29 -0
- scitex/dev/plt/plot_sns_stripplot.py +29 -0
- scitex/dev/plt/plot_sns_swarmplot.py +29 -0
- scitex/dev/plt/plot_sns_violinplot.py +29 -0
- scitex/dev/plt/plot_stx_bar.py +29 -0
- scitex/dev/plt/plot_stx_barh.py +29 -0
- scitex/dev/plt/plot_stx_box.py +28 -0
- scitex/dev/plt/plot_stx_boxplot.py +28 -0
- scitex/dev/plt/plot_stx_conf_mat.py +28 -0
- scitex/dev/plt/plot_stx_contour.py +31 -0
- scitex/dev/plt/plot_stx_ecdf.py +28 -0
- scitex/dev/plt/plot_stx_errorbar.py +30 -0
- scitex/dev/plt/plot_stx_fill_between.py +31 -0
- scitex/dev/plt/plot_stx_fillv.py +28 -0
- scitex/dev/plt/plot_stx_heatmap.py +28 -0
- scitex/dev/plt/plot_stx_image.py +28 -0
- scitex/dev/plt/plot_stx_imshow.py +28 -0
- scitex/dev/plt/plot_stx_joyplot.py +28 -0
- scitex/dev/plt/plot_stx_kde.py +28 -0
- scitex/dev/plt/plot_stx_line.py +28 -0
- scitex/dev/plt/plot_stx_mean_ci.py +28 -0
- scitex/dev/plt/plot_stx_mean_std.py +28 -0
- scitex/dev/plt/plot_stx_median_iqr.py +28 -0
- scitex/dev/plt/plot_stx_raster.py +28 -0
- scitex/dev/plt/plot_stx_rectangle.py +28 -0
- scitex/dev/plt/plot_stx_scatter.py +29 -0
- scitex/dev/plt/plot_stx_shaded_line.py +29 -0
- scitex/dev/plt/plot_stx_violin.py +28 -0
- scitex/dev/plt/plot_stx_violinplot.py +28 -0
- scitex/diagram/README.md +197 -0
- scitex/diagram/__init__.py +48 -0
- scitex/diagram/_compile.py +312 -0
- scitex/diagram/_diagram.py +355 -0
- scitex/diagram/_presets.py +173 -0
- scitex/diagram/_schema.py +182 -0
- scitex/diagram/_split.py +278 -0
- scitex/fig/__init__.py +352 -0
- scitex/{vis → fig}/backend/_parser.py +1 -1
- scitex/{vis → fig}/canvas.py +1 -1
- scitex/{vis → fig}/editor/__init__.py +5 -2
- scitex/{vis → fig}/editor/_dearpygui_editor.py +1 -1
- scitex/{vis → fig}/editor/_defaults.py +70 -5
- scitex/{vis → fig}/editor/_mpl_editor.py +1 -1
- scitex/{vis → fig}/editor/_qt_editor.py +182 -2
- scitex/{vis → fig}/editor/_tkinter_editor.py +1 -1
- scitex/fig/editor/edit/__init__.py +50 -0
- scitex/fig/editor/edit/backend_detector.py +109 -0
- scitex/fig/editor/edit/bundle_resolver.py +240 -0
- scitex/fig/editor/edit/editor_launcher.py +239 -0
- scitex/fig/editor/edit/manual_handler.py +53 -0
- scitex/fig/editor/edit/panel_loader.py +232 -0
- scitex/fig/editor/edit/path_resolver.py +67 -0
- scitex/fig/editor/flask_editor/_bbox.py +1299 -0
- scitex/fig/editor/flask_editor/_core.py +1429 -0
- scitex/{vis → fig}/editor/flask_editor/_plotter.py +38 -4
- scitex/fig/editor/flask_editor/_renderer.py +813 -0
- scitex/fig/editor/flask_editor/static/css/base/reset.css +41 -0
- scitex/fig/editor/flask_editor/static/css/base/typography.css +16 -0
- scitex/fig/editor/flask_editor/static/css/base/variables.css +85 -0
- scitex/fig/editor/flask_editor/static/css/components/buttons.css +217 -0
- scitex/fig/editor/flask_editor/static/css/components/context-menu.css +93 -0
- scitex/fig/editor/flask_editor/static/css/components/dropdown.css +57 -0
- scitex/fig/editor/flask_editor/static/css/components/forms.css +112 -0
- scitex/fig/editor/flask_editor/static/css/components/modal.css +59 -0
- scitex/fig/editor/flask_editor/static/css/components/sections.css +212 -0
- scitex/fig/editor/flask_editor/static/css/features/canvas.css +176 -0
- scitex/fig/editor/flask_editor/static/css/features/element-inspector.css +190 -0
- scitex/fig/editor/flask_editor/static/css/features/loading.css +59 -0
- scitex/fig/editor/flask_editor/static/css/features/overlay.css +45 -0
- scitex/fig/editor/flask_editor/static/css/features/panel-grid.css +95 -0
- scitex/fig/editor/flask_editor/static/css/features/selection.css +101 -0
- scitex/fig/editor/flask_editor/static/css/features/statistics.css +138 -0
- scitex/fig/editor/flask_editor/static/css/index.css +31 -0
- scitex/fig/editor/flask_editor/static/css/layout/container.css +7 -0
- scitex/fig/editor/flask_editor/static/css/layout/controls.css +56 -0
- scitex/fig/editor/flask_editor/static/css/layout/preview.css +78 -0
- scitex/fig/editor/flask_editor/static/js/alignment/axis.js +314 -0
- scitex/fig/editor/flask_editor/static/js/alignment/basic.js +107 -0
- scitex/fig/editor/flask_editor/static/js/alignment/distribute.js +54 -0
- scitex/fig/editor/flask_editor/static/js/canvas/canvas.js +172 -0
- scitex/fig/editor/flask_editor/static/js/canvas/dragging.js +258 -0
- scitex/fig/editor/flask_editor/static/js/canvas/resize.js +48 -0
- scitex/fig/editor/flask_editor/static/js/canvas/selection.js +71 -0
- scitex/fig/editor/flask_editor/static/js/core/api.js +288 -0
- scitex/fig/editor/flask_editor/static/js/core/state.js +143 -0
- scitex/fig/editor/flask_editor/static/js/core/utils.js +245 -0
- scitex/fig/editor/flask_editor/static/js/dev/element-inspector.js +992 -0
- scitex/fig/editor/flask_editor/static/js/editor/bbox.js +339 -0
- scitex/fig/editor/flask_editor/static/js/editor/element-drag.js +286 -0
- scitex/fig/editor/flask_editor/static/js/editor/overlay.js +371 -0
- scitex/fig/editor/flask_editor/static/js/editor/preview.js +293 -0
- scitex/fig/editor/flask_editor/static/js/main.js +426 -0
- scitex/fig/editor/flask_editor/static/js/shortcuts/context-menu.js +152 -0
- scitex/fig/editor/flask_editor/static/js/shortcuts/keyboard.js +265 -0
- scitex/fig/editor/flask_editor/static/js/ui/controls.js +184 -0
- scitex/fig/editor/flask_editor/static/js/ui/download.js +57 -0
- scitex/fig/editor/flask_editor/static/js/ui/help.js +100 -0
- scitex/fig/editor/flask_editor/static/js/ui/theme.js +34 -0
- scitex/fig/editor/flask_editor/templates/__init__.py +123 -0
- scitex/fig/editor/flask_editor/templates/_html.py +852 -0
- scitex/fig/editor/flask_editor/templates/_scripts.py +4933 -0
- scitex/fig/editor/flask_editor/templates/_styles.py +1658 -0
- scitex/{vis → fig}/io/__init__.py +13 -1
- scitex/fig/io/_bundle.py +1058 -0
- scitex/{vis → fig}/io/_canvas.py +1 -1
- scitex/{vis → fig}/io/_data.py +1 -1
- scitex/{vis → fig}/io/_export.py +1 -1
- scitex/{vis → fig}/io/_load.py +1 -1
- scitex/{vis → fig}/io/_panel.py +1 -1
- scitex/{vis → fig}/io/_save.py +1 -1
- scitex/{vis → fig}/model/__init__.py +1 -1
- scitex/{vis → fig}/model/_annotations.py +1 -1
- scitex/{vis → fig}/model/_axes.py +1 -1
- scitex/{vis → fig}/model/_figure.py +1 -1
- scitex/{vis → fig}/model/_guides.py +1 -1
- scitex/{vis → fig}/model/_plot.py +1 -1
- scitex/{vis → fig}/model/_styles.py +1 -1
- scitex/{vis → fig}/utils/__init__.py +1 -1
- scitex/io/__init__.py +22 -26
- scitex/io/_bundle.py +493 -0
- scitex/io/_flush.py +5 -2
- scitex/io/_load.py +98 -0
- scitex/io/_load_modules/_H5Explorer.py +5 -2
- scitex/io/_load_modules/_canvas.py +2 -2
- scitex/io/_load_modules/_image.py +3 -4
- scitex/io/_load_modules/_txt.py +4 -2
- scitex/io/_metadata.py +34 -324
- scitex/io/_metadata_modules/__init__.py +46 -0
- scitex/io/_metadata_modules/_embed.py +70 -0
- scitex/io/_metadata_modules/_read.py +64 -0
- scitex/io/_metadata_modules/_utils.py +79 -0
- scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
- scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
- scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
- scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
- scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
- scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
- scitex/io/_metadata_modules/read_metadata_png.py +39 -0
- scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
- scitex/io/_qr_utils.py +5 -3
- scitex/io/_save.py +548 -30
- scitex/io/_save_modules/_canvas.py +3 -3
- scitex/io/_save_modules/_image.py +5 -9
- scitex/io/_save_modules/_tex.py +7 -4
- scitex/io/_zip_bundle.py +439 -0
- scitex/io/utils/h5_to_zarr.py +11 -9
- scitex/msword/__init__.py +255 -0
- scitex/msword/profiles.py +357 -0
- scitex/msword/reader.py +753 -0
- scitex/msword/utils.py +289 -0
- scitex/msword/writer.py +362 -0
- scitex/plt/__init__.py +5 -2
- scitex/plt/_subplots/_AxesWrapper.py +6 -6
- scitex/plt/_subplots/_AxisWrapper.py +15 -9
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
- scitex/plt/_subplots/_FigWrapper.py +6 -6
- scitex/plt/_subplots/_SubplotsWrapper.py +28 -18
- scitex/plt/_subplots/_export_as_csv.py +35 -5
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +8 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +10 -21
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +18 -7
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +28 -12
- scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +10 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +13 -1
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +12 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +10 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +10 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +18 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +44 -36
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +14 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +11 -5
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +14 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +14 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +16 -6
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +29 -19
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +22 -5
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +18 -14
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +18 -14
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +18 -14
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +10 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +18 -9
- scitex/plt/ax/_plot/_stx_ecdf.py +4 -2
- scitex/plt/gallery/_generate.py +421 -14
- scitex/plt/io/__init__.py +53 -0
- scitex/plt/io/_bundle.py +490 -0
- scitex/plt/io/_layered_bundle.py +1343 -0
- scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
- scitex/plt/styles/__init__.py +14 -0
- scitex/plt/styles/presets.py +78 -0
- scitex/plt/utils/__init__.py +13 -1
- scitex/plt/utils/_collect_figure_metadata.py +10 -14
- scitex/plt/utils/_configure_mpl.py +6 -18
- scitex/plt/utils/_crop.py +32 -14
- scitex/plt/utils/_csv_column_naming.py +54 -0
- scitex/plt/utils/_figure_mm.py +116 -1
- scitex/plt/utils/_hitmap.py +1643 -0
- scitex/plt/utils/metadata/__init__.py +25 -0
- scitex/plt/utils/metadata/_core.py +9 -10
- scitex/plt/utils/metadata/_dimensions.py +6 -3
- scitex/plt/utils/metadata/_editable_export.py +405 -0
- scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
- scitex/schema/__init__.py +109 -16
- scitex/schema/_canvas.py +1 -1
- scitex/schema/_plot.py +1015 -0
- scitex/schema/_stats.py +2 -2
- scitex/stats/__init__.py +117 -0
- scitex/stats/io/__init__.py +29 -0
- scitex/stats/io/_bundle.py +156 -0
- scitex/tex/__init__.py +4 -0
- scitex/tex/_export.py +890 -0
- {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/METADATA +11 -1
- {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/RECORD +294 -170
- scitex/io/memo.md +0 -2827
- scitex/plt/REQUESTS.md +0 -191
- scitex/plt/_subplots/TODO.md +0 -53
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -559
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1609
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -447
- scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_between.json +0 -110
- scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_betweenx.json +0 -88
- scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fill_between.json +0 -103
- scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fillv.json +0 -106
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/bar.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/barh.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/boxplot.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_bar.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_barh.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_box.json +0 -83
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_boxplot.json +0 -93
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violin.json +0 -91
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violinplot.json +0 -91
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/violinplot.json +0 -91
- scitex/plt/templates/research-master/scitex/vis/gallery/contour/contour.json +0 -97
- scitex/plt/templates/research-master/scitex/vis/gallery/contour/contourf.json +0 -98
- scitex/plt/templates/research-master/scitex/vis/gallery/contour/stx_contour.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist.json +0 -101
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist2d.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_ecdf.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_joyplot.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_kde.json +0 -93
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/imshow.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/matshow.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_conf_mat.json +0 -83
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_heatmap.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_image.json +0 -121
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_imshow.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/line/plot.json +0 -110
- scitex/plt/templates/research-master/scitex/vis/gallery/line/step.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_line.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_shaded_line.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/hexbin.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/scatter.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stem.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stx_scatter.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/special/pie.json +0 -94
- scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_raster.json +0 -109
- scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_rectangle.json +0 -108
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/errorbar.json +0 -93
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_errorbar.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_ci.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_std.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_median_iqr.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/vector/quiver.json +0 -99
- scitex/plt/templates/research-master/scitex/vis/gallery/vector/streamplot.json +0 -100
- scitex/vis/__init__.py +0 -177
- scitex/vis/editor/_edit.py +0 -390
- scitex/vis/editor/flask_editor/_bbox.py +0 -529
- scitex/vis/editor/flask_editor/_core.py +0 -168
- scitex/vis/editor/flask_editor/_renderer.py +0 -393
- scitex/vis/editor/flask_editor/templates/__init__.py +0 -33
- scitex/vis/editor/flask_editor/templates/_html.py +0 -513
- scitex/vis/editor/flask_editor/templates/_scripts.py +0 -1261
- scitex/vis/editor/flask_editor/templates/_styles.py +0 -739
- /scitex/{vis → fig}/README.md +0 -0
- /scitex/{vis → fig}/backend/__init__.py +0 -0
- /scitex/{vis → fig}/backend/_export.py +0 -0
- /scitex/{vis → fig}/backend/_render.py +0 -0
- /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
- /scitex/{vis → fig}/editor/_flask_editor.py +0 -0
- /scitex/{vis → fig}/editor/flask_editor/__init__.py +0 -0
- /scitex/{vis → fig}/editor/flask_editor/_utils.py +0 -0
- /scitex/{vis → fig}/io/_directory.py +0 -0
- /scitex/{vis → fig}/model/_plot_types.py +0 -0
- /scitex/{vis → fig}/utils/_defaults.py +0 -0
- /scitex/{vis → fig}/utils/_validate.py +0 -0
- {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/WHEEL +0 -0
- {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/entry_points.txt +0 -0
- {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -12,6 +12,9 @@ __DIR__ = os.path.dirname(__FILE__)
|
|
|
12
12
|
import numpy as np
|
|
13
13
|
import pandas as pd
|
|
14
14
|
|
|
15
|
+
from scitex.plt.utils._csv_column_naming import get_csv_column_name
|
|
16
|
+
from ._format_plot import _parse_tracking_id
|
|
17
|
+
|
|
15
18
|
|
|
16
19
|
def _format_sns_jointplot(id, tracked_dict, kwargs):
|
|
17
20
|
"""Format data from a sns_jointplot call."""
|
|
@@ -19,6 +22,9 @@ def _format_sns_jointplot(id, tracked_dict, kwargs):
|
|
|
19
22
|
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
20
23
|
return pd.DataFrame()
|
|
21
24
|
|
|
25
|
+
# Parse tracking ID to extract axes position and trace ID
|
|
26
|
+
ax_row, ax_col, trace_id = _parse_tracking_id(id)
|
|
27
|
+
|
|
22
28
|
# Get the args from tracked_dict
|
|
23
29
|
args = tracked_dict.get("args", [])
|
|
24
30
|
|
|
@@ -37,7 +43,10 @@ def _format_sns_jointplot(id, tracked_dict, kwargs):
|
|
|
37
43
|
y_data = data[y_var]
|
|
38
44
|
|
|
39
45
|
result = pd.DataFrame(
|
|
40
|
-
{
|
|
46
|
+
{
|
|
47
|
+
get_csv_column_name(f"joint_{x_var}", ax_row, ax_col, trace_id=trace_id): x_data,
|
|
48
|
+
get_csv_column_name(f"joint_{y_var}", ax_row, ax_col, trace_id=trace_id): y_data,
|
|
49
|
+
}
|
|
41
50
|
)
|
|
42
51
|
return result
|
|
43
52
|
|
|
@@ -46,7 +55,10 @@ def _format_sns_jointplot(id, tracked_dict, kwargs):
|
|
|
46
55
|
# If no x, y specified, return the whole dataframe
|
|
47
56
|
result = data.copy()
|
|
48
57
|
if id is not None:
|
|
49
|
-
result.columns = [
|
|
58
|
+
result.columns = [
|
|
59
|
+
get_csv_column_name(f"joint_{col}", ax_row, ax_col, trace_id=trace_id)
|
|
60
|
+
for col in result.columns
|
|
61
|
+
]
|
|
50
62
|
return result
|
|
51
63
|
|
|
52
64
|
# Handle numpy arrays directly
|
|
@@ -56,6 +68,9 @@ def _format_sns_jointplot(id, tracked_dict, kwargs):
|
|
|
56
68
|
and isinstance(args[1], (np.ndarray, list))
|
|
57
69
|
):
|
|
58
70
|
x_data, y_data = args[0], args[1]
|
|
59
|
-
return pd.DataFrame({
|
|
71
|
+
return pd.DataFrame({
|
|
72
|
+
get_csv_column_name("joint_x", ax_row, ax_col, trace_id=trace_id): x_data,
|
|
73
|
+
get_csv_column_name("joint_y", ax_row, ax_col, trace_id=trace_id): y_data,
|
|
74
|
+
})
|
|
60
75
|
|
|
61
76
|
return pd.DataFrame()
|
|
@@ -12,45 +12,53 @@ __DIR__ = os.path.dirname(__FILE__)
|
|
|
12
12
|
import numpy as np
|
|
13
13
|
import pandas as pd
|
|
14
14
|
|
|
15
|
+
from scitex.plt.utils._csv_column_naming import get_csv_column_name
|
|
16
|
+
from ._format_plot import _parse_tracking_id
|
|
17
|
+
|
|
15
18
|
|
|
16
19
|
def _format_sns_lineplot(id, tracked_dict, kwargs):
|
|
17
20
|
"""Format data from a sns_lineplot call."""
|
|
18
|
-
#
|
|
19
|
-
if
|
|
21
|
+
# Check if tracked_dict is empty or not a dictionary
|
|
22
|
+
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
23
|
+
return pd.DataFrame()
|
|
24
|
+
|
|
25
|
+
# Parse the tracking ID to get axes position and trace ID
|
|
26
|
+
ax_row, ax_col, trace_id = _parse_tracking_id(id)
|
|
27
|
+
|
|
28
|
+
# Get data from tracked_dict - can be in "data" (from _sns_base_xyhue) or "args"
|
|
29
|
+
data = tracked_dict.get("data")
|
|
30
|
+
args = tracked_dict.get("args", [])
|
|
31
|
+
|
|
32
|
+
# If data is None, try to get it from args
|
|
33
|
+
if data is None and len(args) >= 1:
|
|
20
34
|
data = args[0]
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
# Handle DataFrame input without x, y specified
|
|
50
|
-
elif isinstance(data, pd.DataFrame):
|
|
51
|
-
result = data.copy()
|
|
52
|
-
if id is not None:
|
|
53
|
-
result.columns = [f"{id}_line_{col}" for col in result.columns]
|
|
54
|
-
return result
|
|
35
|
+
|
|
36
|
+
x_var = kwargs.get("x")
|
|
37
|
+
y_var = kwargs.get("y")
|
|
38
|
+
|
|
39
|
+
# Handle DataFrame input with x, y variables
|
|
40
|
+
if isinstance(data, pd.DataFrame):
|
|
41
|
+
# If data has been pre-processed by _sns_prepare_xyhue, it may be pivoted
|
|
42
|
+
# Just export all columns with proper naming
|
|
43
|
+
if data.empty:
|
|
44
|
+
return pd.DataFrame()
|
|
45
|
+
|
|
46
|
+
result = {}
|
|
47
|
+
for col in data.columns:
|
|
48
|
+
col_name = str(col) if not isinstance(col, str) else col
|
|
49
|
+
result[get_csv_column_name(col_name, ax_row, ax_col, trace_id=trace_id)] = data[col].values
|
|
50
|
+
return pd.DataFrame(result)
|
|
51
|
+
|
|
52
|
+
# Handle direct x, y data arrays from args
|
|
53
|
+
elif (
|
|
54
|
+
len(args) > 1
|
|
55
|
+
and isinstance(args[0], (np.ndarray, list))
|
|
56
|
+
and isinstance(args[1], (np.ndarray, list))
|
|
57
|
+
):
|
|
58
|
+
x_data, y_data = args[0], args[1]
|
|
59
|
+
return pd.DataFrame({
|
|
60
|
+
get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id): x_data,
|
|
61
|
+
get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id): y_data
|
|
62
|
+
})
|
|
55
63
|
|
|
56
64
|
return pd.DataFrame()
|
|
@@ -11,6 +11,9 @@ __DIR__ = os.path.dirname(__FILE__)
|
|
|
11
11
|
|
|
12
12
|
import pandas as pd
|
|
13
13
|
|
|
14
|
+
from scitex.plt.utils._csv_column_naming import get_csv_column_name
|
|
15
|
+
from ._format_plot import _parse_tracking_id
|
|
16
|
+
|
|
14
17
|
|
|
15
18
|
def _format_sns_pairplot(id, tracked_dict, kwargs):
|
|
16
19
|
"""Format data from a sns_pairplot call."""
|
|
@@ -18,6 +21,9 @@ def _format_sns_pairplot(id, tracked_dict, kwargs):
|
|
|
18
21
|
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
19
22
|
return pd.DataFrame()
|
|
20
23
|
|
|
24
|
+
# Parse tracking ID to extract axes position and trace ID
|
|
25
|
+
ax_row, ax_col, trace_id = _parse_tracking_id(id)
|
|
26
|
+
|
|
21
27
|
# Get the args from tracked_dict
|
|
22
28
|
args = tracked_dict.get("args", [])
|
|
23
29
|
|
|
@@ -30,14 +36,20 @@ def _format_sns_pairplot(id, tracked_dict, kwargs):
|
|
|
30
36
|
# For pairplot, just return the full DataFrame since it uses all variables
|
|
31
37
|
result = data.copy()
|
|
32
38
|
if id is not None:
|
|
33
|
-
result.columns = [
|
|
39
|
+
result.columns = [
|
|
40
|
+
get_csv_column_name(f"pair_{col}", ax_row, ax_col, trace_id=trace_id)
|
|
41
|
+
for col in result.columns
|
|
42
|
+
]
|
|
34
43
|
|
|
35
44
|
# Add vars or hue columns if specified
|
|
36
45
|
vars_list = kwargs.get("vars")
|
|
37
46
|
if vars_list and all(var in data.columns for var in vars_list):
|
|
38
47
|
# Keep only the specified columns
|
|
39
48
|
result = pd.DataFrame(
|
|
40
|
-
{
|
|
49
|
+
{
|
|
50
|
+
get_csv_column_name(f"pair_{col}", ax_row, ax_col, trace_id=trace_id): data[col]
|
|
51
|
+
for col in vars_list
|
|
52
|
+
}
|
|
41
53
|
)
|
|
42
54
|
|
|
43
55
|
return result
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
-
# Timestamp: "2025-12-
|
|
3
|
+
# Timestamp: "2025-12-13 (ywatanabe)"
|
|
4
4
|
# File: /home/ywatanabe/proj/scitex-code/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py
|
|
5
5
|
|
|
6
6
|
import numpy as np
|
|
7
7
|
import pandas as pd
|
|
8
8
|
|
|
9
|
+
from scitex.plt.utils._csv_column_naming import get_csv_column_name
|
|
10
|
+
from ._format_plot import _parse_tracking_id
|
|
11
|
+
|
|
9
12
|
|
|
10
13
|
def _format_streamplot(id, tracked_dict, kwargs):
|
|
11
14
|
"""Format data from a streamplot call.
|
|
@@ -21,6 +24,9 @@ def _format_streamplot(id, tracked_dict, kwargs):
|
|
|
21
24
|
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
22
25
|
return pd.DataFrame()
|
|
23
26
|
|
|
27
|
+
# Parse the tracking ID to get axes position and trace ID
|
|
28
|
+
ax_row, ax_col, trace_id = _parse_tracking_id(id)
|
|
29
|
+
|
|
24
30
|
if "args" in tracked_dict:
|
|
25
31
|
args = tracked_dict["args"]
|
|
26
32
|
if isinstance(args, tuple) and len(args) >= 4:
|
|
@@ -36,10 +42,10 @@ def _format_streamplot(id, tracked_dict, kwargs):
|
|
|
36
42
|
|
|
37
43
|
df = pd.DataFrame(
|
|
38
44
|
{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id): X.flatten(),
|
|
46
|
+
get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id): Y.flatten(),
|
|
47
|
+
get_csv_column_name("u", ax_row, ax_col, trace_id=trace_id): U.flatten(),
|
|
48
|
+
get_csv_column_name("v", ax_row, ax_col, trace_id=trace_id): V.flatten(),
|
|
43
49
|
}
|
|
44
50
|
)
|
|
45
51
|
return df
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""CSV formatter for stx_bar() calls."""
|
|
4
|
+
|
|
5
|
+
import pandas as pd
|
|
6
|
+
import numpy as np
|
|
7
|
+
from scitex.plt.utils._csv_column_naming import get_csv_column_name
|
|
8
|
+
from ._format_plot import _parse_tracking_id
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _format_stx_bar(id, tracked_dict, kwargs):
|
|
12
|
+
"""Format data from stx_bar call for CSV export.
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
id : str
|
|
17
|
+
Tracking identifier
|
|
18
|
+
tracked_dict : dict
|
|
19
|
+
Dictionary containing tracked data with 'bar_df' key
|
|
20
|
+
kwargs : dict
|
|
21
|
+
Additional keyword arguments (may contain yerr)
|
|
22
|
+
|
|
23
|
+
Returns
|
|
24
|
+
-------
|
|
25
|
+
pd.DataFrame
|
|
26
|
+
Formatted bar data with standardized column names
|
|
27
|
+
"""
|
|
28
|
+
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
29
|
+
return pd.DataFrame()
|
|
30
|
+
|
|
31
|
+
ax_row, ax_col, trace_id = _parse_tracking_id(id)
|
|
32
|
+
|
|
33
|
+
# Get bar_df from tracked data
|
|
34
|
+
bar_df = tracked_dict.get("bar_df")
|
|
35
|
+
if bar_df is not None and isinstance(bar_df, pd.DataFrame):
|
|
36
|
+
result = bar_df.copy()
|
|
37
|
+
renamed = {}
|
|
38
|
+
# Map 'x' and 'height' to standardized column names
|
|
39
|
+
for col in result.columns:
|
|
40
|
+
if col == "x":
|
|
41
|
+
renamed[col] = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
|
|
42
|
+
elif col == "height":
|
|
43
|
+
renamed[col] = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
|
|
44
|
+
else:
|
|
45
|
+
renamed[col] = get_csv_column_name(col, ax_row, ax_col, trace_id=trace_id)
|
|
46
|
+
|
|
47
|
+
result = result.rename(columns=renamed)
|
|
48
|
+
|
|
49
|
+
# Add yerr if present in kwargs
|
|
50
|
+
yerr = kwargs.get("yerr") if kwargs else None
|
|
51
|
+
if yerr is not None:
|
|
52
|
+
try:
|
|
53
|
+
yerr_array = np.asarray(yerr)
|
|
54
|
+
if len(yerr_array) == len(result):
|
|
55
|
+
col_yerr = get_csv_column_name("yerr", ax_row, ax_col, trace_id=trace_id)
|
|
56
|
+
result[col_yerr] = yerr_array
|
|
57
|
+
except (TypeError, ValueError):
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
return result
|
|
61
|
+
|
|
62
|
+
# Fallback to args if bar_df not found
|
|
63
|
+
args = tracked_dict.get("args", [])
|
|
64
|
+
if len(args) >= 2:
|
|
65
|
+
col_x = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
|
|
66
|
+
col_y = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
|
|
67
|
+
data = {col_x: args[0], col_y: args[1]}
|
|
68
|
+
|
|
69
|
+
# Add yerr if present
|
|
70
|
+
yerr = kwargs.get("yerr") if kwargs else None
|
|
71
|
+
if yerr is not None:
|
|
72
|
+
try:
|
|
73
|
+
yerr_array = np.asarray(yerr)
|
|
74
|
+
col_yerr = get_csv_column_name("yerr", ax_row, ax_col, trace_id=trace_id)
|
|
75
|
+
data[col_yerr] = yerr_array
|
|
76
|
+
except (TypeError, ValueError):
|
|
77
|
+
pass
|
|
78
|
+
|
|
79
|
+
return pd.DataFrame(data)
|
|
80
|
+
|
|
81
|
+
return pd.DataFrame()
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# EOF
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""CSV formatter for stx_barh() calls."""
|
|
4
|
+
|
|
5
|
+
import pandas as pd
|
|
6
|
+
import numpy as np
|
|
7
|
+
from scitex.plt.utils._csv_column_naming import get_csv_column_name
|
|
8
|
+
from ._format_plot import _parse_tracking_id
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _format_stx_barh(id, tracked_dict, kwargs):
|
|
12
|
+
"""Format data from stx_barh call for CSV export.
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
id : str
|
|
17
|
+
Tracking identifier
|
|
18
|
+
tracked_dict : dict
|
|
19
|
+
Dictionary containing tracked data with 'barh_df' key
|
|
20
|
+
kwargs : dict
|
|
21
|
+
Additional keyword arguments (may contain xerr)
|
|
22
|
+
|
|
23
|
+
Returns
|
|
24
|
+
-------
|
|
25
|
+
pd.DataFrame
|
|
26
|
+
Formatted barh data with standardized column names
|
|
27
|
+
"""
|
|
28
|
+
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
29
|
+
return pd.DataFrame()
|
|
30
|
+
|
|
31
|
+
ax_row, ax_col, trace_id = _parse_tracking_id(id)
|
|
32
|
+
|
|
33
|
+
# Get barh_df from tracked data
|
|
34
|
+
barh_df = tracked_dict.get("barh_df")
|
|
35
|
+
if barh_df is not None and isinstance(barh_df, pd.DataFrame):
|
|
36
|
+
result = barh_df.copy()
|
|
37
|
+
renamed = {}
|
|
38
|
+
# Map 'y' and 'width' to standardized column names
|
|
39
|
+
for col in result.columns:
|
|
40
|
+
if col == "y":
|
|
41
|
+
renamed[col] = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
|
|
42
|
+
elif col == "width":
|
|
43
|
+
renamed[col] = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
|
|
44
|
+
else:
|
|
45
|
+
renamed[col] = get_csv_column_name(col, ax_row, ax_col, trace_id=trace_id)
|
|
46
|
+
|
|
47
|
+
result = result.rename(columns=renamed)
|
|
48
|
+
|
|
49
|
+
# Add xerr if present in kwargs
|
|
50
|
+
xerr = kwargs.get("xerr") if kwargs else None
|
|
51
|
+
if xerr is not None:
|
|
52
|
+
try:
|
|
53
|
+
xerr_array = np.asarray(xerr)
|
|
54
|
+
if len(xerr_array) == len(result):
|
|
55
|
+
col_xerr = get_csv_column_name("xerr", ax_row, ax_col, trace_id=trace_id)
|
|
56
|
+
result[col_xerr] = xerr_array
|
|
57
|
+
except (TypeError, ValueError):
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
return result
|
|
61
|
+
|
|
62
|
+
# Fallback to args if barh_df not found
|
|
63
|
+
args = tracked_dict.get("args", [])
|
|
64
|
+
if len(args) >= 2:
|
|
65
|
+
# Note: in barh, first arg is y positions, second is widths (x values)
|
|
66
|
+
col_y = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
|
|
67
|
+
col_x = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
|
|
68
|
+
data = {col_y: args[0], col_x: args[1]}
|
|
69
|
+
|
|
70
|
+
# Add xerr if present
|
|
71
|
+
xerr = kwargs.get("xerr") if kwargs else None
|
|
72
|
+
if xerr is not None:
|
|
73
|
+
try:
|
|
74
|
+
xerr_array = np.asarray(xerr)
|
|
75
|
+
col_xerr = get_csv_column_name("xerr", ax_row, ax_col, trace_id=trace_id)
|
|
76
|
+
data[col_xerr] = xerr_array
|
|
77
|
+
except (TypeError, ValueError):
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
return pd.DataFrame(data)
|
|
81
|
+
|
|
82
|
+
return pd.DataFrame()
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
# EOF
|
|
@@ -11,6 +11,8 @@ __DIR__ = os.path.dirname(__FILE__)
|
|
|
11
11
|
|
|
12
12
|
import numpy as np
|
|
13
13
|
import pandas as pd
|
|
14
|
+
from scitex.plt.utils._csv_column_naming import get_csv_column_name
|
|
15
|
+
from ._format_plot import _parse_tracking_id
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
def _format_plot_conf_mat(id, tracked_dict, kwargs):
|
|
@@ -28,6 +30,9 @@ def _format_plot_conf_mat(id, tracked_dict, kwargs):
|
|
|
28
30
|
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
29
31
|
return pd.DataFrame()
|
|
30
32
|
|
|
33
|
+
# Parse tracking ID to get axes position and trace ID
|
|
34
|
+
ax_row, ax_col, trace_id = _parse_tracking_id(id)
|
|
35
|
+
|
|
31
36
|
# Get the args from tracked_dict
|
|
32
37
|
args = tracked_dict.get("args", [])
|
|
33
38
|
|
|
@@ -48,8 +53,11 @@ def _format_plot_conf_mat(id, tracked_dict, kwargs):
|
|
|
48
53
|
# Reset index to make it a regular column
|
|
49
54
|
df = df.reset_index().rename(columns={"index": "True_Class"})
|
|
50
55
|
|
|
51
|
-
# Add prefix to all columns
|
|
52
|
-
df.columns = [
|
|
56
|
+
# Add prefix to all columns using single source of truth
|
|
57
|
+
df.columns = [
|
|
58
|
+
get_csv_column_name(f"conf-mat-{col}", ax_row, ax_col, trace_id=trace_id)
|
|
59
|
+
for col in df.columns
|
|
60
|
+
]
|
|
53
61
|
|
|
54
62
|
return df
|
|
55
63
|
|
|
@@ -58,7 +66,10 @@ def _format_plot_conf_mat(id, tracked_dict, kwargs):
|
|
|
58
66
|
|
|
59
67
|
# Create DataFrame with the balanced accuracy
|
|
60
68
|
if bacc is not None:
|
|
61
|
-
|
|
69
|
+
col_name = get_csv_column_name(
|
|
70
|
+
"conf-mat-balanced-accuracy", ax_row, ax_col, trace_id=trace_id
|
|
71
|
+
)
|
|
72
|
+
df = pd.DataFrame({col_name: [bacc]})
|
|
62
73
|
return df
|
|
63
74
|
|
|
64
75
|
return pd.DataFrame()
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""CSV formatter for stx_contour() calls."""
|
|
4
|
+
|
|
5
|
+
import pandas as pd
|
|
6
|
+
from scitex.plt.utils._csv_column_naming import get_csv_column_name
|
|
7
|
+
from ._format_plot import _parse_tracking_id
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _format_stx_contour(id, tracked_dict, kwargs):
|
|
11
|
+
"""Format data from stx_contour call for CSV export.
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
----------
|
|
15
|
+
id : str
|
|
16
|
+
Identifier for the plot
|
|
17
|
+
tracked_dict : dict
|
|
18
|
+
Dictionary containing tracked data with 'contour_df'
|
|
19
|
+
kwargs : dict
|
|
20
|
+
Keyword arguments passed to stx_contour
|
|
21
|
+
|
|
22
|
+
Returns
|
|
23
|
+
-------
|
|
24
|
+
pd.DataFrame
|
|
25
|
+
Formatted contour data with X, Y, Z columns
|
|
26
|
+
"""
|
|
27
|
+
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
28
|
+
return pd.DataFrame()
|
|
29
|
+
|
|
30
|
+
ax_row, ax_col, trace_id = _parse_tracking_id(id)
|
|
31
|
+
|
|
32
|
+
# Get contour_df from tracked_dict
|
|
33
|
+
contour_df = tracked_dict.get("contour_df")
|
|
34
|
+
if contour_df is not None and isinstance(contour_df, pd.DataFrame):
|
|
35
|
+
result = contour_df.copy()
|
|
36
|
+
|
|
37
|
+
# Rename columns using single source of truth
|
|
38
|
+
renamed = {}
|
|
39
|
+
for col in result.columns:
|
|
40
|
+
if col == "X":
|
|
41
|
+
renamed[col] = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
|
|
42
|
+
elif col == "Y":
|
|
43
|
+
renamed[col] = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
|
|
44
|
+
elif col == "Z":
|
|
45
|
+
renamed[col] = get_csv_column_name("z", ax_row, ax_col, trace_id=trace_id)
|
|
46
|
+
else:
|
|
47
|
+
renamed[col] = get_csv_column_name(col.lower(), ax_row, ax_col, trace_id=trace_id)
|
|
48
|
+
|
|
49
|
+
return result.rename(columns=renamed)
|
|
50
|
+
|
|
51
|
+
return pd.DataFrame()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# EOF
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
import os
|
|
7
7
|
import pandas as pd
|
|
8
8
|
|
|
9
|
+
from scitex.plt.utils._csv_column_naming import get_csv_column_name
|
|
10
|
+
from ._format_plot import _parse_tracking_id
|
|
11
|
+
|
|
9
12
|
__FILE__ = __file__
|
|
10
13
|
__DIR__ = os.path.dirname(__FILE__)
|
|
11
14
|
# ----------------------------------------
|
|
@@ -37,7 +40,16 @@ def _format_plot_ecdf(id, tracked_dict, kwargs):
|
|
|
37
40
|
|
|
38
41
|
# Add prefix to column names if ID is provided
|
|
39
42
|
if id is not None:
|
|
40
|
-
#
|
|
41
|
-
|
|
43
|
+
# Parse the tracking ID to get axes position and trace ID
|
|
44
|
+
ax_row, ax_col, trace_id = _parse_tracking_id(id)
|
|
45
|
+
|
|
46
|
+
# Rename columns using single source of truth
|
|
47
|
+
renamed = {}
|
|
48
|
+
for col in result.columns:
|
|
49
|
+
# Use the original column name as the variable (e.g., "ecdf_value", "ecdf_prob")
|
|
50
|
+
renamed[col] = get_csv_column_name(
|
|
51
|
+
f"ecdf_{col}", ax_row, ax_col, trace_id=trace_id
|
|
52
|
+
)
|
|
53
|
+
result = result.rename(columns=renamed)
|
|
42
54
|
|
|
43
55
|
return result
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""CSV formatter for stx_errorbar() calls."""
|
|
4
|
+
|
|
5
|
+
import pandas as pd
|
|
6
|
+
import numpy as np
|
|
7
|
+
from scitex.plt.utils._csv_column_naming import get_csv_column_name
|
|
8
|
+
from ._format_plot import _parse_tracking_id
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _format_stx_errorbar(id, tracked_dict, kwargs):
|
|
12
|
+
"""Format data from stx_errorbar call for CSV export.
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
id : str
|
|
17
|
+
Tracking identifier
|
|
18
|
+
tracked_dict : dict
|
|
19
|
+
Dictionary containing tracked data with 'errorbar_df' key
|
|
20
|
+
kwargs : dict
|
|
21
|
+
Additional keyword arguments (may contain yerr, xerr)
|
|
22
|
+
|
|
23
|
+
Returns
|
|
24
|
+
-------
|
|
25
|
+
pd.DataFrame
|
|
26
|
+
Formatted errorbar data with standardized column names
|
|
27
|
+
"""
|
|
28
|
+
if not tracked_dict or not isinstance(tracked_dict, dict):
|
|
29
|
+
return pd.DataFrame()
|
|
30
|
+
|
|
31
|
+
ax_row, ax_col, trace_id = _parse_tracking_id(id)
|
|
32
|
+
|
|
33
|
+
# Get errorbar_df from tracked data
|
|
34
|
+
errorbar_df = tracked_dict.get("errorbar_df")
|
|
35
|
+
if errorbar_df is not None and isinstance(errorbar_df, pd.DataFrame):
|
|
36
|
+
result = errorbar_df.copy()
|
|
37
|
+
renamed = {}
|
|
38
|
+
|
|
39
|
+
# Map columns to standardized names
|
|
40
|
+
for col in result.columns:
|
|
41
|
+
if col == "x":
|
|
42
|
+
renamed[col] = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
|
|
43
|
+
elif col == "y":
|
|
44
|
+
renamed[col] = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
|
|
45
|
+
elif col == "yerr":
|
|
46
|
+
# Check if yerr is asymmetric (tuple/list of 2)
|
|
47
|
+
yerr_value = result[col].iloc[0] if len(result) > 0 else None
|
|
48
|
+
if isinstance(yerr_value, (list, tuple)) and len(yerr_value) == 2:
|
|
49
|
+
# Handle asymmetric yerr separately below
|
|
50
|
+
continue
|
|
51
|
+
else:
|
|
52
|
+
renamed[col] = get_csv_column_name("yerr", ax_row, ax_col, trace_id=trace_id)
|
|
53
|
+
elif col == "xerr":
|
|
54
|
+
# Check if xerr is asymmetric (tuple/list of 2)
|
|
55
|
+
xerr_value = result[col].iloc[0] if len(result) > 0 else None
|
|
56
|
+
if isinstance(xerr_value, (list, tuple)) and len(xerr_value) == 2:
|
|
57
|
+
# Handle asymmetric xerr separately below
|
|
58
|
+
continue
|
|
59
|
+
else:
|
|
60
|
+
renamed[col] = get_csv_column_name("xerr", ax_row, ax_col, trace_id=trace_id)
|
|
61
|
+
else:
|
|
62
|
+
renamed[col] = get_csv_column_name(col, ax_row, ax_col, trace_id=trace_id)
|
|
63
|
+
|
|
64
|
+
result = result.rename(columns=renamed)
|
|
65
|
+
|
|
66
|
+
# Handle asymmetric error bars if needed from kwargs
|
|
67
|
+
yerr = kwargs.get("yerr") if kwargs else None
|
|
68
|
+
xerr = kwargs.get("xerr") if kwargs else None
|
|
69
|
+
|
|
70
|
+
if yerr is not None and isinstance(yerr, (list, tuple)) and len(yerr) == 2:
|
|
71
|
+
col_yerr_neg = get_csv_column_name("yerr-neg", ax_row, ax_col, trace_id=trace_id)
|
|
72
|
+
col_yerr_pos = get_csv_column_name("yerr-pos", ax_row, ax_col, trace_id=trace_id)
|
|
73
|
+
result[col_yerr_neg] = yerr[0]
|
|
74
|
+
result[col_yerr_pos] = yerr[1]
|
|
75
|
+
|
|
76
|
+
if xerr is not None and isinstance(xerr, (list, tuple)) and len(xerr) == 2:
|
|
77
|
+
col_xerr_neg = get_csv_column_name("xerr-neg", ax_row, ax_col, trace_id=trace_id)
|
|
78
|
+
col_xerr_pos = get_csv_column_name("xerr-pos", ax_row, ax_col, trace_id=trace_id)
|
|
79
|
+
result[col_xerr_neg] = xerr[0]
|
|
80
|
+
result[col_xerr_pos] = xerr[1]
|
|
81
|
+
|
|
82
|
+
return result
|
|
83
|
+
|
|
84
|
+
# Fallback to args if errorbar_df not found
|
|
85
|
+
args = tracked_dict.get("args", [])
|
|
86
|
+
if len(args) >= 2:
|
|
87
|
+
col_x = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
|
|
88
|
+
col_y = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
|
|
89
|
+
data = {col_x: args[0], col_y: args[1]}
|
|
90
|
+
|
|
91
|
+
# Add error bars if present
|
|
92
|
+
yerr = kwargs.get("yerr") if kwargs else None
|
|
93
|
+
xerr = kwargs.get("xerr") if kwargs else None
|
|
94
|
+
|
|
95
|
+
if yerr is not None:
|
|
96
|
+
if isinstance(yerr, (list, tuple)) and len(yerr) == 2:
|
|
97
|
+
col_yerr_neg = get_csv_column_name("yerr-neg", ax_row, ax_col, trace_id=trace_id)
|
|
98
|
+
col_yerr_pos = get_csv_column_name("yerr-pos", ax_row, ax_col, trace_id=trace_id)
|
|
99
|
+
data[col_yerr_neg] = yerr[0]
|
|
100
|
+
data[col_yerr_pos] = yerr[1]
|
|
101
|
+
else:
|
|
102
|
+
col_yerr = get_csv_column_name("yerr", ax_row, ax_col, trace_id=trace_id)
|
|
103
|
+
data[col_yerr] = yerr
|
|
104
|
+
|
|
105
|
+
if xerr is not None:
|
|
106
|
+
if isinstance(xerr, (list, tuple)) and len(xerr) == 2:
|
|
107
|
+
col_xerr_neg = get_csv_column_name("xerr-neg", ax_row, ax_col, trace_id=trace_id)
|
|
108
|
+
col_xerr_pos = get_csv_column_name("xerr-pos", ax_row, ax_col, trace_id=trace_id)
|
|
109
|
+
data[col_xerr_neg] = xerr[0]
|
|
110
|
+
data[col_xerr_pos] = xerr[1]
|
|
111
|
+
else:
|
|
112
|
+
col_xerr = get_csv_column_name("xerr", ax_row, ax_col, trace_id=trace_id)
|
|
113
|
+
data[col_xerr] = xerr
|
|
114
|
+
|
|
115
|
+
return pd.DataFrame(data)
|
|
116
|
+
|
|
117
|
+
return pd.DataFrame()
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# EOF
|