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
|
@@ -1,559 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
# Timestamp: "2025-06-07 15:49:20 (ywatanabe)"
|
|
4
|
-
# File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/.claude-worktree/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py
|
|
5
|
-
# ----------------------------------------
|
|
6
|
-
import os
|
|
7
|
-
|
|
8
|
-
__FILE__ = __file__
|
|
9
|
-
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
-
# ----------------------------------------
|
|
11
|
-
|
|
12
|
-
from typing import List, Optional, Union
|
|
13
|
-
|
|
14
|
-
from ....plt import ax as ax_module
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class AdjustmentMixin:
|
|
18
|
-
"""Mixin class for matplotlib axis adjustments."""
|
|
19
|
-
|
|
20
|
-
def rotate_labels(
|
|
21
|
-
self,
|
|
22
|
-
x: float = None,
|
|
23
|
-
y: float = None,
|
|
24
|
-
x_ha: str = None,
|
|
25
|
-
y_ha: str = None,
|
|
26
|
-
x_va: str = None,
|
|
27
|
-
y_va: str = None,
|
|
28
|
-
auto_adjust: bool = True,
|
|
29
|
-
scientific_convention: bool = True,
|
|
30
|
-
tight_layout: bool = False,
|
|
31
|
-
) -> None:
|
|
32
|
-
"""Rotate x and y axis labels with automatic positioning.
|
|
33
|
-
|
|
34
|
-
Parameters
|
|
35
|
-
----------
|
|
36
|
-
x : float or None, optional
|
|
37
|
-
Rotation angle for x-axis labels in degrees.
|
|
38
|
-
If None or 0, x-axis labels are not rotated. Default is None.
|
|
39
|
-
y : float or None, optional
|
|
40
|
-
Rotation angle for y-axis labels in degrees.
|
|
41
|
-
If None or 0, y-axis labels are not rotated. Default is None.
|
|
42
|
-
x_ha : str or None, optional
|
|
43
|
-
Horizontal alignment for x-axis labels. If None, automatically determined.
|
|
44
|
-
y_ha : str or None, optional
|
|
45
|
-
Horizontal alignment for y-axis labels. If None, automatically determined.
|
|
46
|
-
x_va : str or None, optional
|
|
47
|
-
Vertical alignment for x-axis labels. If None, automatically determined.
|
|
48
|
-
y_va : str or None, optional
|
|
49
|
-
Vertical alignment for y-axis labels. If None, automatically determined.
|
|
50
|
-
auto_adjust : bool, optional
|
|
51
|
-
Whether to automatically adjust alignment. Default is True.
|
|
52
|
-
scientific_convention : bool, optional
|
|
53
|
-
Whether to follow scientific conventions. Default is True.
|
|
54
|
-
tight_layout : bool, optional
|
|
55
|
-
Whether to apply tight_layout to prevent overlapping. Default is False.
|
|
56
|
-
"""
|
|
57
|
-
self._axis_mpl = ax_module.rotate_labels(
|
|
58
|
-
self._axis_mpl,
|
|
59
|
-
x=x,
|
|
60
|
-
y=y,
|
|
61
|
-
x_ha=x_ha,
|
|
62
|
-
y_ha=y_ha,
|
|
63
|
-
x_va=x_va,
|
|
64
|
-
y_va=y_va,
|
|
65
|
-
auto_adjust=auto_adjust,
|
|
66
|
-
scientific_convention=scientific_convention,
|
|
67
|
-
tight_layout=tight_layout,
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
def legend(
|
|
71
|
-
self, *args, loc: str = "best", check_overlap: bool = False, **kwargs
|
|
72
|
-
) -> None:
|
|
73
|
-
"""Places legend at specified location, with support for outside positions.
|
|
74
|
-
|
|
75
|
-
Parameters
|
|
76
|
-
----------
|
|
77
|
-
*args : tuple
|
|
78
|
-
Positional arguments (handles, labels) as in matplotlib
|
|
79
|
-
loc : str
|
|
80
|
-
Legend position. Default is "best" (matplotlib auto-placement).
|
|
81
|
-
Standard matplotlib positions plus:
|
|
82
|
-
- "best": Matplotlib automatic placement (default)
|
|
83
|
-
- "outer": Automatically place legend outside plot area (right side)
|
|
84
|
-
- "separate": Save legend as a separate figure file
|
|
85
|
-
- upper/lower/center variants: e.g. "upper right out", "lower left out"
|
|
86
|
-
- directional shortcuts: "right", "left", "upper", "lower"
|
|
87
|
-
- center variants: "center right out", "center left out"
|
|
88
|
-
- alternative formats: "right upper out", "left lower out" etc.
|
|
89
|
-
check_overlap : bool
|
|
90
|
-
If True, checks for overlap between legend and data after placement.
|
|
91
|
-
Issues warning with suggestion if significant overlap detected.
|
|
92
|
-
**kwargs : dict
|
|
93
|
-
Additional keyword arguments passed to legend()
|
|
94
|
-
For "separate": can include 'filename' (default: 'legend.png')
|
|
95
|
-
"""
|
|
96
|
-
import matplotlib.pyplot as plt
|
|
97
|
-
|
|
98
|
-
# Handle special cases
|
|
99
|
-
if loc == "outer":
|
|
100
|
-
# Place legend outside on the right, adjusting figure to make room
|
|
101
|
-
legend = self._axis_mpl.legend(
|
|
102
|
-
*args, loc="center left", bbox_to_anchor=(1.02, 0.5), **kwargs
|
|
103
|
-
)
|
|
104
|
-
# Adjust figure to prevent legend cutoff
|
|
105
|
-
if hasattr(self, "_figure_wrapper") and self._figure_wrapper:
|
|
106
|
-
self._figure_wrapper._fig_mpl.tight_layout()
|
|
107
|
-
self._figure_wrapper._fig_mpl.subplots_adjust(right=0.85)
|
|
108
|
-
return legend
|
|
109
|
-
|
|
110
|
-
elif loc == "separate":
|
|
111
|
-
# Set flag to save legend separately when figure is saved
|
|
112
|
-
import warnings
|
|
113
|
-
|
|
114
|
-
handles, labels = self._axis_mpl.get_legend_handles_labels()
|
|
115
|
-
if not handles:
|
|
116
|
-
warnings.warn(
|
|
117
|
-
"No legend handles found. Create plots with labels first."
|
|
118
|
-
)
|
|
119
|
-
return None
|
|
120
|
-
|
|
121
|
-
# Store legend params for later use during save
|
|
122
|
-
fig = self._axis_mpl.get_figure()
|
|
123
|
-
if not hasattr(fig, "_separate_legend_params"):
|
|
124
|
-
fig._separate_legend_params = []
|
|
125
|
-
|
|
126
|
-
# Extract separate-specific kwargs
|
|
127
|
-
figsize = kwargs.pop("figsize", (4, 3))
|
|
128
|
-
dpi = kwargs.pop("dpi", 150)
|
|
129
|
-
frameon = kwargs.pop("frameon", True)
|
|
130
|
-
fancybox = kwargs.pop("fancybox", True)
|
|
131
|
-
shadow = kwargs.pop("shadow", True)
|
|
132
|
-
|
|
133
|
-
# Store parameters for this axes
|
|
134
|
-
# Include axis index or name for unique filenames
|
|
135
|
-
axis_id = None
|
|
136
|
-
|
|
137
|
-
# Try to find axis index in parent figure
|
|
138
|
-
try:
|
|
139
|
-
fig_axes = fig.get_axes()
|
|
140
|
-
for idx, ax in enumerate(fig_axes):
|
|
141
|
-
if ax is self._axis_mpl:
|
|
142
|
-
axis_id = f"ax_{idx:02d}"
|
|
143
|
-
break
|
|
144
|
-
except:
|
|
145
|
-
pass
|
|
146
|
-
|
|
147
|
-
# If not found, try subplot spec
|
|
148
|
-
if axis_id is None and hasattr(self._axis_mpl, "get_subplotspec"):
|
|
149
|
-
try:
|
|
150
|
-
spec = self._axis_mpl.get_subplotspec()
|
|
151
|
-
if spec is not None:
|
|
152
|
-
# Get grid shape and position
|
|
153
|
-
gridspec = spec.get_gridspec()
|
|
154
|
-
nrows, ncols = gridspec.get_geometry()
|
|
155
|
-
rowspan = spec.rowspan
|
|
156
|
-
colspan = spec.colspan
|
|
157
|
-
# Calculate flat index from row/col position
|
|
158
|
-
row_start = (
|
|
159
|
-
rowspan.start if hasattr(rowspan, "start") else rowspan
|
|
160
|
-
)
|
|
161
|
-
col_start = (
|
|
162
|
-
colspan.start if hasattr(colspan, "start") else colspan
|
|
163
|
-
)
|
|
164
|
-
flat_idx = row_start * ncols + col_start
|
|
165
|
-
axis_id = f"ax_{flat_idx:02d}"
|
|
166
|
-
except:
|
|
167
|
-
pass
|
|
168
|
-
|
|
169
|
-
# Fallback to sequential numbering
|
|
170
|
-
if axis_id is None:
|
|
171
|
-
axis_id = f"ax_{len(fig._separate_legend_params):02d}"
|
|
172
|
-
|
|
173
|
-
fig._separate_legend_params.append(
|
|
174
|
-
{
|
|
175
|
-
"axis": self._axis_mpl,
|
|
176
|
-
"axis_id": axis_id,
|
|
177
|
-
"handles": handles,
|
|
178
|
-
"labels": labels,
|
|
179
|
-
"figsize": figsize,
|
|
180
|
-
"dpi": dpi,
|
|
181
|
-
"frameon": frameon,
|
|
182
|
-
"fancybox": fancybox,
|
|
183
|
-
"shadow": shadow,
|
|
184
|
-
"kwargs": kwargs,
|
|
185
|
-
}
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
# Remove legend from main figure immediately
|
|
189
|
-
if self._axis_mpl.get_legend():
|
|
190
|
-
self._axis_mpl.get_legend().remove()
|
|
191
|
-
|
|
192
|
-
return None
|
|
193
|
-
|
|
194
|
-
# Original outside positions
|
|
195
|
-
outside_positions = {
|
|
196
|
-
# Upper right variants
|
|
197
|
-
"upper right out": ("center left", (1.15, 0.85)),
|
|
198
|
-
"right upper out": ("center left", (1.15, 0.85)),
|
|
199
|
-
# Center right variants
|
|
200
|
-
"center right out": ("center left", (1.15, 0.5)),
|
|
201
|
-
"right out": ("center left", (1.15, 0.5)),
|
|
202
|
-
"right": ("center left", (1.05, 0.5)),
|
|
203
|
-
# Lower right variants
|
|
204
|
-
"lower right out": ("center left", (1.15, 0.15)),
|
|
205
|
-
"right lower out": ("center left", (1.15, 0.15)),
|
|
206
|
-
# Upper left variants
|
|
207
|
-
"upper left out": ("center right", (-0.25, 0.85)),
|
|
208
|
-
"left upper out": ("center right", (-0.25, 0.85)),
|
|
209
|
-
# Center left variants
|
|
210
|
-
"center left out": ("center right", (-0.25, 0.5)),
|
|
211
|
-
"left out": ("center right", (-0.25, 0.5)),
|
|
212
|
-
"left": ("center right", (-0.15, 0.5)),
|
|
213
|
-
# Lower left variants
|
|
214
|
-
"lower left out": ("center right", (-0.25, 0.15)),
|
|
215
|
-
"left lower out": ("center right", (-0.25, 0.15)),
|
|
216
|
-
# Upper center variants
|
|
217
|
-
"upper center out": ("lower center", (0.5, 1.25)),
|
|
218
|
-
"upper out": ("lower center", (0.5, 1.25)),
|
|
219
|
-
# Lower center variants
|
|
220
|
-
"lower center out": ("upper center", (0.5, -0.25)),
|
|
221
|
-
"lower out": ("upper center", (0.5, -0.25)),
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
# Place the legend
|
|
225
|
-
if loc in outside_positions:
|
|
226
|
-
location, bbox = outside_positions[loc]
|
|
227
|
-
legend_obj = self._axis_mpl.legend(
|
|
228
|
-
*args, loc=location, bbox_to_anchor=bbox, **kwargs
|
|
229
|
-
)
|
|
230
|
-
else:
|
|
231
|
-
legend_obj = self._axis_mpl.legend(*args, loc=loc, **kwargs)
|
|
232
|
-
|
|
233
|
-
# Check for overlap if requested
|
|
234
|
-
if check_overlap and legend_obj is not None:
|
|
235
|
-
self._check_legend_overlap(legend_obj)
|
|
236
|
-
|
|
237
|
-
return legend_obj
|
|
238
|
-
|
|
239
|
-
def _check_legend_overlap(self, legend_obj):
|
|
240
|
-
"""Check if legend overlaps with plotted data and issue warning if needed.
|
|
241
|
-
|
|
242
|
-
Parameters
|
|
243
|
-
----------
|
|
244
|
-
legend_obj : matplotlib.legend.Legend
|
|
245
|
-
The legend object to check for overlap
|
|
246
|
-
"""
|
|
247
|
-
import warnings
|
|
248
|
-
import matplotlib.transforms as transforms
|
|
249
|
-
|
|
250
|
-
try:
|
|
251
|
-
# Get the legend's bounding box in display coordinates
|
|
252
|
-
fig = self._axis_mpl.get_figure()
|
|
253
|
-
fig.canvas.draw() # Force draw to get accurate bounding boxes
|
|
254
|
-
|
|
255
|
-
legend_bbox = legend_obj.get_window_extent(fig.canvas.get_renderer())
|
|
256
|
-
|
|
257
|
-
# Convert to axis coordinates for easier comparison
|
|
258
|
-
inv_transform = self._axis_mpl.transData.inverted()
|
|
259
|
-
legend_bbox_data = legend_bbox.transformed(inv_transform)
|
|
260
|
-
|
|
261
|
-
# Get data bounding boxes for all artists (lines, scatter, etc.)
|
|
262
|
-
data_bboxes = []
|
|
263
|
-
|
|
264
|
-
for line in self._axis_mpl.get_lines():
|
|
265
|
-
if line.get_visible():
|
|
266
|
-
try:
|
|
267
|
-
data = line.get_xydata()
|
|
268
|
-
if len(data) > 0:
|
|
269
|
-
data_bboxes.append(data)
|
|
270
|
-
except:
|
|
271
|
-
pass
|
|
272
|
-
|
|
273
|
-
for collection in self._axis_mpl.collections:
|
|
274
|
-
if collection.get_visible():
|
|
275
|
-
try:
|
|
276
|
-
offsets = collection.get_offsets()
|
|
277
|
-
if len(offsets) > 0:
|
|
278
|
-
data_bboxes.append(offsets)
|
|
279
|
-
except:
|
|
280
|
-
pass
|
|
281
|
-
|
|
282
|
-
# Check for overlap
|
|
283
|
-
if data_bboxes:
|
|
284
|
-
import numpy as np
|
|
285
|
-
|
|
286
|
-
all_data = np.vstack(data_bboxes)
|
|
287
|
-
|
|
288
|
-
# Count how many data points fall within legend bbox
|
|
289
|
-
x_overlap = (all_data[:, 0] >= legend_bbox_data.x0) & (
|
|
290
|
-
all_data[:, 0] <= legend_bbox_data.x1
|
|
291
|
-
)
|
|
292
|
-
y_overlap = (all_data[:, 1] >= legend_bbox_data.y0) & (
|
|
293
|
-
all_data[:, 1] <= legend_bbox_data.y1
|
|
294
|
-
)
|
|
295
|
-
overlap_points = np.sum(x_overlap & y_overlap)
|
|
296
|
-
|
|
297
|
-
# Calculate overlap percentage
|
|
298
|
-
overlap_pct = (overlap_points / len(all_data)) * 100
|
|
299
|
-
|
|
300
|
-
# Warn if significant overlap (>5% of data points)
|
|
301
|
-
if overlap_pct > 5:
|
|
302
|
-
warnings.warn(
|
|
303
|
-
f"Legend overlaps with {overlap_pct:.1f}% of data points. "
|
|
304
|
-
f"Consider using:\n"
|
|
305
|
-
f" - ax.legend(loc='outer') # Place outside plot area\n"
|
|
306
|
-
f" - ax.legend(loc='separate') # Save as separate file\n"
|
|
307
|
-
f" - Manually adjust with loc='upper left', 'lower right', etc.",
|
|
308
|
-
UserWarning,
|
|
309
|
-
stacklevel=3,
|
|
310
|
-
)
|
|
311
|
-
return True # Overlap detected
|
|
312
|
-
|
|
313
|
-
except Exception as e:
|
|
314
|
-
# Silently fail if overlap detection doesn't work
|
|
315
|
-
# (Some plot types may not support this)
|
|
316
|
-
pass
|
|
317
|
-
|
|
318
|
-
return False # No significant overlap
|
|
319
|
-
|
|
320
|
-
def set_xyt(
|
|
321
|
-
self,
|
|
322
|
-
x: Optional[str] = None,
|
|
323
|
-
y: Optional[str] = None,
|
|
324
|
-
t: Optional[str] = None,
|
|
325
|
-
format_labels: bool = True,
|
|
326
|
-
) -> None:
|
|
327
|
-
self._axis_mpl = ax_module.set_xyt(
|
|
328
|
-
self._axis_mpl,
|
|
329
|
-
x=x,
|
|
330
|
-
y=y,
|
|
331
|
-
t=t,
|
|
332
|
-
format_labels=format_labels,
|
|
333
|
-
)
|
|
334
|
-
|
|
335
|
-
def set_xytc(
|
|
336
|
-
self,
|
|
337
|
-
x: Optional[str] = None,
|
|
338
|
-
y: Optional[str] = None,
|
|
339
|
-
t: Optional[str] = None,
|
|
340
|
-
c: Optional[str] = None,
|
|
341
|
-
format_labels: bool = True,
|
|
342
|
-
) -> None:
|
|
343
|
-
"""Set xlabel, ylabel, title, and caption for automatic saving.
|
|
344
|
-
|
|
345
|
-
Parameters
|
|
346
|
-
----------
|
|
347
|
-
x : str, optional
|
|
348
|
-
X-axis label
|
|
349
|
-
y : str, optional
|
|
350
|
-
Y-axis label
|
|
351
|
-
t : str, optional
|
|
352
|
-
Title
|
|
353
|
-
c : str, optional
|
|
354
|
-
Caption to be saved automatically with scitex.io.save()
|
|
355
|
-
format_labels : bool, optional
|
|
356
|
-
Whether to apply automatic formatting, by default True
|
|
357
|
-
"""
|
|
358
|
-
self._axis_mpl = ax_module.set_xytc(
|
|
359
|
-
self._axis_mpl,
|
|
360
|
-
x=x,
|
|
361
|
-
y=y,
|
|
362
|
-
t=t,
|
|
363
|
-
c=c,
|
|
364
|
-
format_labels=format_labels,
|
|
365
|
-
)
|
|
366
|
-
|
|
367
|
-
# Store caption in this wrapper for easy access
|
|
368
|
-
if c is not False and c is not None:
|
|
369
|
-
self._scitex_caption = c
|
|
370
|
-
|
|
371
|
-
def set_supxyt(
|
|
372
|
-
self,
|
|
373
|
-
xlabel: Optional[str] = None,
|
|
374
|
-
ylabel: Optional[str] = None,
|
|
375
|
-
title: Optional[str] = None,
|
|
376
|
-
format_labels: bool = True,
|
|
377
|
-
) -> None:
|
|
378
|
-
self._axis_mpl = ax_module.set_supxyt(
|
|
379
|
-
self._axis_mpl,
|
|
380
|
-
xlabel=xlabel,
|
|
381
|
-
ylabel=ylabel,
|
|
382
|
-
title=title,
|
|
383
|
-
format_labels=format_labels,
|
|
384
|
-
)
|
|
385
|
-
|
|
386
|
-
def set_supxytc(
|
|
387
|
-
self,
|
|
388
|
-
xlabel: Optional[str] = None,
|
|
389
|
-
ylabel: Optional[str] = None,
|
|
390
|
-
title: Optional[str] = None,
|
|
391
|
-
caption: Optional[str] = None,
|
|
392
|
-
format_labels: bool = True,
|
|
393
|
-
) -> None:
|
|
394
|
-
"""Set figure-level xlabel, ylabel, title, and caption for automatic saving.
|
|
395
|
-
|
|
396
|
-
Parameters
|
|
397
|
-
----------
|
|
398
|
-
xlabel : str, optional
|
|
399
|
-
Figure-level X-axis label
|
|
400
|
-
ylabel : str, optional
|
|
401
|
-
Figure-level Y-axis label
|
|
402
|
-
title : str, optional
|
|
403
|
-
Figure-level title (suptitle)
|
|
404
|
-
caption : str, optional
|
|
405
|
-
Figure-level caption to be saved automatically with scitex.io.save()
|
|
406
|
-
format_labels : bool, optional
|
|
407
|
-
Whether to apply automatic formatting, by default True
|
|
408
|
-
"""
|
|
409
|
-
self._axis_mpl = ax_module.set_supxytc(
|
|
410
|
-
self._axis_mpl,
|
|
411
|
-
xlabel=xlabel,
|
|
412
|
-
ylabel=ylabel,
|
|
413
|
-
title=title,
|
|
414
|
-
caption=caption,
|
|
415
|
-
format_labels=format_labels,
|
|
416
|
-
)
|
|
417
|
-
|
|
418
|
-
# Store figure-level caption for easy access
|
|
419
|
-
if caption is not False and caption is not None:
|
|
420
|
-
fig = self._axis_mpl.get_figure()
|
|
421
|
-
fig._scitex_main_caption = caption
|
|
422
|
-
|
|
423
|
-
def set_meta(
|
|
424
|
-
self,
|
|
425
|
-
caption=None,
|
|
426
|
-
methods=None,
|
|
427
|
-
stats=None,
|
|
428
|
-
keywords=None,
|
|
429
|
-
experimental_details=None,
|
|
430
|
-
journal_style=None,
|
|
431
|
-
significance=None,
|
|
432
|
-
**kwargs,
|
|
433
|
-
) -> None:
|
|
434
|
-
"""Set comprehensive scientific metadata with YAML export capability.
|
|
435
|
-
|
|
436
|
-
Parameters
|
|
437
|
-
----------
|
|
438
|
-
caption : str, optional
|
|
439
|
-
Figure caption text
|
|
440
|
-
methods : str, optional
|
|
441
|
-
Experimental methods description
|
|
442
|
-
stats : str, optional
|
|
443
|
-
Statistical analysis details
|
|
444
|
-
keywords : List[str], optional
|
|
445
|
-
Keywords for categorization
|
|
446
|
-
experimental_details : Dict[str, Any], optional
|
|
447
|
-
Structured experimental parameters
|
|
448
|
-
journal_style : str, optional
|
|
449
|
-
Target journal style
|
|
450
|
-
significance : str, optional
|
|
451
|
-
Significance statement
|
|
452
|
-
**kwargs : additional metadata
|
|
453
|
-
Any additional metadata fields
|
|
454
|
-
"""
|
|
455
|
-
self._axis_mpl = ax_module.set_meta(
|
|
456
|
-
self._axis_mpl,
|
|
457
|
-
caption=caption,
|
|
458
|
-
methods=methods,
|
|
459
|
-
stats=stats,
|
|
460
|
-
keywords=keywords,
|
|
461
|
-
experimental_details=experimental_details,
|
|
462
|
-
journal_style=journal_style,
|
|
463
|
-
significance=significance,
|
|
464
|
-
**kwargs,
|
|
465
|
-
)
|
|
466
|
-
|
|
467
|
-
def set_figure_meta(
|
|
468
|
-
self,
|
|
469
|
-
caption=None,
|
|
470
|
-
methods=None,
|
|
471
|
-
stats=None,
|
|
472
|
-
significance=None,
|
|
473
|
-
funding=None,
|
|
474
|
-
conflicts=None,
|
|
475
|
-
data_availability=None,
|
|
476
|
-
**kwargs,
|
|
477
|
-
) -> None:
|
|
478
|
-
"""Set figure-level metadata for multi-panel figures.
|
|
479
|
-
|
|
480
|
-
Parameters
|
|
481
|
-
----------
|
|
482
|
-
caption : str, optional
|
|
483
|
-
Figure-level caption
|
|
484
|
-
methods : str, optional
|
|
485
|
-
Overall experimental methods
|
|
486
|
-
stats : str, optional
|
|
487
|
-
Overall statistical approach
|
|
488
|
-
significance : str, optional
|
|
489
|
-
Significance and implications
|
|
490
|
-
funding : str, optional
|
|
491
|
-
Funding acknowledgments
|
|
492
|
-
conflicts : str, optional
|
|
493
|
-
Conflict of interest statement
|
|
494
|
-
data_availability : str, optional
|
|
495
|
-
Data availability statement
|
|
496
|
-
**kwargs : additional metadata
|
|
497
|
-
Any additional figure-level metadata
|
|
498
|
-
"""
|
|
499
|
-
self._axis_mpl = ax_module.set_figure_meta(
|
|
500
|
-
self._axis_mpl,
|
|
501
|
-
caption=caption,
|
|
502
|
-
methods=methods,
|
|
503
|
-
stats=stats,
|
|
504
|
-
significance=significance,
|
|
505
|
-
funding=funding,
|
|
506
|
-
conflicts=conflicts,
|
|
507
|
-
data_availability=data_availability,
|
|
508
|
-
**kwargs,
|
|
509
|
-
)
|
|
510
|
-
|
|
511
|
-
def set_ticks(
|
|
512
|
-
self,
|
|
513
|
-
xvals: Optional[List[Union[int, float]]] = None,
|
|
514
|
-
xticks: Optional[List[str]] = None,
|
|
515
|
-
yvals: Optional[List[Union[int, float]]] = None,
|
|
516
|
-
yticks: Optional[List[str]] = None,
|
|
517
|
-
) -> None:
|
|
518
|
-
self._axis_mpl = ax_module.set_ticks(
|
|
519
|
-
self._axis_mpl,
|
|
520
|
-
xvals=xvals,
|
|
521
|
-
xticks=xticks,
|
|
522
|
-
yvals=yvals,
|
|
523
|
-
yticks=yticks,
|
|
524
|
-
)
|
|
525
|
-
|
|
526
|
-
def set_n_ticks(self, n_xticks: int = 4, n_yticks: int = 4) -> None:
|
|
527
|
-
self._axis_mpl = ax_module.set_n_ticks(
|
|
528
|
-
self._axis_mpl, n_xticks=n_xticks, n_yticks=n_yticks
|
|
529
|
-
)
|
|
530
|
-
|
|
531
|
-
def hide_spines(
|
|
532
|
-
self,
|
|
533
|
-
top: bool = True,
|
|
534
|
-
bottom: bool = False,
|
|
535
|
-
left: bool = False,
|
|
536
|
-
right: bool = True,
|
|
537
|
-
ticks: bool = False,
|
|
538
|
-
labels: bool = False,
|
|
539
|
-
) -> None:
|
|
540
|
-
self._axis_mpl = ax_module.hide_spines(
|
|
541
|
-
self._axis_mpl,
|
|
542
|
-
top=top,
|
|
543
|
-
bottom=bottom,
|
|
544
|
-
left=left,
|
|
545
|
-
right=right,
|
|
546
|
-
ticks=ticks,
|
|
547
|
-
labels=labels,
|
|
548
|
-
)
|
|
549
|
-
|
|
550
|
-
def extend(self, x_ratio: float = 1.0, y_ratio: float = 1.0) -> None:
|
|
551
|
-
self._axis_mpl = ax_module.extend(
|
|
552
|
-
self._axis_mpl, x_ratio=x_ratio, y_ratio=y_ratio
|
|
553
|
-
)
|
|
554
|
-
|
|
555
|
-
def shift(self, dx: float = 0, dy: float = 0) -> None:
|
|
556
|
-
self._axis_mpl = ax_module.shift(self._axis_mpl, dx=dx, dy=dy)
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
# EOF
|