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
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-12-13 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex-code/src/scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Matplotlib aliases (mpl_xxx) for explicit matplotlib-style API.
|
|
8
|
+
|
|
9
|
+
Provides consistent naming convention:
|
|
10
|
+
- stx_xxx: scitex-specific methods (ArrayLike input, tracked)
|
|
11
|
+
- sns_xxx: seaborn wrappers (DataFrame input, tracked)
|
|
12
|
+
- mpl_xxx: matplotlib methods (matplotlib-style input, tracked)
|
|
13
|
+
|
|
14
|
+
All three API layers track data for reproducibility.
|
|
15
|
+
|
|
16
|
+
Usage:
|
|
17
|
+
ax.stx_line(y) # ArrayLike input
|
|
18
|
+
ax.sns_boxplot(data=df, x="group", y="value") # DataFrame input
|
|
19
|
+
ax.mpl_plot(x, y) # matplotlib-style input
|
|
20
|
+
ax.plot(x, y) # Same as mpl_plot
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
import os
|
|
24
|
+
|
|
25
|
+
__FILE__ = __file__
|
|
26
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class RawMatplotlibMixin:
|
|
30
|
+
"""Mixin providing mpl_xxx aliases for matplotlib-style API.
|
|
31
|
+
|
|
32
|
+
These methods are identical to calling ax.plot(), ax.scatter(), etc.
|
|
33
|
+
They go through SciTeX's __getattr__ wrapper and are fully tracked.
|
|
34
|
+
|
|
35
|
+
The mpl_* prefix provides:
|
|
36
|
+
- Explicit naming convention (mpl_* vs stx_* vs sns_*)
|
|
37
|
+
- Programmatic access via MPL_METHODS registry
|
|
38
|
+
- Same tracking and styling as regular matplotlib calls
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
# =========================================================================
|
|
42
|
+
# Helper to call through __getattr__ wrapper (enables tracking)
|
|
43
|
+
# =========================================================================
|
|
44
|
+
def _mpl_call(self, method_name, *args, **kwargs):
|
|
45
|
+
"""Call matplotlib method through __getattr__ wrapper for tracking."""
|
|
46
|
+
# Use object.__getattribute__ to get the __getattr__ from AxisWrapper
|
|
47
|
+
# Then call it with the method name to get the tracked wrapper
|
|
48
|
+
wrapper_class = type(self)
|
|
49
|
+
# Walk up MRO to find __getattr__ in AxisWrapper
|
|
50
|
+
for cls in wrapper_class.__mro__:
|
|
51
|
+
if "__getattr__" in cls.__dict__:
|
|
52
|
+
return cls.__getattr__(self, method_name)(*args, **kwargs)
|
|
53
|
+
# Fallback to direct call if no __getattr__ found
|
|
54
|
+
return getattr(self._axes_mpl, method_name)(*args, **kwargs)
|
|
55
|
+
|
|
56
|
+
# =========================================================================
|
|
57
|
+
# Line plots
|
|
58
|
+
# =========================================================================
|
|
59
|
+
def mpl_plot(self, *args, **kwargs):
|
|
60
|
+
"""Matplotlib plot() - tracked, identical to ax.plot()."""
|
|
61
|
+
return self._mpl_call("plot", *args, **kwargs)
|
|
62
|
+
|
|
63
|
+
def mpl_step(self, *args, **kwargs):
|
|
64
|
+
"""Matplotlib step() - tracked, identical to ax.step()."""
|
|
65
|
+
return self._mpl_call("step", *args, **kwargs)
|
|
66
|
+
|
|
67
|
+
def mpl_stem(self, *args, **kwargs):
|
|
68
|
+
"""Matplotlib stem() - tracked, identical to ax.stem()."""
|
|
69
|
+
return self._mpl_call("stem", *args, **kwargs)
|
|
70
|
+
|
|
71
|
+
# =========================================================================
|
|
72
|
+
# Scatter plots
|
|
73
|
+
# =========================================================================
|
|
74
|
+
def mpl_scatter(self, *args, **kwargs):
|
|
75
|
+
"""Matplotlib scatter() - tracked, identical to ax.scatter()."""
|
|
76
|
+
return self._mpl_call("scatter", *args, **kwargs)
|
|
77
|
+
|
|
78
|
+
# =========================================================================
|
|
79
|
+
# Bar plots
|
|
80
|
+
# =========================================================================
|
|
81
|
+
def mpl_bar(self, *args, **kwargs):
|
|
82
|
+
"""Matplotlib bar() - tracked, identical to ax.bar()."""
|
|
83
|
+
return self._mpl_call("bar", *args, **kwargs)
|
|
84
|
+
|
|
85
|
+
def mpl_barh(self, *args, **kwargs):
|
|
86
|
+
"""Matplotlib barh() - tracked, identical to ax.barh()."""
|
|
87
|
+
return self._mpl_call("barh", *args, **kwargs)
|
|
88
|
+
|
|
89
|
+
def mpl_bar3d(self, *args, **kwargs):
|
|
90
|
+
"""Matplotlib bar3d() (3D axes) - tracked."""
|
|
91
|
+
return self._mpl_call("bar3d", *args, **kwargs)
|
|
92
|
+
|
|
93
|
+
# =========================================================================
|
|
94
|
+
# Histograms
|
|
95
|
+
# =========================================================================
|
|
96
|
+
def mpl_hist(self, *args, **kwargs):
|
|
97
|
+
"""Matplotlib hist() - tracked, identical to ax.hist()."""
|
|
98
|
+
return self._mpl_call("hist", *args, **kwargs)
|
|
99
|
+
|
|
100
|
+
def mpl_hist2d(self, *args, **kwargs):
|
|
101
|
+
"""Matplotlib hist2d() - tracked, identical to ax.hist2d()."""
|
|
102
|
+
return self._mpl_call("hist2d", *args, **kwargs)
|
|
103
|
+
|
|
104
|
+
def mpl_hexbin(self, *args, **kwargs):
|
|
105
|
+
"""Matplotlib hexbin() - tracked, identical to ax.hexbin()."""
|
|
106
|
+
return self._mpl_call("hexbin", *args, **kwargs)
|
|
107
|
+
|
|
108
|
+
# =========================================================================
|
|
109
|
+
# Statistical plots
|
|
110
|
+
# =========================================================================
|
|
111
|
+
def mpl_boxplot(self, *args, **kwargs):
|
|
112
|
+
"""Matplotlib boxplot() - tracked, identical to ax.boxplot()."""
|
|
113
|
+
return self._mpl_call("boxplot", *args, **kwargs)
|
|
114
|
+
|
|
115
|
+
def mpl_violinplot(self, *args, **kwargs):
|
|
116
|
+
"""Matplotlib violinplot() - tracked, identical to ax.violinplot()."""
|
|
117
|
+
return self._mpl_call("violinplot", *args, **kwargs)
|
|
118
|
+
|
|
119
|
+
def mpl_errorbar(self, *args, **kwargs):
|
|
120
|
+
"""Matplotlib errorbar() - tracked, identical to ax.errorbar()."""
|
|
121
|
+
return self._mpl_call("errorbar", *args, **kwargs)
|
|
122
|
+
|
|
123
|
+
def mpl_eventplot(self, *args, **kwargs):
|
|
124
|
+
"""Matplotlib eventplot() - tracked, identical to ax.eventplot()."""
|
|
125
|
+
return self._mpl_call("eventplot", *args, **kwargs)
|
|
126
|
+
|
|
127
|
+
# =========================================================================
|
|
128
|
+
# Fill and area plots
|
|
129
|
+
# =========================================================================
|
|
130
|
+
def mpl_fill(self, *args, **kwargs):
|
|
131
|
+
"""Matplotlib fill() - tracked, identical to ax.fill()."""
|
|
132
|
+
return self._mpl_call("fill", *args, **kwargs)
|
|
133
|
+
|
|
134
|
+
def mpl_fill_between(self, *args, **kwargs):
|
|
135
|
+
"""Matplotlib fill_between() - tracked, identical to ax.fill_between()."""
|
|
136
|
+
return self._mpl_call("fill_between", *args, **kwargs)
|
|
137
|
+
|
|
138
|
+
def mpl_fill_betweenx(self, *args, **kwargs):
|
|
139
|
+
"""Matplotlib fill_betweenx() - tracked, identical to ax.fill_betweenx()."""
|
|
140
|
+
return self._mpl_call("fill_betweenx", *args, **kwargs)
|
|
141
|
+
|
|
142
|
+
def mpl_stackplot(self, *args, **kwargs):
|
|
143
|
+
"""Matplotlib stackplot() - tracked, identical to ax.stackplot()."""
|
|
144
|
+
return self._mpl_call("stackplot", *args, **kwargs)
|
|
145
|
+
|
|
146
|
+
# =========================================================================
|
|
147
|
+
# Contour and heatmap plots
|
|
148
|
+
# =========================================================================
|
|
149
|
+
def mpl_contour(self, *args, **kwargs):
|
|
150
|
+
"""Matplotlib contour() - tracked, identical to ax.contour()."""
|
|
151
|
+
return self._mpl_call("contour", *args, **kwargs)
|
|
152
|
+
|
|
153
|
+
def mpl_contourf(self, *args, **kwargs):
|
|
154
|
+
"""Matplotlib contourf() - tracked, identical to ax.contourf()."""
|
|
155
|
+
return self._mpl_call("contourf", *args, **kwargs)
|
|
156
|
+
|
|
157
|
+
def mpl_imshow(self, *args, **kwargs):
|
|
158
|
+
"""Matplotlib imshow() - tracked, identical to ax.imshow()."""
|
|
159
|
+
return self._mpl_call("imshow", *args, **kwargs)
|
|
160
|
+
|
|
161
|
+
def mpl_pcolormesh(self, *args, **kwargs):
|
|
162
|
+
"""Matplotlib pcolormesh() - tracked, identical to ax.pcolormesh()."""
|
|
163
|
+
return self._mpl_call("pcolormesh", *args, **kwargs)
|
|
164
|
+
|
|
165
|
+
def mpl_pcolor(self, *args, **kwargs):
|
|
166
|
+
"""Matplotlib pcolor() - tracked, identical to ax.pcolor()."""
|
|
167
|
+
return self._mpl_call("pcolor", *args, **kwargs)
|
|
168
|
+
|
|
169
|
+
def mpl_matshow(self, *args, **kwargs):
|
|
170
|
+
"""Matplotlib matshow() - tracked, identical to ax.matshow()."""
|
|
171
|
+
return self._mpl_call("matshow", *args, **kwargs)
|
|
172
|
+
|
|
173
|
+
# =========================================================================
|
|
174
|
+
# Vector field plots
|
|
175
|
+
# =========================================================================
|
|
176
|
+
def mpl_quiver(self, *args, **kwargs):
|
|
177
|
+
"""Matplotlib quiver() - tracked, identical to ax.quiver()."""
|
|
178
|
+
return self._mpl_call("quiver", *args, **kwargs)
|
|
179
|
+
|
|
180
|
+
def mpl_streamplot(self, *args, **kwargs):
|
|
181
|
+
"""Matplotlib streamplot() - tracked, identical to ax.streamplot()."""
|
|
182
|
+
return self._mpl_call("streamplot", *args, **kwargs)
|
|
183
|
+
|
|
184
|
+
def mpl_barbs(self, *args, **kwargs):
|
|
185
|
+
"""Matplotlib barbs() - tracked, identical to ax.barbs()."""
|
|
186
|
+
return self._mpl_call("barbs", *args, **kwargs)
|
|
187
|
+
|
|
188
|
+
# =========================================================================
|
|
189
|
+
# Pie and polar plots
|
|
190
|
+
# =========================================================================
|
|
191
|
+
def mpl_pie(self, *args, **kwargs):
|
|
192
|
+
"""Matplotlib pie() - tracked, identical to ax.pie()."""
|
|
193
|
+
return self._mpl_call("pie", *args, **kwargs)
|
|
194
|
+
|
|
195
|
+
# =========================================================================
|
|
196
|
+
# Text and annotations
|
|
197
|
+
# =========================================================================
|
|
198
|
+
def mpl_text(self, *args, **kwargs):
|
|
199
|
+
"""Matplotlib text() - tracked, identical to ax.text()."""
|
|
200
|
+
return self._mpl_call("text", *args, **kwargs)
|
|
201
|
+
|
|
202
|
+
def mpl_annotate(self, *args, **kwargs):
|
|
203
|
+
"""Matplotlib annotate() - tracked, identical to ax.annotate()."""
|
|
204
|
+
return self._mpl_call("annotate", *args, **kwargs)
|
|
205
|
+
|
|
206
|
+
# =========================================================================
|
|
207
|
+
# Lines and spans
|
|
208
|
+
# =========================================================================
|
|
209
|
+
def mpl_axhline(self, *args, **kwargs):
|
|
210
|
+
"""Matplotlib axhline() - tracked, identical to ax.axhline()."""
|
|
211
|
+
return self._mpl_call("axhline", *args, **kwargs)
|
|
212
|
+
|
|
213
|
+
def mpl_axvline(self, *args, **kwargs):
|
|
214
|
+
"""Matplotlib axvline() - tracked, identical to ax.axvline()."""
|
|
215
|
+
return self._mpl_call("axvline", *args, **kwargs)
|
|
216
|
+
|
|
217
|
+
def mpl_axhspan(self, *args, **kwargs):
|
|
218
|
+
"""Matplotlib axhspan() - tracked, identical to ax.axhspan()."""
|
|
219
|
+
return self._mpl_call("axhspan", *args, **kwargs)
|
|
220
|
+
|
|
221
|
+
def mpl_axvspan(self, *args, **kwargs):
|
|
222
|
+
"""Matplotlib axvspan() - tracked, identical to ax.axvspan()."""
|
|
223
|
+
return self._mpl_call("axvspan", *args, **kwargs)
|
|
224
|
+
|
|
225
|
+
# =========================================================================
|
|
226
|
+
# Patches and shapes
|
|
227
|
+
# =========================================================================
|
|
228
|
+
def mpl_add_patch(self, patch, **kwargs):
|
|
229
|
+
"""Matplotlib add_patch() - tracked, identical to ax.add_patch()."""
|
|
230
|
+
return self._mpl_call("add_patch", patch, **kwargs)
|
|
231
|
+
|
|
232
|
+
def mpl_add_artist(self, artist, **kwargs):
|
|
233
|
+
"""Matplotlib add_artist() - tracked, identical to ax.add_artist()."""
|
|
234
|
+
return self._mpl_call("add_artist", artist, **kwargs)
|
|
235
|
+
|
|
236
|
+
def mpl_add_collection(self, collection, **kwargs):
|
|
237
|
+
"""Matplotlib add_collection() - tracked, identical to ax.add_collection()."""
|
|
238
|
+
return self._mpl_call("add_collection", collection, **kwargs)
|
|
239
|
+
|
|
240
|
+
# =========================================================================
|
|
241
|
+
# 3D plotting (if available)
|
|
242
|
+
# =========================================================================
|
|
243
|
+
def mpl_plot_surface(self, *args, **kwargs):
|
|
244
|
+
"""Matplotlib plot_surface() (3D axes) - tracked."""
|
|
245
|
+
return self._mpl_call("plot_surface", *args, **kwargs)
|
|
246
|
+
|
|
247
|
+
def mpl_plot_wireframe(self, *args, **kwargs):
|
|
248
|
+
"""Matplotlib plot_wireframe() (3D axes) - tracked."""
|
|
249
|
+
return self._mpl_call("plot_wireframe", *args, **kwargs)
|
|
250
|
+
|
|
251
|
+
def mpl_contour3D(self, *args, **kwargs):
|
|
252
|
+
"""Matplotlib contour3D() (3D axes) - tracked."""
|
|
253
|
+
return self._mpl_call("contour3D", *args, **kwargs)
|
|
254
|
+
|
|
255
|
+
def mpl_scatter3D(self, *args, **kwargs):
|
|
256
|
+
"""Matplotlib scatter3D() (3D axes) - tracked."""
|
|
257
|
+
return self._mpl_call("scatter3D", *args, **kwargs)
|
|
258
|
+
|
|
259
|
+
# =========================================================================
|
|
260
|
+
# Utility method to get raw axes
|
|
261
|
+
# =========================================================================
|
|
262
|
+
@property
|
|
263
|
+
def mpl_axes(self):
|
|
264
|
+
"""Direct access to underlying matplotlib axes object."""
|
|
265
|
+
return self._axes_mpl
|
|
266
|
+
|
|
267
|
+
def mpl_raw(self, method_name, *args, **kwargs):
|
|
268
|
+
"""Call any matplotlib method by name without scitex processing.
|
|
269
|
+
|
|
270
|
+
Parameters
|
|
271
|
+
----------
|
|
272
|
+
method_name : str
|
|
273
|
+
Name of matplotlib axes method to call
|
|
274
|
+
*args, **kwargs
|
|
275
|
+
Arguments to pass to the method
|
|
276
|
+
|
|
277
|
+
Returns
|
|
278
|
+
-------
|
|
279
|
+
result
|
|
280
|
+
Result from matplotlib method
|
|
281
|
+
|
|
282
|
+
Example
|
|
283
|
+
-------
|
|
284
|
+
>>> ax.mpl_raw("tricontour", x, y, z, levels=10)
|
|
285
|
+
"""
|
|
286
|
+
method = getattr(self._axes_mpl, method_name)
|
|
287
|
+
return method(*args, **kwargs)
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
# Registry of mpl_xxx methods for programmatic access
|
|
291
|
+
MPL_METHODS = [
|
|
292
|
+
# Line plots
|
|
293
|
+
"mpl_plot", "mpl_step", "mpl_stem",
|
|
294
|
+
# Scatter
|
|
295
|
+
"mpl_scatter",
|
|
296
|
+
# Bar
|
|
297
|
+
"mpl_bar", "mpl_barh", "mpl_bar3d",
|
|
298
|
+
# Histograms
|
|
299
|
+
"mpl_hist", "mpl_hist2d", "mpl_hexbin",
|
|
300
|
+
# Statistical
|
|
301
|
+
"mpl_boxplot", "mpl_violinplot", "mpl_errorbar", "mpl_eventplot",
|
|
302
|
+
# Fill/area
|
|
303
|
+
"mpl_fill", "mpl_fill_between", "mpl_fill_betweenx", "mpl_stackplot",
|
|
304
|
+
# Contour/heatmap
|
|
305
|
+
"mpl_contour", "mpl_contourf", "mpl_imshow", "mpl_pcolormesh", "mpl_pcolor", "mpl_matshow",
|
|
306
|
+
# Vector fields
|
|
307
|
+
"mpl_quiver", "mpl_streamplot", "mpl_barbs",
|
|
308
|
+
# Pie
|
|
309
|
+
"mpl_pie",
|
|
310
|
+
# Text/annotations
|
|
311
|
+
"mpl_text", "mpl_annotate",
|
|
312
|
+
# Lines/spans
|
|
313
|
+
"mpl_axhline", "mpl_axvline", "mpl_axhspan", "mpl_axvspan",
|
|
314
|
+
# Patches
|
|
315
|
+
"mpl_add_patch", "mpl_add_artist", "mpl_add_collection",
|
|
316
|
+
# 3D
|
|
317
|
+
"mpl_plot_surface", "mpl_plot_wireframe", "mpl_contour3D", "mpl_scatter3D",
|
|
318
|
+
]
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
# EOF
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-12-13 (ywatanabe)"
|
|
4
|
+
# File: __init__.py - SeabornMixin package
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
SeabornMixin - Modular seaborn integration mixin for AxisWrapper.
|
|
8
|
+
|
|
9
|
+
This package provides seaborn plotting functionality:
|
|
10
|
+
- _base: Helper methods and data preparation
|
|
11
|
+
- _wrappers: Individual seaborn plot wrappers (sns_xxx)
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
|
|
16
|
+
__FILE__ = __file__
|
|
17
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
18
|
+
|
|
19
|
+
from ._base import SeabornBaseMixin, sns_copy_doc
|
|
20
|
+
from ._wrappers import SeabornWrappersMixin
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SeabornMixin(SeabornBaseMixin, SeabornWrappersMixin):
|
|
24
|
+
"""Mixin class for seaborn plotting integration.
|
|
25
|
+
|
|
26
|
+
Combines:
|
|
27
|
+
- SeabornBaseMixin: Helper methods for tracking and data preparation
|
|
28
|
+
- SeabornWrappersMixin: Individual sns_ prefixed seaborn wrappers
|
|
29
|
+
"""
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# EOF
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-12-13 (ywatanabe)"
|
|
4
|
+
# File: _base.py - Base seaborn functionality
|
|
5
|
+
|
|
6
|
+
"""Base seaborn mixin with helper methods for tracking and data preparation."""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
from functools import wraps
|
|
10
|
+
|
|
11
|
+
import scitex
|
|
12
|
+
import numpy as np
|
|
13
|
+
import pandas as pd
|
|
14
|
+
import seaborn as sns
|
|
15
|
+
|
|
16
|
+
__FILE__ = __file__
|
|
17
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def sns_copy_doc(func):
|
|
21
|
+
"""Decorator to copy docstring from seaborn function."""
|
|
22
|
+
@wraps(func)
|
|
23
|
+
def wrapper(self, *args, **kwargs):
|
|
24
|
+
return func(self, *args, **kwargs)
|
|
25
|
+
|
|
26
|
+
sns_method_name = func.__name__.split("sns_")[-1]
|
|
27
|
+
wrapper.__doc__ = getattr(sns, sns_method_name).__doc__
|
|
28
|
+
return wrapper
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class SeabornBaseMixin:
|
|
32
|
+
"""Base mixin for seaborn integration with tracking support."""
|
|
33
|
+
|
|
34
|
+
def _sns_base(
|
|
35
|
+
self, method_name, *args, track=True, track_obj=None, id=None, **kwargs
|
|
36
|
+
):
|
|
37
|
+
"""Execute seaborn plot method with tracking support."""
|
|
38
|
+
sns_method_name = method_name.split("sns_")[-1]
|
|
39
|
+
|
|
40
|
+
with self._no_tracking():
|
|
41
|
+
sns_plot_fn = getattr(sns, sns_method_name)
|
|
42
|
+
|
|
43
|
+
if kwargs.get("hue_colors"):
|
|
44
|
+
kwargs = scitex.gen.alternate_kwarg(
|
|
45
|
+
kwargs, primary_key="palette", alternate_key="hue_colors"
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
import warnings
|
|
49
|
+
from scitex import logging
|
|
50
|
+
|
|
51
|
+
mpl_logger = logging.getLogger("matplotlib")
|
|
52
|
+
original_level = mpl_logger.level
|
|
53
|
+
mpl_logger.setLevel(logging.WARNING)
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
with warnings.catch_warnings():
|
|
57
|
+
warnings.filterwarnings(
|
|
58
|
+
"ignore",
|
|
59
|
+
message=".*categorical units.*parsable as floats or dates.*",
|
|
60
|
+
category=UserWarning,
|
|
61
|
+
)
|
|
62
|
+
warnings.filterwarnings(
|
|
63
|
+
"ignore",
|
|
64
|
+
message=".*Using categorical units.*",
|
|
65
|
+
module="matplotlib.*",
|
|
66
|
+
)
|
|
67
|
+
warnings.simplefilter("ignore", UserWarning)
|
|
68
|
+
|
|
69
|
+
self._axis_mpl = sns_plot_fn(ax=self._axis_mpl, *args, **kwargs)
|
|
70
|
+
finally:
|
|
71
|
+
mpl_logger.setLevel(original_level)
|
|
72
|
+
|
|
73
|
+
# Post-processing for histplot with kde=True
|
|
74
|
+
if sns_method_name == "histplot" and kwargs.get("kde", False):
|
|
75
|
+
from scitex.plt.utils import mm_to_pt
|
|
76
|
+
kde_lw = mm_to_pt(0.2)
|
|
77
|
+
for line in self._axis_mpl.get_lines():
|
|
78
|
+
line.set_linewidth(kde_lw)
|
|
79
|
+
line.set_color("black")
|
|
80
|
+
line.set_linestyle("--")
|
|
81
|
+
|
|
82
|
+
# Post-processing for histplot alpha
|
|
83
|
+
if sns_method_name == "histplot" and "alpha" not in kwargs:
|
|
84
|
+
for patch in self._axis_mpl.patches:
|
|
85
|
+
patch.set_alpha(1.0)
|
|
86
|
+
|
|
87
|
+
track_obj = track_obj if track_obj is not None else args
|
|
88
|
+
tracked_dict = {
|
|
89
|
+
"data": track_obj,
|
|
90
|
+
"args": args,
|
|
91
|
+
}
|
|
92
|
+
self._track(track, id, method_name, tracked_dict, kwargs)
|
|
93
|
+
|
|
94
|
+
def _sns_base_xyhue(self, method_name, *args, track=True, id=None, **kwargs):
|
|
95
|
+
"""Execute seaborn plot with x/y/hue data preparation."""
|
|
96
|
+
df = kwargs.get("data")
|
|
97
|
+
x, y, hue = kwargs.get("x"), kwargs.get("y"), kwargs.get("hue")
|
|
98
|
+
|
|
99
|
+
track_obj = self._sns_prepare_xyhue(df, x, y, hue) if df is not None else None
|
|
100
|
+
self._sns_base(
|
|
101
|
+
method_name,
|
|
102
|
+
*args,
|
|
103
|
+
track=track,
|
|
104
|
+
track_obj=track_obj,
|
|
105
|
+
id=id,
|
|
106
|
+
**kwargs,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
def _sns_prepare_xyhue(self, data=None, x=None, y=None, hue=None, **kwargs):
|
|
110
|
+
"""Prepare data for tracking based on x/y/hue configuration."""
|
|
111
|
+
data = data.reset_index()
|
|
112
|
+
|
|
113
|
+
if hue is not None:
|
|
114
|
+
if x is None and y is None:
|
|
115
|
+
return data
|
|
116
|
+
elif x is None:
|
|
117
|
+
agg_dict = {}
|
|
118
|
+
for hh in data[hue].unique():
|
|
119
|
+
agg_dict[hh] = data.loc[data[hue] == hh, y]
|
|
120
|
+
df = scitex.pd.force_df(agg_dict)
|
|
121
|
+
return df
|
|
122
|
+
elif y is None:
|
|
123
|
+
df = pd.concat(
|
|
124
|
+
[data.loc[data[hue] == hh, x] for hh in data[hue].unique()],
|
|
125
|
+
axis=1,
|
|
126
|
+
)
|
|
127
|
+
return df
|
|
128
|
+
else:
|
|
129
|
+
pivoted_data = data.pivot_table(
|
|
130
|
+
values=y,
|
|
131
|
+
index=data.index,
|
|
132
|
+
columns=[x, hue],
|
|
133
|
+
aggfunc="first",
|
|
134
|
+
)
|
|
135
|
+
pivoted_data.columns = [
|
|
136
|
+
f"{col[0]}-{col[1]}" for col in pivoted_data.columns
|
|
137
|
+
]
|
|
138
|
+
return pivoted_data
|
|
139
|
+
else:
|
|
140
|
+
if x is None and y is None:
|
|
141
|
+
return data
|
|
142
|
+
elif x is None:
|
|
143
|
+
return data[[y]]
|
|
144
|
+
elif y is None:
|
|
145
|
+
return data[[x]]
|
|
146
|
+
else:
|
|
147
|
+
return data.pivot_table(
|
|
148
|
+
values=y, index=data.index, columns=x, aggfunc="first"
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# EOF
|