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
scitex/fig/__init__.py
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: 2025-12-08
|
|
4
|
+
# File: ./src/scitex/vis/__init__.py
|
|
5
|
+
"""
|
|
6
|
+
SciTeX Visualization Module (scitex.fig)
|
|
7
|
+
|
|
8
|
+
Canvas-based composition of publication-quality figures.
|
|
9
|
+
|
|
10
|
+
Terminology:
|
|
11
|
+
- Canvas: A paper figure workspace (e.g., "Figure 1" in publication)
|
|
12
|
+
- Panel: A single component on canvas (stx.plt output or image)
|
|
13
|
+
- Figure: Reserved for matplotlib's fig object (see scitex.plt)
|
|
14
|
+
|
|
15
|
+
Quick Start:
|
|
16
|
+
-----------
|
|
17
|
+
>>> import scitex as stx
|
|
18
|
+
>>>
|
|
19
|
+
>>> # Create canvas and add panels
|
|
20
|
+
>>> stx.vis.create_canvas("/output", "fig1")
|
|
21
|
+
>>> stx.vis.add_panel("/output", "fig1", "panel_a", source="plot.png",
|
|
22
|
+
... position=(10, 10), size=(80, 60), label="A")
|
|
23
|
+
>>>
|
|
24
|
+
>>> # Save with stx.io (auto-exports PNG/PDF/SVG)
|
|
25
|
+
>>> canvas = stx.io.load("/output/fig1.canvas")
|
|
26
|
+
>>> stx.io.save(canvas, "/output/fig1_copy.canvas")
|
|
27
|
+
|
|
28
|
+
Directory Structure:
|
|
29
|
+
-------------------
|
|
30
|
+
{parent_dir}/{canvas_name}.canvas/
|
|
31
|
+
├── canvas.json # Layout, panels, composition
|
|
32
|
+
├── panels/ # Panel directories
|
|
33
|
+
└── exports/ # canvas.png, canvas.pdf, canvas.svg
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
# Submodules for advanced use
|
|
37
|
+
from . import io
|
|
38
|
+
from . import model
|
|
39
|
+
from . import backend
|
|
40
|
+
from . import utils
|
|
41
|
+
from . import editor
|
|
42
|
+
|
|
43
|
+
# Canvas class
|
|
44
|
+
from .canvas import Canvas
|
|
45
|
+
|
|
46
|
+
# =============================================================================
|
|
47
|
+
# Primary API (minimal, reusable, flexible)
|
|
48
|
+
# =============================================================================
|
|
49
|
+
|
|
50
|
+
# Canvas operations
|
|
51
|
+
from .io import (
|
|
52
|
+
ensure_canvas_directory as create_canvas,
|
|
53
|
+
get_canvas_directory_path as get_canvas_path,
|
|
54
|
+
canvas_directory_exists as canvas_exists,
|
|
55
|
+
list_canvas_directories as list_canvases,
|
|
56
|
+
delete_canvas_directory as delete_canvas,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# Panel operations
|
|
60
|
+
from .io import (
|
|
61
|
+
add_panel_from_scitex,
|
|
62
|
+
add_panel_from_image,
|
|
63
|
+
update_panel,
|
|
64
|
+
remove_panel,
|
|
65
|
+
list_panels,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# Export (usually handled by stx.io.save, but available for explicit use)
|
|
69
|
+
from .io import export_canvas_to_file as export_canvas
|
|
70
|
+
|
|
71
|
+
# Data integrity
|
|
72
|
+
from .io import verify_all_data_hashes as verify_data
|
|
73
|
+
|
|
74
|
+
# Editor
|
|
75
|
+
from .editor import edit
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# =============================================================================
|
|
79
|
+
# Convenience wrapper for add_panel
|
|
80
|
+
# =============================================================================
|
|
81
|
+
def add_panel(
|
|
82
|
+
parent_dir,
|
|
83
|
+
canvas_name,
|
|
84
|
+
panel_name,
|
|
85
|
+
source,
|
|
86
|
+
position=(0, 0),
|
|
87
|
+
size=(50, 50),
|
|
88
|
+
label="",
|
|
89
|
+
bundle=False,
|
|
90
|
+
**kwargs,
|
|
91
|
+
):
|
|
92
|
+
"""
|
|
93
|
+
Add a panel to canvas (auto-detects scitex vs image type).
|
|
94
|
+
|
|
95
|
+
Parameters
|
|
96
|
+
----------
|
|
97
|
+
parent_dir : str or Path
|
|
98
|
+
Parent directory containing canvas
|
|
99
|
+
canvas_name : str
|
|
100
|
+
Canvas name
|
|
101
|
+
panel_name : str
|
|
102
|
+
Name for the panel
|
|
103
|
+
source : str or Path
|
|
104
|
+
Source file (PNG, JPG, SVG)
|
|
105
|
+
position : tuple
|
|
106
|
+
(x_mm, y_mm) position on canvas
|
|
107
|
+
size : tuple
|
|
108
|
+
(width_mm, height_mm) panel size
|
|
109
|
+
label : str
|
|
110
|
+
Panel label (A, B, C...)
|
|
111
|
+
bundle : bool
|
|
112
|
+
If True, copy files. If False (default), use symlinks.
|
|
113
|
+
**kwargs
|
|
114
|
+
Additional panel properties (rotation_deg, opacity, flip_h, etc.)
|
|
115
|
+
"""
|
|
116
|
+
from pathlib import Path
|
|
117
|
+
|
|
118
|
+
source = Path(source)
|
|
119
|
+
panel_properties = {
|
|
120
|
+
"position": {"x_mm": position[0], "y_mm": position[1]},
|
|
121
|
+
"size": {"width_mm": size[0], "height_mm": size[1]},
|
|
122
|
+
**kwargs,
|
|
123
|
+
}
|
|
124
|
+
if label:
|
|
125
|
+
panel_properties["label"] = {"text": label, "position": "top-left"}
|
|
126
|
+
|
|
127
|
+
# Check if scitex output (has .json/.csv siblings)
|
|
128
|
+
json_sibling = source.parent / f"{source.stem}.json"
|
|
129
|
+
if json_sibling.exists():
|
|
130
|
+
return add_panel_from_scitex(
|
|
131
|
+
project_dir=parent_dir,
|
|
132
|
+
canvas_name=canvas_name,
|
|
133
|
+
panel_name=panel_name,
|
|
134
|
+
source_png=source,
|
|
135
|
+
panel_properties=panel_properties,
|
|
136
|
+
bundle=bundle,
|
|
137
|
+
)
|
|
138
|
+
else:
|
|
139
|
+
return add_panel_from_image(
|
|
140
|
+
project_dir=parent_dir,
|
|
141
|
+
canvas_name=canvas_name,
|
|
142
|
+
panel_name=panel_name,
|
|
143
|
+
source_image=source,
|
|
144
|
+
panel_properties=panel_properties,
|
|
145
|
+
bundle=bundle,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
# =============================================================================
|
|
150
|
+
# .figz Bundle Support
|
|
151
|
+
# =============================================================================
|
|
152
|
+
|
|
153
|
+
def save_figz(
|
|
154
|
+
panels,
|
|
155
|
+
path,
|
|
156
|
+
spec=None,
|
|
157
|
+
as_zip=None,
|
|
158
|
+
):
|
|
159
|
+
"""
|
|
160
|
+
Save panels as a .figz publication figure bundle.
|
|
161
|
+
|
|
162
|
+
Parameters
|
|
163
|
+
----------
|
|
164
|
+
panels : dict
|
|
165
|
+
Dictionary mapping panel IDs to .pltz bundle paths or data.
|
|
166
|
+
Example: {"A": "timecourse.pltz.d", "B": "barplot.pltz.d"}
|
|
167
|
+
path : str or Path
|
|
168
|
+
Output path (e.g., "Figure1.figz" or "Figure1.figz.d").
|
|
169
|
+
- Path ending with ".figz" creates ZIP archive (default behavior)
|
|
170
|
+
- Path ending with ".figz.d" creates directory bundle
|
|
171
|
+
spec : dict, optional
|
|
172
|
+
Figure specification. Auto-generated if None.
|
|
173
|
+
as_zip : bool, optional
|
|
174
|
+
If True, save as ZIP archive. If False, save as directory.
|
|
175
|
+
Default: auto-detect from path (ZIP for .figz, directory for .figz.d).
|
|
176
|
+
|
|
177
|
+
Returns
|
|
178
|
+
-------
|
|
179
|
+
Path
|
|
180
|
+
Path to saved bundle.
|
|
181
|
+
|
|
182
|
+
Examples
|
|
183
|
+
--------
|
|
184
|
+
>>> import scitex.fig as sfig
|
|
185
|
+
>>> panels = {
|
|
186
|
+
... "A": "timecourse.pltz.d",
|
|
187
|
+
... "B": "barplot.pltz.d"
|
|
188
|
+
... }
|
|
189
|
+
>>> sfig.save_figz(panels, "Figure1.figz") # Creates ZIP
|
|
190
|
+
>>> sfig.save_figz(panels, "Figure1.figz.d") # Creates directory
|
|
191
|
+
"""
|
|
192
|
+
from pathlib import Path
|
|
193
|
+
import shutil
|
|
194
|
+
from scitex.io._bundle import save_bundle, BundleType
|
|
195
|
+
|
|
196
|
+
p = Path(path)
|
|
197
|
+
spath = str(path)
|
|
198
|
+
|
|
199
|
+
# Auto-detect as_zip from path suffix if not specified
|
|
200
|
+
if as_zip is None:
|
|
201
|
+
as_zip = not spath.endswith(".d")
|
|
202
|
+
|
|
203
|
+
# Auto-generate spec if not provided
|
|
204
|
+
if spec is None:
|
|
205
|
+
spec = _generate_figure_spec(panels)
|
|
206
|
+
|
|
207
|
+
# Build bundle data - pass source paths directly for file copying
|
|
208
|
+
bundle_data = {
|
|
209
|
+
'spec': spec,
|
|
210
|
+
'plots': {},
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
# Pass source paths directly (not loaded data) to preserve all files
|
|
214
|
+
for panel_id, pltz_source in panels.items():
|
|
215
|
+
pltz_path = Path(pltz_source)
|
|
216
|
+
if pltz_path.exists():
|
|
217
|
+
# Store source path for direct copying
|
|
218
|
+
bundle_data['plots'][panel_id] = str(pltz_path)
|
|
219
|
+
|
|
220
|
+
return save_bundle(bundle_data, p, bundle_type=BundleType.FIGZ, as_zip=as_zip)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def load_figz(path):
|
|
224
|
+
"""
|
|
225
|
+
Load a .figz bundle.
|
|
226
|
+
|
|
227
|
+
Parameters
|
|
228
|
+
----------
|
|
229
|
+
path : str or Path
|
|
230
|
+
Path to .figz bundle (directory or ZIP).
|
|
231
|
+
|
|
232
|
+
Returns
|
|
233
|
+
-------
|
|
234
|
+
dict
|
|
235
|
+
Figure data with:
|
|
236
|
+
- 'spec': Figure specification
|
|
237
|
+
- 'panels': Dict mapping panel IDs to {'spec': ..., 'data': ...}
|
|
238
|
+
|
|
239
|
+
Examples
|
|
240
|
+
--------
|
|
241
|
+
>>> figure = scitex.fig.load_figz("Figure1.figz.d")
|
|
242
|
+
>>> print(figure['spec']['figure']['title'])
|
|
243
|
+
>>> panel_a = figure['panels']['A']
|
|
244
|
+
>>> print(panel_a['spec'], panel_a['data'])
|
|
245
|
+
"""
|
|
246
|
+
from scitex.io._bundle import load_bundle
|
|
247
|
+
|
|
248
|
+
bundle = load_bundle(path)
|
|
249
|
+
|
|
250
|
+
if bundle['type'] != 'figz':
|
|
251
|
+
raise ValueError(f"Not a .figz bundle: {path}")
|
|
252
|
+
|
|
253
|
+
result = {
|
|
254
|
+
'spec': bundle.get('spec', {}),
|
|
255
|
+
'panels': {},
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
# Return spec and data for each panel (reconstruction is optional)
|
|
259
|
+
for panel_id, plot_bundle in bundle.get('plots', {}).items():
|
|
260
|
+
result['panels'][panel_id] = {
|
|
261
|
+
'spec': plot_bundle.get('spec', {}),
|
|
262
|
+
'data': plot_bundle.get('data'),
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return result
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def _generate_figure_spec(panels):
|
|
269
|
+
"""Generate figure.json spec from panels."""
|
|
270
|
+
from pathlib import Path
|
|
271
|
+
|
|
272
|
+
spec = {
|
|
273
|
+
'schema': {'name': 'scitex.fig.figure', 'version': '1.0.0'},
|
|
274
|
+
'figure': {
|
|
275
|
+
'id': 'figure',
|
|
276
|
+
'title': '',
|
|
277
|
+
'caption': '',
|
|
278
|
+
'styles': {
|
|
279
|
+
'size': {'width_mm': 180, 'height_mm': 120},
|
|
280
|
+
'background': '#ffffff',
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
'panels': [],
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
# Auto-layout panels
|
|
287
|
+
panel_ids = sorted(panels.keys())
|
|
288
|
+
n_panels = len(panel_ids)
|
|
289
|
+
|
|
290
|
+
if n_panels == 0:
|
|
291
|
+
return spec
|
|
292
|
+
|
|
293
|
+
# Simple grid layout
|
|
294
|
+
cols = min(n_panels, 2)
|
|
295
|
+
rows = (n_panels + cols - 1) // cols
|
|
296
|
+
|
|
297
|
+
panel_w = 80
|
|
298
|
+
panel_h = 50
|
|
299
|
+
margin = 5
|
|
300
|
+
|
|
301
|
+
for i, panel_id in enumerate(panel_ids):
|
|
302
|
+
row = i // cols
|
|
303
|
+
col = i % cols
|
|
304
|
+
|
|
305
|
+
x = margin + col * (panel_w + margin)
|
|
306
|
+
y = margin + row * (panel_h + margin)
|
|
307
|
+
|
|
308
|
+
# Note: save_bundle uses panel_id for the directory name (e.g., A.pltz.d)
|
|
309
|
+
spec['panels'].append({
|
|
310
|
+
'id': panel_id,
|
|
311
|
+
'label': panel_id,
|
|
312
|
+
'caption': '',
|
|
313
|
+
'plot': f"{panel_id}.pltz.d",
|
|
314
|
+
'position': {'x_mm': x, 'y_mm': y},
|
|
315
|
+
'size': {'width_mm': panel_w, 'height_mm': panel_h},
|
|
316
|
+
})
|
|
317
|
+
|
|
318
|
+
return spec
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
__all__ = [
|
|
322
|
+
# Canvas class
|
|
323
|
+
"Canvas",
|
|
324
|
+
# Submodules (advanced)
|
|
325
|
+
"io",
|
|
326
|
+
"model",
|
|
327
|
+
"backend",
|
|
328
|
+
"utils",
|
|
329
|
+
"editor",
|
|
330
|
+
# Canvas operations
|
|
331
|
+
"create_canvas",
|
|
332
|
+
"get_canvas_path",
|
|
333
|
+
"canvas_exists",
|
|
334
|
+
"list_canvases",
|
|
335
|
+
"delete_canvas",
|
|
336
|
+
# Panel operations
|
|
337
|
+
"add_panel",
|
|
338
|
+
"update_panel",
|
|
339
|
+
"remove_panel",
|
|
340
|
+
"list_panels",
|
|
341
|
+
# Export
|
|
342
|
+
"export_canvas",
|
|
343
|
+
# Data integrity
|
|
344
|
+
"verify_data",
|
|
345
|
+
# Editor
|
|
346
|
+
"edit",
|
|
347
|
+
# .figz bundle
|
|
348
|
+
"save_figz",
|
|
349
|
+
"load_figz",
|
|
350
|
+
]
|
|
351
|
+
|
|
352
|
+
# EOF
|
|
@@ -161,7 +161,7 @@ def validate_figure_json(fig_json: Dict[str, Any]) -> bool:
|
|
|
161
161
|
|
|
162
162
|
Examples
|
|
163
163
|
--------
|
|
164
|
-
>>> from scitex.
|
|
164
|
+
>>> from scitex.fig.backend import validate_figure_json
|
|
165
165
|
>>> fig_json = {"width_mm": 180, "height_mm": 120, "axes": []}
|
|
166
166
|
>>> validate_figure_json(fig_json)
|
|
167
167
|
True
|
scitex/{vis → fig}/canvas.py
RENAMED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
-
#
|
|
3
|
+
# Timestamp: "2025-12-14 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex-code/src/scitex/fig/editor/__init__.py
|
|
5
|
+
|
|
4
6
|
"""
|
|
5
7
|
SciTeX Visual Editor Module
|
|
6
8
|
|
|
@@ -13,11 +15,12 @@ Supports multiple backends with graceful degradation:
|
|
|
13
15
|
- mpl: Minimal matplotlib (always works)
|
|
14
16
|
"""
|
|
15
17
|
|
|
16
|
-
from .
|
|
18
|
+
from .edit import edit, save_manual_overrides
|
|
17
19
|
|
|
18
20
|
__all__ = [
|
|
19
21
|
"edit",
|
|
20
22
|
"save_manual_overrides",
|
|
21
23
|
]
|
|
22
24
|
|
|
25
|
+
|
|
23
26
|
# EOF
|
|
@@ -1901,7 +1901,7 @@ class DearPyGuiEditor:
|
|
|
1901
1901
|
def _save_manual(self, sender=None, app_data=None, user_data=None):
|
|
1902
1902
|
"""Save current overrides to .manual.json."""
|
|
1903
1903
|
import dearpygui.dearpygui as dpg
|
|
1904
|
-
from .
|
|
1904
|
+
from .edit import save_manual_overrides
|
|
1905
1905
|
|
|
1906
1906
|
try:
|
|
1907
1907
|
self._collect_overrides(dpg)
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
# File: ./src/scitex/vis/editor/_defaults.py
|
|
4
4
|
"""Default style settings for SciTeX visual editor."""
|
|
5
5
|
|
|
6
|
+
from scitex.plt.styles import get_default_dpi, get_preview_dpi
|
|
7
|
+
|
|
6
8
|
|
|
7
9
|
def get_scitex_defaults():
|
|
8
10
|
"""
|
|
@@ -36,7 +38,7 @@ def get_scitex_defaults():
|
|
|
36
38
|
"grid_linewidth": 0.6,
|
|
37
39
|
"grid_alpha": 0.3,
|
|
38
40
|
# Figure settings
|
|
39
|
-
"dpi":
|
|
41
|
+
"dpi": get_default_dpi(), # From SCITEX_STYLE.yaml
|
|
40
42
|
"fig_size": [3.15, 2.68], # Default figure size in inches
|
|
41
43
|
# Colors (SciTeX defaults)
|
|
42
44
|
"facecolor": "#ffffff", # White background
|
|
@@ -126,13 +128,23 @@ def extract_defaults_from_metadata(metadata):
|
|
|
126
128
|
if "n_ticks" in style_mm:
|
|
127
129
|
defaults["n_ticks"] = style_mm["n_ticks"]
|
|
128
130
|
|
|
129
|
-
# Dimensions from metadata
|
|
131
|
+
# Dimensions from metadata (support both old and new formats)
|
|
130
132
|
dimensions = metadata.get("dimensions", {})
|
|
131
133
|
if "dpi" in dimensions:
|
|
132
134
|
defaults["dpi"] = dimensions["dpi"]
|
|
133
135
|
if "figure_size_inch" in dimensions:
|
|
134
136
|
defaults["fig_size"] = dimensions["figure_size_inch"]
|
|
135
137
|
|
|
138
|
+
# New format: size.width_mm, size.height_mm, size.dpi
|
|
139
|
+
size = metadata.get("size", {})
|
|
140
|
+
if "dpi" in size:
|
|
141
|
+
defaults["dpi"] = size["dpi"]
|
|
142
|
+
if "width_mm" in size and "height_mm" in size:
|
|
143
|
+
# Convert mm to inches
|
|
144
|
+
width_inch = size["width_mm"] / 25.4
|
|
145
|
+
height_inch = size["height_mm"] / 25.4
|
|
146
|
+
defaults["fig_size"] = [width_inch, height_inch]
|
|
147
|
+
|
|
136
148
|
# Axis labels from metadata
|
|
137
149
|
if "xlabel" in metadata:
|
|
138
150
|
defaults["xlabel"] = metadata["xlabel"]
|
|
@@ -177,20 +189,73 @@ def extract_defaults_from_metadata(metadata):
|
|
|
177
189
|
defaults["title"] = ax["title"]
|
|
178
190
|
if "grid" in ax:
|
|
179
191
|
defaults["grid"] = ax["grid"]
|
|
192
|
+
# Extract axis limits from list format
|
|
193
|
+
if "xlim" in ax:
|
|
194
|
+
defaults["xlim"] = ax["xlim"]
|
|
195
|
+
if "ylim" in ax:
|
|
196
|
+
defaults["ylim"] = ax["ylim"]
|
|
180
197
|
|
|
181
|
-
# Extract traces information
|
|
198
|
+
# Extract traces information - check multiple possible locations
|
|
182
199
|
traces = metadata.get("traces", [])
|
|
200
|
+
|
|
201
|
+
# Also check axes[].lines (pltz bundle format)
|
|
202
|
+
if not traces and isinstance(axes, list) and len(axes) > 0:
|
|
203
|
+
ax = axes[0]
|
|
204
|
+
lines = ax.get("lines", [])
|
|
205
|
+
if lines:
|
|
206
|
+
traces = lines
|
|
207
|
+
|
|
208
|
+
# Also check hit_regions.color_map for trace info
|
|
209
|
+
if not traces:
|
|
210
|
+
hit_regions = metadata.get("hit_regions", {})
|
|
211
|
+
color_map = hit_regions.get("color_map", {})
|
|
212
|
+
if color_map:
|
|
213
|
+
traces = []
|
|
214
|
+
for trace_id, trace_info in color_map.items():
|
|
215
|
+
traces.append({
|
|
216
|
+
"id": trace_id,
|
|
217
|
+
"label": trace_info.get("label", f"Trace {trace_id}"),
|
|
218
|
+
"type": trace_info.get("type", "line"),
|
|
219
|
+
})
|
|
220
|
+
|
|
183
221
|
if traces:
|
|
184
222
|
defaults["traces"] = traces
|
|
185
223
|
|
|
186
|
-
# Extract legend information
|
|
224
|
+
# Extract legend information from multiple possible locations
|
|
187
225
|
legend = metadata.get("legend", {})
|
|
226
|
+
|
|
227
|
+
# Also check selectable_regions.axes[0].legend (pltz bundle format)
|
|
228
|
+
if not legend:
|
|
229
|
+
selectable = metadata.get("selectable_regions", {})
|
|
230
|
+
sel_axes = selectable.get("axes", [])
|
|
231
|
+
if sel_axes and len(sel_axes) > 0:
|
|
232
|
+
legend = sel_axes[0].get("legend", {})
|
|
233
|
+
|
|
188
234
|
if legend:
|
|
189
235
|
defaults["legend_visible"] = legend.get("visible", True)
|
|
190
236
|
defaults["legend_frameon"] = legend.get("frameon", False)
|
|
191
|
-
|
|
237
|
+
# Support both old format (loc) and new format (location)
|
|
238
|
+
loc = legend.get("location") or legend.get("loc", "best")
|
|
192
239
|
# Convert numeric legend loc to string (matplotlib accepts both but GUI needs string)
|
|
193
240
|
defaults["legend_loc"] = _normalize_legend_loc(loc)
|
|
241
|
+
# Extract fontsize if present
|
|
242
|
+
if "fontsize" in legend:
|
|
243
|
+
defaults["legend_fontsize"] = legend["fontsize"]
|
|
244
|
+
# Extract ncols if present
|
|
245
|
+
if "ncols" in legend:
|
|
246
|
+
defaults["legend_ncols"] = legend["ncols"]
|
|
247
|
+
# Extract title if present
|
|
248
|
+
if "title" in legend:
|
|
249
|
+
defaults["legend_title"] = legend["title"]
|
|
250
|
+
|
|
251
|
+
# Extract legend entries if present
|
|
252
|
+
entries = legend.get("entries", [])
|
|
253
|
+
if entries and not traces:
|
|
254
|
+
# Use legend entries as trace labels
|
|
255
|
+
defaults["traces"] = [
|
|
256
|
+
{"label": e.get("text", f"Trace {i}")}
|
|
257
|
+
for i, e in enumerate(entries)
|
|
258
|
+
]
|
|
194
259
|
|
|
195
260
|
return defaults
|
|
196
261
|
|
|
@@ -228,7 +228,7 @@ class MplEditor:
|
|
|
228
228
|
|
|
229
229
|
def _save(self, event):
|
|
230
230
|
"""Save to .manual.json."""
|
|
231
|
-
from .
|
|
231
|
+
from .edit import save_manual_overrides
|
|
232
232
|
|
|
233
233
|
try:
|
|
234
234
|
manual_path = save_manual_overrides(self.json_path, self.current_overrides)
|