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,600 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-12-13 (ywatanabe)"
|
|
4
|
+
# File: _wrappers.py - Seaborn plot wrappers
|
|
5
|
+
|
|
6
|
+
"""Seaborn plot wrappers with SciTeX integration."""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
from typing import Optional, Union
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
import pandas as pd
|
|
13
|
+
import seaborn as sns
|
|
14
|
+
|
|
15
|
+
from scitex.types import ArrayLike
|
|
16
|
+
|
|
17
|
+
from ._base import sns_copy_doc
|
|
18
|
+
|
|
19
|
+
__FILE__ = __file__
|
|
20
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SeabornWrappersMixin:
|
|
24
|
+
"""Mixin providing sns_ prefixed seaborn wrappers.
|
|
25
|
+
|
|
26
|
+
All methods use the seaborn DataFrame-centric interface:
|
|
27
|
+
- data: DataFrame containing the data
|
|
28
|
+
- x, y: Column names for axes
|
|
29
|
+
- hue: Column name for color grouping
|
|
30
|
+
|
|
31
|
+
These methods integrate with SciTeX tracking and styling.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def _get_ax_module(self):
|
|
35
|
+
"""Lazy import ax module to avoid circular imports."""
|
|
36
|
+
from .....plt import ax as ax_module
|
|
37
|
+
|
|
38
|
+
return ax_module
|
|
39
|
+
|
|
40
|
+
@sns_copy_doc
|
|
41
|
+
def sns_barplot(
|
|
42
|
+
self,
|
|
43
|
+
data: Optional[pd.DataFrame] = None,
|
|
44
|
+
*,
|
|
45
|
+
x: Optional[str] = None,
|
|
46
|
+
y: Optional[str] = None,
|
|
47
|
+
track: bool = True,
|
|
48
|
+
id: Optional[str] = None,
|
|
49
|
+
**kwargs,
|
|
50
|
+
):
|
|
51
|
+
"""Create a bar plot showing point estimates and error bars.
|
|
52
|
+
|
|
53
|
+
Parameters
|
|
54
|
+
----------
|
|
55
|
+
data : DataFrame, optional
|
|
56
|
+
Input data structure.
|
|
57
|
+
x : str, optional
|
|
58
|
+
Column name for x-axis categories.
|
|
59
|
+
y : str, optional
|
|
60
|
+
Column name for y-axis values.
|
|
61
|
+
track : bool, default True
|
|
62
|
+
Enable data tracking for reproducibility.
|
|
63
|
+
id : str, optional
|
|
64
|
+
Unique identifier for this plot element.
|
|
65
|
+
**kwargs
|
|
66
|
+
Additional arguments passed to `seaborn.barplot`.
|
|
67
|
+
|
|
68
|
+
See Also
|
|
69
|
+
--------
|
|
70
|
+
stx_bar : Array-based bar plot.
|
|
71
|
+
"""
|
|
72
|
+
self._sns_base_xyhue(
|
|
73
|
+
"sns_barplot", data=data, x=x, y=y, track=track, id=id, **kwargs
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
@sns_copy_doc
|
|
77
|
+
def sns_boxplot(
|
|
78
|
+
self,
|
|
79
|
+
data: Optional[pd.DataFrame] = None,
|
|
80
|
+
*,
|
|
81
|
+
x: Optional[str] = None,
|
|
82
|
+
y: Optional[str] = None,
|
|
83
|
+
strip: bool = False,
|
|
84
|
+
track: bool = True,
|
|
85
|
+
id: Optional[str] = None,
|
|
86
|
+
**kwargs,
|
|
87
|
+
):
|
|
88
|
+
"""Create a box plot showing distributions with quartiles.
|
|
89
|
+
|
|
90
|
+
Parameters
|
|
91
|
+
----------
|
|
92
|
+
data : DataFrame, optional
|
|
93
|
+
Input data structure.
|
|
94
|
+
x : str, optional
|
|
95
|
+
Column name for x-axis grouping.
|
|
96
|
+
y : str, optional
|
|
97
|
+
Column name for y-axis values.
|
|
98
|
+
strip : bool, default False
|
|
99
|
+
If True, overlay a stripplot showing individual points.
|
|
100
|
+
track : bool, default True
|
|
101
|
+
Enable data tracking for reproducibility.
|
|
102
|
+
id : str, optional
|
|
103
|
+
Unique identifier for this plot element.
|
|
104
|
+
**kwargs
|
|
105
|
+
Additional arguments passed to `seaborn.boxplot`.
|
|
106
|
+
|
|
107
|
+
See Also
|
|
108
|
+
--------
|
|
109
|
+
stx_box : Array-based boxplot.
|
|
110
|
+
sns_violinplot : Violin plot alternative.
|
|
111
|
+
"""
|
|
112
|
+
self._sns_base_xyhue(
|
|
113
|
+
"sns_boxplot", data=data, x=x, y=y, track=track, id=id, **kwargs
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Post-processing: Style boxplot with black medians
|
|
117
|
+
from scitex.plt.utils import mm_to_pt
|
|
118
|
+
|
|
119
|
+
lw_pt = mm_to_pt(0.2)
|
|
120
|
+
|
|
121
|
+
for line in self._axis_mpl.get_lines():
|
|
122
|
+
line.set_linewidth(lw_pt)
|
|
123
|
+
xdata = line.get_xdata()
|
|
124
|
+
ydata = line.get_ydata()
|
|
125
|
+
if len(xdata) == 2 and len(ydata) == 2:
|
|
126
|
+
if ydata[0] == ydata[1]:
|
|
127
|
+
x_span = abs(xdata[1] - xdata[0])
|
|
128
|
+
if x_span < 0.4:
|
|
129
|
+
line.set_color("black")
|
|
130
|
+
|
|
131
|
+
if strip:
|
|
132
|
+
strip_kwargs = kwargs.copy()
|
|
133
|
+
strip_kwargs.pop("notch", None)
|
|
134
|
+
strip_kwargs.pop("whis", None)
|
|
135
|
+
self.sns_stripplot(
|
|
136
|
+
data=data,
|
|
137
|
+
x=x,
|
|
138
|
+
y=y,
|
|
139
|
+
track=False,
|
|
140
|
+
id=f"{id}_strip",
|
|
141
|
+
**strip_kwargs,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
@sns_copy_doc
|
|
145
|
+
def sns_heatmap(
|
|
146
|
+
self,
|
|
147
|
+
data: Union[pd.DataFrame, ArrayLike],
|
|
148
|
+
*,
|
|
149
|
+
xyz: bool = False,
|
|
150
|
+
track: bool = True,
|
|
151
|
+
id: Optional[str] = None,
|
|
152
|
+
**kwargs,
|
|
153
|
+
):
|
|
154
|
+
"""Create a heatmap from rectangular data.
|
|
155
|
+
|
|
156
|
+
Parameters
|
|
157
|
+
----------
|
|
158
|
+
data : DataFrame or array-like
|
|
159
|
+
2D dataset for the heatmap.
|
|
160
|
+
xyz : bool, default False
|
|
161
|
+
If True, convert data to XYZ format before plotting.
|
|
162
|
+
track : bool, default True
|
|
163
|
+
Enable data tracking for reproducibility.
|
|
164
|
+
id : str, optional
|
|
165
|
+
Unique identifier for this plot element.
|
|
166
|
+
**kwargs
|
|
167
|
+
Additional arguments passed to `seaborn.heatmap`.
|
|
168
|
+
|
|
169
|
+
See Also
|
|
170
|
+
--------
|
|
171
|
+
stx_heatmap : Array-based annotated heatmap.
|
|
172
|
+
stx_image : Simple image display.
|
|
173
|
+
"""
|
|
174
|
+
import scitex
|
|
175
|
+
|
|
176
|
+
method_name = "sns_heatmap"
|
|
177
|
+
df = data
|
|
178
|
+
if xyz:
|
|
179
|
+
df = scitex.pd.to_xyz(df)
|
|
180
|
+
self._sns_base(method_name, df, track=track, track_obj=df, id=id, **kwargs)
|
|
181
|
+
|
|
182
|
+
@sns_copy_doc
|
|
183
|
+
def sns_histplot(
|
|
184
|
+
self,
|
|
185
|
+
data: Optional[pd.DataFrame] = None,
|
|
186
|
+
*,
|
|
187
|
+
x: Optional[str] = None,
|
|
188
|
+
y: Optional[str] = None,
|
|
189
|
+
bins: int = 10,
|
|
190
|
+
align_bins: bool = True,
|
|
191
|
+
track: bool = True,
|
|
192
|
+
id: Optional[str] = None,
|
|
193
|
+
**kwargs,
|
|
194
|
+
):
|
|
195
|
+
"""Create a histogram with optional kernel density estimate.
|
|
196
|
+
|
|
197
|
+
Parameters
|
|
198
|
+
----------
|
|
199
|
+
data : DataFrame, optional
|
|
200
|
+
Input data structure.
|
|
201
|
+
x : str, optional
|
|
202
|
+
Column name for x-axis values.
|
|
203
|
+
y : str, optional
|
|
204
|
+
Column name for y-axis values.
|
|
205
|
+
bins : int, default 10
|
|
206
|
+
Number of histogram bins.
|
|
207
|
+
align_bins : bool, default True
|
|
208
|
+
Align bins across multiple histograms on same axes.
|
|
209
|
+
track : bool, default True
|
|
210
|
+
Enable data tracking for reproducibility.
|
|
211
|
+
id : str, optional
|
|
212
|
+
Unique identifier for this plot element.
|
|
213
|
+
**kwargs
|
|
214
|
+
Additional arguments passed to `seaborn.histplot`.
|
|
215
|
+
Common options: kde, stat, element, hue.
|
|
216
|
+
|
|
217
|
+
See Also
|
|
218
|
+
--------
|
|
219
|
+
hist : Array-based histogram.
|
|
220
|
+
stx_kde : Kernel density estimate.
|
|
221
|
+
"""
|
|
222
|
+
method_name = "sns_histplot"
|
|
223
|
+
|
|
224
|
+
plot_data = None
|
|
225
|
+
if data is not None and x is not None:
|
|
226
|
+
plot_data = (
|
|
227
|
+
data[x].values
|
|
228
|
+
if hasattr(data, "columns") and x in data.columns
|
|
229
|
+
else None
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
axis_id = str(hash(self._axis_mpl))
|
|
233
|
+
hist_id = id if id is not None else str(self.id)
|
|
234
|
+
range_value = kwargs.get("binrange", None)
|
|
235
|
+
|
|
236
|
+
if align_bins and plot_data is not None:
|
|
237
|
+
from .....plt.utils import histogram_bin_manager
|
|
238
|
+
|
|
239
|
+
bins_val, range_val = histogram_bin_manager.register_histogram(
|
|
240
|
+
axis_id, hist_id, plot_data, bins, range_value
|
|
241
|
+
)
|
|
242
|
+
kwargs["bins"] = bins_val
|
|
243
|
+
if range_value is not None:
|
|
244
|
+
kwargs["binrange"] = range_val
|
|
245
|
+
|
|
246
|
+
with self._no_tracking():
|
|
247
|
+
sns_plot = sns.histplot(data=data, x=x, y=y, ax=self._axis_mpl, **kwargs)
|
|
248
|
+
|
|
249
|
+
hist_result = None
|
|
250
|
+
if hasattr(sns_plot, "patches") and sns_plot.patches:
|
|
251
|
+
patches = sns_plot.patches
|
|
252
|
+
if patches:
|
|
253
|
+
counts = np.array([p.get_height() for p in patches])
|
|
254
|
+
bin_edges = []
|
|
255
|
+
for p in patches:
|
|
256
|
+
bin_edges.append(p.get_x())
|
|
257
|
+
if patches:
|
|
258
|
+
bin_edges.append(patches[-1].get_x() + patches[-1].get_width())
|
|
259
|
+
hist_result = (counts, np.array(bin_edges))
|
|
260
|
+
|
|
261
|
+
track_obj = self._sns_prepare_xyhue(data, x, y, kwargs.get("hue"))
|
|
262
|
+
tracked_dict = {
|
|
263
|
+
"data": track_obj,
|
|
264
|
+
"args": (data, x, y),
|
|
265
|
+
"hist_result": hist_result,
|
|
266
|
+
}
|
|
267
|
+
self._track(track, id, method_name, tracked_dict, kwargs)
|
|
268
|
+
|
|
269
|
+
return sns_plot
|
|
270
|
+
|
|
271
|
+
@sns_copy_doc
|
|
272
|
+
def sns_kdeplot(
|
|
273
|
+
self,
|
|
274
|
+
data: Optional[pd.DataFrame] = None,
|
|
275
|
+
*,
|
|
276
|
+
x: Optional[str] = None,
|
|
277
|
+
y: Optional[str] = None,
|
|
278
|
+
xlim: Optional[tuple] = None,
|
|
279
|
+
ylim: Optional[tuple] = None,
|
|
280
|
+
track: bool = True,
|
|
281
|
+
id: Optional[str] = None,
|
|
282
|
+
**kwargs,
|
|
283
|
+
):
|
|
284
|
+
"""Create a kernel density estimate plot.
|
|
285
|
+
|
|
286
|
+
Parameters
|
|
287
|
+
----------
|
|
288
|
+
data : DataFrame, optional
|
|
289
|
+
Input data structure.
|
|
290
|
+
x : str, optional
|
|
291
|
+
Column name for x-axis values.
|
|
292
|
+
y : str, optional
|
|
293
|
+
Column name for y-axis values.
|
|
294
|
+
xlim : tuple, optional
|
|
295
|
+
Limits for x-axis KDE range.
|
|
296
|
+
ylim : tuple, optional
|
|
297
|
+
Limits for y-axis KDE range.
|
|
298
|
+
track : bool, default True
|
|
299
|
+
Enable data tracking for reproducibility.
|
|
300
|
+
id : str, optional
|
|
301
|
+
Unique identifier for this plot element.
|
|
302
|
+
**kwargs
|
|
303
|
+
Additional arguments passed to the KDE function.
|
|
304
|
+
|
|
305
|
+
See Also
|
|
306
|
+
--------
|
|
307
|
+
stx_kde : Array-based KDE plot.
|
|
308
|
+
sns_histplot : Histogram with optional KDE.
|
|
309
|
+
"""
|
|
310
|
+
hue_col = kwargs.pop("hue", None)
|
|
311
|
+
|
|
312
|
+
if hue_col:
|
|
313
|
+
hues = data[hue_col]
|
|
314
|
+
if x is not None:
|
|
315
|
+
lim = xlim
|
|
316
|
+
for hue in np.unique(hues):
|
|
317
|
+
_data = data.loc[hues == hue, x]
|
|
318
|
+
self.stx_kde(_data, xlim=lim, label=hue, id=hue, **kwargs)
|
|
319
|
+
if y is not None:
|
|
320
|
+
lim = ylim
|
|
321
|
+
for hue in np.unique(hues):
|
|
322
|
+
_data = data.loc[hues == hue, y]
|
|
323
|
+
self.stx_kde(_data, xlim=lim, label=hue, id=hue, **kwargs)
|
|
324
|
+
else:
|
|
325
|
+
if x is not None:
|
|
326
|
+
_data, lim = data[x], xlim
|
|
327
|
+
if y is not None:
|
|
328
|
+
_data, lim = data[y], ylim
|
|
329
|
+
self.stx_kde(_data, xlim=lim, **kwargs)
|
|
330
|
+
|
|
331
|
+
@sns_copy_doc
|
|
332
|
+
def sns_pairplot(
|
|
333
|
+
self,
|
|
334
|
+
*args,
|
|
335
|
+
track: bool = True,
|
|
336
|
+
id: Optional[str] = None,
|
|
337
|
+
**kwargs,
|
|
338
|
+
):
|
|
339
|
+
"""Create a grid of pairwise relationships in a dataset.
|
|
340
|
+
|
|
341
|
+
Parameters
|
|
342
|
+
----------
|
|
343
|
+
*args
|
|
344
|
+
Positional arguments passed to `seaborn.pairplot`.
|
|
345
|
+
track : bool, default True
|
|
346
|
+
Enable data tracking for reproducibility.
|
|
347
|
+
id : str, optional
|
|
348
|
+
Unique identifier for this plot element.
|
|
349
|
+
**kwargs
|
|
350
|
+
Additional arguments passed to `seaborn.pairplot`.
|
|
351
|
+
"""
|
|
352
|
+
self._sns_base("sns_pairplot", *args, track=track, id=id, **kwargs)
|
|
353
|
+
|
|
354
|
+
@sns_copy_doc
|
|
355
|
+
def sns_scatterplot(
|
|
356
|
+
self,
|
|
357
|
+
data: Optional[pd.DataFrame] = None,
|
|
358
|
+
*,
|
|
359
|
+
x: Optional[str] = None,
|
|
360
|
+
y: Optional[str] = None,
|
|
361
|
+
track: bool = True,
|
|
362
|
+
id: Optional[str] = None,
|
|
363
|
+
**kwargs,
|
|
364
|
+
):
|
|
365
|
+
"""Create a scatter plot with semantic mappings.
|
|
366
|
+
|
|
367
|
+
Parameters
|
|
368
|
+
----------
|
|
369
|
+
data : DataFrame, optional
|
|
370
|
+
Input data structure.
|
|
371
|
+
x : str, optional
|
|
372
|
+
Column name for x-axis values.
|
|
373
|
+
y : str, optional
|
|
374
|
+
Column name for y-axis values.
|
|
375
|
+
track : bool, default True
|
|
376
|
+
Enable data tracking for reproducibility.
|
|
377
|
+
id : str, optional
|
|
378
|
+
Unique identifier for this plot element.
|
|
379
|
+
**kwargs
|
|
380
|
+
Additional arguments passed to `seaborn.scatterplot`.
|
|
381
|
+
Common options: hue, size, style.
|
|
382
|
+
|
|
383
|
+
See Also
|
|
384
|
+
--------
|
|
385
|
+
stx_scatter : Array-based scatter plot.
|
|
386
|
+
"""
|
|
387
|
+
self._sns_base_xyhue(
|
|
388
|
+
"sns_scatterplot",
|
|
389
|
+
data=data,
|
|
390
|
+
x=x,
|
|
391
|
+
y=y,
|
|
392
|
+
track=track,
|
|
393
|
+
id=id,
|
|
394
|
+
**kwargs,
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
@sns_copy_doc
|
|
398
|
+
def sns_lineplot(
|
|
399
|
+
self,
|
|
400
|
+
data: Optional[pd.DataFrame] = None,
|
|
401
|
+
*,
|
|
402
|
+
x: Optional[str] = None,
|
|
403
|
+
y: Optional[str] = None,
|
|
404
|
+
track: bool = True,
|
|
405
|
+
id: Optional[str] = None,
|
|
406
|
+
**kwargs,
|
|
407
|
+
):
|
|
408
|
+
"""Create a line plot with semantic mappings.
|
|
409
|
+
|
|
410
|
+
Parameters
|
|
411
|
+
----------
|
|
412
|
+
data : DataFrame, optional
|
|
413
|
+
Input data structure.
|
|
414
|
+
x : str, optional
|
|
415
|
+
Column name for x-axis values.
|
|
416
|
+
y : str, optional
|
|
417
|
+
Column name for y-axis values.
|
|
418
|
+
track : bool, default True
|
|
419
|
+
Enable data tracking for reproducibility.
|
|
420
|
+
id : str, optional
|
|
421
|
+
Unique identifier for this plot element.
|
|
422
|
+
**kwargs
|
|
423
|
+
Additional arguments passed to `seaborn.lineplot`.
|
|
424
|
+
Common options: hue, size, style, estimator.
|
|
425
|
+
|
|
426
|
+
See Also
|
|
427
|
+
--------
|
|
428
|
+
stx_line : Array-based line plot.
|
|
429
|
+
stx_mean_std : Line with uncertainty shading.
|
|
430
|
+
"""
|
|
431
|
+
self._sns_base_xyhue(
|
|
432
|
+
"sns_lineplot",
|
|
433
|
+
data=data,
|
|
434
|
+
x=x,
|
|
435
|
+
y=y,
|
|
436
|
+
track=track,
|
|
437
|
+
id=id,
|
|
438
|
+
**kwargs,
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
@sns_copy_doc
|
|
442
|
+
def sns_swarmplot(
|
|
443
|
+
self,
|
|
444
|
+
data: Optional[pd.DataFrame] = None,
|
|
445
|
+
*,
|
|
446
|
+
x: Optional[str] = None,
|
|
447
|
+
y: Optional[str] = None,
|
|
448
|
+
track: bool = True,
|
|
449
|
+
id: Optional[str] = None,
|
|
450
|
+
**kwargs,
|
|
451
|
+
):
|
|
452
|
+
"""Create a categorical scatter plot with non-overlapping points.
|
|
453
|
+
|
|
454
|
+
Parameters
|
|
455
|
+
----------
|
|
456
|
+
data : DataFrame, optional
|
|
457
|
+
Input data structure.
|
|
458
|
+
x : str, optional
|
|
459
|
+
Column name for x-axis grouping.
|
|
460
|
+
y : str, optional
|
|
461
|
+
Column name for y-axis values.
|
|
462
|
+
track : bool, default True
|
|
463
|
+
Enable data tracking for reproducibility.
|
|
464
|
+
id : str, optional
|
|
465
|
+
Unique identifier for this plot element.
|
|
466
|
+
**kwargs
|
|
467
|
+
Additional arguments passed to `seaborn.swarmplot`.
|
|
468
|
+
|
|
469
|
+
See Also
|
|
470
|
+
--------
|
|
471
|
+
sns_stripplot : Jittered categorical scatter.
|
|
472
|
+
sns_boxplot : Box plot for distributions.
|
|
473
|
+
"""
|
|
474
|
+
self._sns_base_xyhue(
|
|
475
|
+
"sns_swarmplot", data=data, x=x, y=y, track=track, id=id, **kwargs
|
|
476
|
+
)
|
|
477
|
+
|
|
478
|
+
@sns_copy_doc
|
|
479
|
+
def sns_stripplot(
|
|
480
|
+
self,
|
|
481
|
+
data: Optional[pd.DataFrame] = None,
|
|
482
|
+
*,
|
|
483
|
+
x: Optional[str] = None,
|
|
484
|
+
y: Optional[str] = None,
|
|
485
|
+
track: bool = True,
|
|
486
|
+
id: Optional[str] = None,
|
|
487
|
+
**kwargs,
|
|
488
|
+
):
|
|
489
|
+
"""Create a categorical scatter plot with jittered points.
|
|
490
|
+
|
|
491
|
+
Parameters
|
|
492
|
+
----------
|
|
493
|
+
data : DataFrame, optional
|
|
494
|
+
Input data structure.
|
|
495
|
+
x : str, optional
|
|
496
|
+
Column name for x-axis grouping.
|
|
497
|
+
y : str, optional
|
|
498
|
+
Column name for y-axis values.
|
|
499
|
+
track : bool, default True
|
|
500
|
+
Enable data tracking for reproducibility.
|
|
501
|
+
id : str, optional
|
|
502
|
+
Unique identifier for this plot element.
|
|
503
|
+
**kwargs
|
|
504
|
+
Additional arguments passed to `seaborn.stripplot`.
|
|
505
|
+
|
|
506
|
+
See Also
|
|
507
|
+
--------
|
|
508
|
+
sns_swarmplot : Non-overlapping categorical scatter.
|
|
509
|
+
sns_boxplot : Often combined with stripplot.
|
|
510
|
+
"""
|
|
511
|
+
self._sns_base_xyhue(
|
|
512
|
+
"sns_stripplot", data=data, x=x, y=y, track=track, id=id, **kwargs
|
|
513
|
+
)
|
|
514
|
+
|
|
515
|
+
@sns_copy_doc
|
|
516
|
+
def sns_violinplot(
|
|
517
|
+
self,
|
|
518
|
+
data: Optional[pd.DataFrame] = None,
|
|
519
|
+
*,
|
|
520
|
+
x: Optional[str] = None,
|
|
521
|
+
y: Optional[str] = None,
|
|
522
|
+
half: bool = False,
|
|
523
|
+
track: bool = True,
|
|
524
|
+
id: Optional[str] = None,
|
|
525
|
+
**kwargs,
|
|
526
|
+
):
|
|
527
|
+
"""Create a violin plot combining box plot with kernel density.
|
|
528
|
+
|
|
529
|
+
Parameters
|
|
530
|
+
----------
|
|
531
|
+
data : DataFrame, optional
|
|
532
|
+
Input data structure.
|
|
533
|
+
x : str, optional
|
|
534
|
+
Column name for x-axis grouping.
|
|
535
|
+
y : str, optional
|
|
536
|
+
Column name for y-axis values.
|
|
537
|
+
half : bool, default False
|
|
538
|
+
If True, draw half-violins (useful for paired comparisons).
|
|
539
|
+
track : bool, default True
|
|
540
|
+
Enable data tracking for reproducibility.
|
|
541
|
+
id : str, optional
|
|
542
|
+
Unique identifier for this plot element.
|
|
543
|
+
**kwargs
|
|
544
|
+
Additional arguments passed to `seaborn.violinplot`.
|
|
545
|
+
|
|
546
|
+
See Also
|
|
547
|
+
--------
|
|
548
|
+
stx_violin : Array-based violin plot.
|
|
549
|
+
sns_boxplot : Box plot alternative.
|
|
550
|
+
"""
|
|
551
|
+
if half:
|
|
552
|
+
with self._no_tracking():
|
|
553
|
+
self._axis_mpl = self._get_ax_module().plot_half_violin(
|
|
554
|
+
self._axis_mpl, data=data, x=x, y=y, **kwargs
|
|
555
|
+
)
|
|
556
|
+
else:
|
|
557
|
+
self._sns_base_xyhue(
|
|
558
|
+
"sns_violinplot",
|
|
559
|
+
data=data,
|
|
560
|
+
x=x,
|
|
561
|
+
y=y,
|
|
562
|
+
track=track,
|
|
563
|
+
id=id,
|
|
564
|
+
**kwargs,
|
|
565
|
+
)
|
|
566
|
+
|
|
567
|
+
track_obj = self._sns_prepare_xyhue(data, x, y, kwargs.get("hue"))
|
|
568
|
+
self._track(track, id, "sns_violinplot", track_obj, kwargs)
|
|
569
|
+
|
|
570
|
+
return self._axis_mpl
|
|
571
|
+
|
|
572
|
+
@sns_copy_doc
|
|
573
|
+
def sns_jointplot(
|
|
574
|
+
self,
|
|
575
|
+
*args,
|
|
576
|
+
track: bool = True,
|
|
577
|
+
id: Optional[str] = None,
|
|
578
|
+
**kwargs,
|
|
579
|
+
):
|
|
580
|
+
"""Create a figure with joint and marginal distributions.
|
|
581
|
+
|
|
582
|
+
Parameters
|
|
583
|
+
----------
|
|
584
|
+
*args
|
|
585
|
+
Positional arguments passed to `seaborn.jointplot`.
|
|
586
|
+
track : bool, default True
|
|
587
|
+
Enable data tracking for reproducibility.
|
|
588
|
+
id : str, optional
|
|
589
|
+
Unique identifier for this plot element.
|
|
590
|
+
**kwargs
|
|
591
|
+
Additional arguments passed to `seaborn.jointplot`.
|
|
592
|
+
|
|
593
|
+
See Also
|
|
594
|
+
--------
|
|
595
|
+
stx_scatter_hist : Array-based scatter with marginal histograms.
|
|
596
|
+
"""
|
|
597
|
+
self._sns_base("sns_jointplot", *args, track=track, id=id, **kwargs)
|
|
598
|
+
|
|
599
|
+
|
|
600
|
+
# EOF
|
|
@@ -1,15 +1,89 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
-
# Timestamp: "2025-
|
|
4
|
-
# File: /home/ywatanabe/proj/
|
|
5
|
-
|
|
3
|
+
# Timestamp: "2025-12-13 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex-code/src/scitex/plt/_subplots/_AxisWrapperMixins/__init__.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
AxisWrapper Mixins - Modular plotting API for SciTeX.
|
|
8
|
+
|
|
9
|
+
API Layers
|
|
10
|
+
==========
|
|
11
|
+
|
|
12
|
+
SciTeX provides three distinct API layers for plotting, each with different
|
|
13
|
+
purposes and trade-offs:
|
|
14
|
+
|
|
15
|
+
stx_* (SciTeX Canonical)
|
|
16
|
+
------------------------
|
|
17
|
+
- Input: ArrayLike / List / ndarray
|
|
18
|
+
- Output: (Axes, tracked_df, meta)
|
|
19
|
+
- Purpose: publication / reproducibility
|
|
20
|
+
- Features:
|
|
21
|
+
* Full tracking and metadata support
|
|
22
|
+
* Output connects to .pltz / .figz formats
|
|
23
|
+
* Automatic styling according to SciTeX style
|
|
24
|
+
* Primary API - recommended for final figures
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
ax.stx_bar(x, height)
|
|
28
|
+
ax.stx_scatter(x, y, label="Data")
|
|
29
|
+
ax.stx_kde(data)
|
|
30
|
+
|
|
31
|
+
mpl_* (Matplotlib Compatibility)
|
|
32
|
+
--------------------------------
|
|
33
|
+
- Input: Same as matplotlib
|
|
34
|
+
- Output: matplotlib artists
|
|
35
|
+
- Purpose: compatibility / low-level control / escape hatch
|
|
36
|
+
- Features:
|
|
37
|
+
* No tracking, no scitex processing
|
|
38
|
+
* Direct matplotlib API access
|
|
39
|
+
* Use for unsupported operations or migration
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
ax.mpl_plot(x, y)
|
|
43
|
+
ax.mpl_scatter(x, y)
|
|
44
|
+
ax.mpl_raw("some_method", *args) # Call any matplotlib method
|
|
45
|
+
|
|
46
|
+
sns_* (Seaborn / DataFrame-Centric)
|
|
47
|
+
-----------------------------------
|
|
48
|
+
- Input: DataFrame + column names (data=, x=, y=, hue=)
|
|
49
|
+
- Output: Axes (+ summarized df)
|
|
50
|
+
- Purpose: exploratory / grouped statistics
|
|
51
|
+
- Features:
|
|
52
|
+
* DataFrame-centric interface
|
|
53
|
+
* Statistical summaries and grouping
|
|
54
|
+
* Familiar seaborn UX
|
|
55
|
+
|
|
56
|
+
Examples:
|
|
57
|
+
ax.sns_boxplot(data=df, x="group", y="value")
|
|
58
|
+
ax.sns_histplot(data=df, x="measurement", hue="category")
|
|
59
|
+
|
|
60
|
+
Choosing an API Layer
|
|
61
|
+
=====================
|
|
62
|
+
|
|
63
|
+
Use stx_*:
|
|
64
|
+
- For publication-ready figures
|
|
65
|
+
- When you need reproducibility and tracking
|
|
66
|
+
- As your default choice
|
|
67
|
+
|
|
68
|
+
Use mpl_*:
|
|
69
|
+
- For low-level matplotlib control
|
|
70
|
+
- When migrating existing matplotlib code
|
|
71
|
+
- For matplotlib features not yet wrapped
|
|
72
|
+
|
|
73
|
+
Use sns_*:
|
|
74
|
+
- For exploratory data analysis
|
|
75
|
+
- When input is a DataFrame
|
|
76
|
+
- For statistical visualization with grouping
|
|
77
|
+
"""
|
|
78
|
+
|
|
6
79
|
import os
|
|
7
80
|
|
|
8
|
-
__FILE__ =
|
|
81
|
+
__FILE__ = __file__
|
|
9
82
|
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
-
|
|
83
|
+
|
|
11
84
|
from ._AdjustmentMixin import AdjustmentMixin
|
|
12
85
|
from ._MatplotlibPlotMixin import MatplotlibPlotMixin
|
|
86
|
+
from ._RawMatplotlibMixin import RawMatplotlibMixin, MPL_METHODS
|
|
13
87
|
from ._SeabornMixin import SeabornMixin
|
|
14
88
|
from ._TrackingMixin import TrackingMixin
|
|
15
89
|
from ._UnitAwareMixin import UnitAwareMixin
|