scitex 2.0.0__py2.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 +73 -0
- scitex/__main__.py +89 -0
- scitex/__version__.py +14 -0
- scitex/_sh.py +59 -0
- scitex/ai/_LearningCurveLogger.py +583 -0
- scitex/ai/__Classifiers.py +101 -0
- scitex/ai/__init__.py +55 -0
- scitex/ai/_gen_ai/_Anthropic.py +173 -0
- scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
- scitex/ai/_gen_ai/_DeepSeek.py +175 -0
- scitex/ai/_gen_ai/_Google.py +161 -0
- scitex/ai/_gen_ai/_Groq.py +97 -0
- scitex/ai/_gen_ai/_Llama.py +142 -0
- scitex/ai/_gen_ai/_OpenAI.py +230 -0
- scitex/ai/_gen_ai/_PARAMS.py +565 -0
- scitex/ai/_gen_ai/_Perplexity.py +191 -0
- scitex/ai/_gen_ai/__init__.py +32 -0
- scitex/ai/_gen_ai/_calc_cost.py +78 -0
- scitex/ai/_gen_ai/_format_output_func.py +183 -0
- scitex/ai/_gen_ai/_genai_factory.py +71 -0
- scitex/ai/act/__init__.py +8 -0
- scitex/ai/act/_define.py +11 -0
- scitex/ai/classification/__init__.py +7 -0
- scitex/ai/classification/classification_reporter.py +1137 -0
- scitex/ai/classification/classifier_server.py +131 -0
- scitex/ai/classification/classifiers.py +101 -0
- scitex/ai/classification_reporter.py +1161 -0
- scitex/ai/classifier_server.py +131 -0
- scitex/ai/clustering/__init__.py +11 -0
- scitex/ai/clustering/_pca.py +115 -0
- scitex/ai/clustering/_umap.py +376 -0
- scitex/ai/early_stopping.py +149 -0
- scitex/ai/feature_extraction/__init__.py +56 -0
- scitex/ai/feature_extraction/vit.py +148 -0
- scitex/ai/genai/__init__.py +277 -0
- scitex/ai/genai/anthropic.py +177 -0
- scitex/ai/genai/anthropic_provider.py +320 -0
- scitex/ai/genai/anthropic_refactored.py +109 -0
- scitex/ai/genai/auth_manager.py +200 -0
- scitex/ai/genai/base_genai.py +336 -0
- scitex/ai/genai/base_provider.py +291 -0
- scitex/ai/genai/calc_cost.py +78 -0
- scitex/ai/genai/chat_history.py +307 -0
- scitex/ai/genai/cost_tracker.py +276 -0
- scitex/ai/genai/deepseek.py +188 -0
- scitex/ai/genai/deepseek_provider.py +251 -0
- scitex/ai/genai/format_output_func.py +183 -0
- scitex/ai/genai/genai_factory.py +71 -0
- scitex/ai/genai/google.py +169 -0
- scitex/ai/genai/google_provider.py +228 -0
- scitex/ai/genai/groq.py +104 -0
- scitex/ai/genai/groq_provider.py +248 -0
- scitex/ai/genai/image_processor.py +250 -0
- scitex/ai/genai/llama.py +155 -0
- scitex/ai/genai/llama_provider.py +214 -0
- scitex/ai/genai/mock_provider.py +127 -0
- scitex/ai/genai/model_registry.py +304 -0
- scitex/ai/genai/openai.py +230 -0
- scitex/ai/genai/openai_provider.py +293 -0
- scitex/ai/genai/params.py +565 -0
- scitex/ai/genai/perplexity.py +202 -0
- scitex/ai/genai/perplexity_provider.py +205 -0
- scitex/ai/genai/provider_base.py +302 -0
- scitex/ai/genai/provider_factory.py +370 -0
- scitex/ai/genai/response_handler.py +235 -0
- scitex/ai/layer/_Pass.py +21 -0
- scitex/ai/layer/__init__.py +10 -0
- scitex/ai/layer/_switch.py +8 -0
- scitex/ai/loss/_L1L2Losses.py +34 -0
- scitex/ai/loss/__init__.py +12 -0
- scitex/ai/loss/multi_task_loss.py +47 -0
- scitex/ai/metrics/__init__.py +9 -0
- scitex/ai/metrics/_bACC.py +51 -0
- scitex/ai/metrics/silhoute_score_block.py +496 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ai/optim/__init__.py +13 -0
- scitex/ai/optim/_get_set.py +31 -0
- scitex/ai/optim/_optimizers.py +71 -0
- scitex/ai/plt/__init__.py +21 -0
- scitex/ai/plt/_conf_mat.py +592 -0
- scitex/ai/plt/_learning_curve.py +194 -0
- scitex/ai/plt/_optuna_study.py +111 -0
- scitex/ai/plt/aucs/__init__.py +2 -0
- scitex/ai/plt/aucs/example.py +60 -0
- scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
- scitex/ai/plt/aucs/roc_auc.py +246 -0
- scitex/ai/sampling/undersample.py +29 -0
- scitex/ai/sk/__init__.py +11 -0
- scitex/ai/sk/_clf.py +58 -0
- scitex/ai/sk/_to_sktime.py +100 -0
- scitex/ai/sklearn/__init__.py +26 -0
- scitex/ai/sklearn/clf.py +58 -0
- scitex/ai/sklearn/to_sktime.py +100 -0
- scitex/ai/training/__init__.py +7 -0
- scitex/ai/training/early_stopping.py +150 -0
- scitex/ai/training/learning_curve_logger.py +555 -0
- scitex/ai/utils/__init__.py +22 -0
- scitex/ai/utils/_check_params.py +50 -0
- scitex/ai/utils/_default_dataset.py +46 -0
- scitex/ai/utils/_format_samples_for_sktime.py +26 -0
- scitex/ai/utils/_label_encoder.py +134 -0
- scitex/ai/utils/_merge_labels.py +22 -0
- scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ai/utils/_under_sample.py +51 -0
- scitex/ai/utils/_verify_n_gpus.py +16 -0
- scitex/ai/utils/grid_search.py +148 -0
- scitex/context/__init__.py +9 -0
- scitex/context/_suppress_output.py +38 -0
- scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
- scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
- scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
- scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
- scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
- scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
- scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
- scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
- scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
- scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
- scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
- scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
- scitex/db/_BaseMixins/__init__.py +30 -0
- scitex/db/_PostgreSQL.py +126 -0
- scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
- scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
- scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
- scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
- scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
- scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
- scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
- scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
- scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
- scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
- scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
- scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
- scitex/db/_PostgreSQLMixins/__init__.py +34 -0
- scitex/db/_SQLite3.py +2136 -0
- scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
- scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
- scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
- scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
- scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
- scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
- scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
- scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
- scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
- scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
- scitex/db/_SQLite3Mixins/__init__.py +30 -0
- scitex/db/__init__.py +14 -0
- scitex/db/_delete_duplicates.py +397 -0
- scitex/db/_inspect.py +163 -0
- scitex/decorators/__init__.py +54 -0
- scitex/decorators/_auto_order.py +172 -0
- scitex/decorators/_batch_fn.py +127 -0
- scitex/decorators/_cache_disk.py +32 -0
- scitex/decorators/_cache_mem.py +12 -0
- scitex/decorators/_combined.py +98 -0
- scitex/decorators/_converters.py +282 -0
- scitex/decorators/_deprecated.py +26 -0
- scitex/decorators/_not_implemented.py +30 -0
- scitex/decorators/_numpy_fn.py +86 -0
- scitex/decorators/_pandas_fn.py +121 -0
- scitex/decorators/_preserve_doc.py +19 -0
- scitex/decorators/_signal_fn.py +95 -0
- scitex/decorators/_timeout.py +55 -0
- scitex/decorators/_torch_fn.py +136 -0
- scitex/decorators/_wrap.py +39 -0
- scitex/decorators/_xarray_fn.py +88 -0
- scitex/dev/__init__.py +15 -0
- scitex/dev/_analyze_code_flow.py +284 -0
- scitex/dev/_reload.py +59 -0
- scitex/dict/_DotDict.py +442 -0
- scitex/dict/__init__.py +18 -0
- scitex/dict/_listed_dict.py +42 -0
- scitex/dict/_pop_keys.py +36 -0
- scitex/dict/_replace.py +13 -0
- scitex/dict/_safe_merge.py +62 -0
- scitex/dict/_to_str.py +32 -0
- scitex/dsp/__init__.py +72 -0
- scitex/dsp/_crop.py +122 -0
- scitex/dsp/_demo_sig.py +331 -0
- scitex/dsp/_detect_ripples.py +212 -0
- scitex/dsp/_ensure_3d.py +18 -0
- scitex/dsp/_hilbert.py +78 -0
- scitex/dsp/_listen.py +702 -0
- scitex/dsp/_misc.py +30 -0
- scitex/dsp/_mne.py +32 -0
- scitex/dsp/_modulation_index.py +79 -0
- scitex/dsp/_pac.py +319 -0
- scitex/dsp/_psd.py +102 -0
- scitex/dsp/_resample.py +65 -0
- scitex/dsp/_time.py +36 -0
- scitex/dsp/_transform.py +68 -0
- scitex/dsp/_wavelet.py +212 -0
- scitex/dsp/add_noise.py +111 -0
- scitex/dsp/example.py +253 -0
- scitex/dsp/filt.py +155 -0
- scitex/dsp/norm.py +18 -0
- scitex/dsp/params.py +51 -0
- scitex/dsp/reference.py +43 -0
- scitex/dsp/template.py +25 -0
- scitex/dsp/utils/__init__.py +15 -0
- scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
- scitex/dsp/utils/_ensure_3d.py +18 -0
- scitex/dsp/utils/_ensure_even_len.py +10 -0
- scitex/dsp/utils/_zero_pad.py +48 -0
- scitex/dsp/utils/filter.py +408 -0
- scitex/dsp/utils/pac.py +177 -0
- scitex/dt/__init__.py +8 -0
- scitex/dt/_linspace.py +130 -0
- scitex/etc/__init__.py +15 -0
- scitex/etc/wait_key.py +34 -0
- scitex/gen/_DimHandler.py +196 -0
- scitex/gen/_TimeStamper.py +244 -0
- scitex/gen/__init__.py +95 -0
- scitex/gen/_alternate_kwarg.py +13 -0
- scitex/gen/_cache.py +11 -0
- scitex/gen/_check_host.py +34 -0
- scitex/gen/_ci.py +12 -0
- scitex/gen/_close.py +222 -0
- scitex/gen/_embed.py +78 -0
- scitex/gen/_inspect_module.py +257 -0
- scitex/gen/_is_ipython.py +12 -0
- scitex/gen/_less.py +48 -0
- scitex/gen/_list_packages.py +139 -0
- scitex/gen/_mat2py.py +88 -0
- scitex/gen/_norm.py +170 -0
- scitex/gen/_paste.py +18 -0
- scitex/gen/_print_config.py +84 -0
- scitex/gen/_shell.py +48 -0
- scitex/gen/_src.py +111 -0
- scitex/gen/_start.py +451 -0
- scitex/gen/_symlink.py +55 -0
- scitex/gen/_symlog.py +27 -0
- scitex/gen/_tee.py +238 -0
- scitex/gen/_title2path.py +60 -0
- scitex/gen/_title_case.py +88 -0
- scitex/gen/_to_even.py +84 -0
- scitex/gen/_to_odd.py +34 -0
- scitex/gen/_to_rank.py +39 -0
- scitex/gen/_transpose.py +37 -0
- scitex/gen/_type.py +78 -0
- scitex/gen/_var_info.py +73 -0
- scitex/gen/_wrap.py +17 -0
- scitex/gen/_xml2dict.py +76 -0
- scitex/gen/misc.py +730 -0
- scitex/gen/path.py +0 -0
- scitex/general/__init__.py +5 -0
- scitex/gists/_SigMacro_processFigure_S.py +128 -0
- scitex/gists/_SigMacro_toBlue.py +172 -0
- scitex/gists/__init__.py +12 -0
- scitex/io/_H5Explorer.py +292 -0
- scitex/io/__init__.py +82 -0
- scitex/io/_cache.py +101 -0
- scitex/io/_flush.py +24 -0
- scitex/io/_glob.py +103 -0
- scitex/io/_json2md.py +113 -0
- scitex/io/_load.py +168 -0
- scitex/io/_load_configs.py +146 -0
- scitex/io/_load_modules/__init__.py +38 -0
- scitex/io/_load_modules/_catboost.py +66 -0
- scitex/io/_load_modules/_con.py +20 -0
- scitex/io/_load_modules/_db.py +24 -0
- scitex/io/_load_modules/_docx.py +42 -0
- scitex/io/_load_modules/_eeg.py +110 -0
- scitex/io/_load_modules/_hdf5.py +196 -0
- scitex/io/_load_modules/_image.py +19 -0
- scitex/io/_load_modules/_joblib.py +19 -0
- scitex/io/_load_modules/_json.py +18 -0
- scitex/io/_load_modules/_markdown.py +103 -0
- scitex/io/_load_modules/_matlab.py +37 -0
- scitex/io/_load_modules/_numpy.py +39 -0
- scitex/io/_load_modules/_optuna.py +155 -0
- scitex/io/_load_modules/_pandas.py +69 -0
- scitex/io/_load_modules/_pdf.py +31 -0
- scitex/io/_load_modules/_pickle.py +24 -0
- scitex/io/_load_modules/_torch.py +16 -0
- scitex/io/_load_modules/_txt.py +126 -0
- scitex/io/_load_modules/_xml.py +49 -0
- scitex/io/_load_modules/_yaml.py +23 -0
- scitex/io/_mv_to_tmp.py +19 -0
- scitex/io/_path.py +286 -0
- scitex/io/_reload.py +78 -0
- scitex/io/_save.py +539 -0
- scitex/io/_save_modules/__init__.py +66 -0
- scitex/io/_save_modules/_catboost.py +22 -0
- scitex/io/_save_modules/_csv.py +89 -0
- scitex/io/_save_modules/_excel.py +49 -0
- scitex/io/_save_modules/_hdf5.py +249 -0
- scitex/io/_save_modules/_html.py +48 -0
- scitex/io/_save_modules/_image.py +140 -0
- scitex/io/_save_modules/_joblib.py +25 -0
- scitex/io/_save_modules/_json.py +25 -0
- scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
- scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
- scitex/io/_save_modules/_matlab.py +24 -0
- scitex/io/_save_modules/_mp4.py +29 -0
- scitex/io/_save_modules/_numpy.py +57 -0
- scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
- scitex/io/_save_modules/_pickle.py +45 -0
- scitex/io/_save_modules/_plotly.py +27 -0
- scitex/io/_save_modules/_text.py +23 -0
- scitex/io/_save_modules/_torch.py +26 -0
- scitex/io/_save_modules/_yaml.py +29 -0
- scitex/life/__init__.py +10 -0
- scitex/life/_monitor_rain.py +49 -0
- scitex/linalg/__init__.py +17 -0
- scitex/linalg/_distance.py +63 -0
- scitex/linalg/_geometric_median.py +64 -0
- scitex/linalg/_misc.py +73 -0
- scitex/nn/_AxiswiseDropout.py +27 -0
- scitex/nn/_BNet.py +126 -0
- scitex/nn/_BNet_Res.py +164 -0
- scitex/nn/_ChannelGainChanger.py +44 -0
- scitex/nn/_DropoutChannels.py +50 -0
- scitex/nn/_Filters.py +489 -0
- scitex/nn/_FreqGainChanger.py +110 -0
- scitex/nn/_GaussianFilter.py +48 -0
- scitex/nn/_Hilbert.py +111 -0
- scitex/nn/_MNet_1000.py +157 -0
- scitex/nn/_ModulationIndex.py +221 -0
- scitex/nn/_PAC.py +414 -0
- scitex/nn/_PSD.py +40 -0
- scitex/nn/_ResNet1D.py +120 -0
- scitex/nn/_SpatialAttention.py +25 -0
- scitex/nn/_Spectrogram.py +161 -0
- scitex/nn/_SwapChannels.py +50 -0
- scitex/nn/_TransposeLayer.py +19 -0
- scitex/nn/_Wavelet.py +183 -0
- scitex/nn/__init__.py +63 -0
- scitex/os/__init__.py +8 -0
- scitex/os/_mv.py +50 -0
- scitex/parallel/__init__.py +8 -0
- scitex/parallel/_run.py +151 -0
- scitex/path/__init__.py +33 -0
- scitex/path/_clean.py +52 -0
- scitex/path/_find.py +108 -0
- scitex/path/_get_module_path.py +51 -0
- scitex/path/_get_spath.py +35 -0
- scitex/path/_getsize.py +18 -0
- scitex/path/_increment_version.py +87 -0
- scitex/path/_mk_spath.py +51 -0
- scitex/path/_path.py +19 -0
- scitex/path/_split.py +23 -0
- scitex/path/_this_path.py +19 -0
- scitex/path/_version.py +101 -0
- scitex/pd/__init__.py +41 -0
- scitex/pd/_find_indi.py +126 -0
- scitex/pd/_find_pval.py +113 -0
- scitex/pd/_force_df.py +154 -0
- scitex/pd/_from_xyz.py +71 -0
- scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
- scitex/pd/_melt_cols.py +81 -0
- scitex/pd/_merge_columns.py +221 -0
- scitex/pd/_mv.py +63 -0
- scitex/pd/_replace.py +62 -0
- scitex/pd/_round.py +93 -0
- scitex/pd/_slice.py +63 -0
- scitex/pd/_sort.py +91 -0
- scitex/pd/_to_numeric.py +53 -0
- scitex/pd/_to_xy.py +59 -0
- scitex/pd/_to_xyz.py +110 -0
- scitex/plt/__init__.py +36 -0
- scitex/plt/_subplots/_AxesWrapper.py +182 -0
- scitex/plt/_subplots/_AxisWrapper.py +249 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
- scitex/plt/_subplots/_FigWrapper.py +226 -0
- scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
- scitex/plt/_subplots/__init__.py +111 -0
- scitex/plt/_subplots/_export_as_csv.py +232 -0
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
- scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
- scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
- scitex/plt/_tpl.py +28 -0
- scitex/plt/ax/__init__.py +114 -0
- scitex/plt/ax/_plot/__init__.py +53 -0
- scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
- scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
- scitex/plt/ax/_plot/_plot_cube.py +57 -0
- scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
- scitex/plt/ax/_plot/_plot_fillv.py +55 -0
- scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
- scitex/plt/ax/_plot/_plot_image.py +94 -0
- scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
- scitex/plt/ax/_plot/_plot_raster.py +172 -0
- scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
- scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
- scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
- scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
- scitex/plt/ax/_plot/_plot_violin.py +343 -0
- scitex/plt/ax/_style/__init__.py +38 -0
- scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
- scitex/plt/ax/_style/_add_panel.py +92 -0
- scitex/plt/ax/_style/_extend.py +64 -0
- scitex/plt/ax/_style/_force_aspect.py +37 -0
- scitex/plt/ax/_style/_format_label.py +23 -0
- scitex/plt/ax/_style/_hide_spines.py +84 -0
- scitex/plt/ax/_style/_map_ticks.py +182 -0
- scitex/plt/ax/_style/_rotate_labels.py +215 -0
- scitex/plt/ax/_style/_sci_note.py +279 -0
- scitex/plt/ax/_style/_set_log_scale.py +299 -0
- scitex/plt/ax/_style/_set_meta.py +261 -0
- scitex/plt/ax/_style/_set_n_ticks.py +37 -0
- scitex/plt/ax/_style/_set_size.py +16 -0
- scitex/plt/ax/_style/_set_supxyt.py +116 -0
- scitex/plt/ax/_style/_set_ticks.py +276 -0
- scitex/plt/ax/_style/_set_xyt.py +121 -0
- scitex/plt/ax/_style/_share_axes.py +264 -0
- scitex/plt/ax/_style/_shift.py +139 -0
- scitex/plt/ax/_style/_show_spines.py +333 -0
- scitex/plt/color/_PARAMS.py +70 -0
- scitex/plt/color/__init__.py +52 -0
- scitex/plt/color/_add_hue_col.py +41 -0
- scitex/plt/color/_colors.py +205 -0
- scitex/plt/color/_get_colors_from_cmap.py +134 -0
- scitex/plt/color/_interpolate.py +29 -0
- scitex/plt/color/_vizualize_colors.py +54 -0
- scitex/plt/utils/__init__.py +44 -0
- scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
- scitex/plt/utils/_calc_nice_ticks.py +101 -0
- scitex/plt/utils/_close.py +68 -0
- scitex/plt/utils/_colorbar.py +96 -0
- scitex/plt/utils/_configure_mpl.py +295 -0
- scitex/plt/utils/_histogram_utils.py +132 -0
- scitex/plt/utils/_im2grid.py +70 -0
- scitex/plt/utils/_is_valid_axis.py +78 -0
- scitex/plt/utils/_mk_colorbar.py +65 -0
- scitex/plt/utils/_mk_patches.py +26 -0
- scitex/plt/utils/_scientific_captions.py +638 -0
- scitex/plt/utils/_scitex_config.py +223 -0
- scitex/reproduce/__init__.py +14 -0
- scitex/reproduce/_fix_seeds.py +45 -0
- scitex/reproduce/_gen_ID.py +55 -0
- scitex/reproduce/_gen_timestamp.py +35 -0
- scitex/res/__init__.py +5 -0
- scitex/resource/__init__.py +13 -0
- scitex/resource/_get_processor_usages.py +281 -0
- scitex/resource/_get_specs.py +280 -0
- scitex/resource/_log_processor_usages.py +190 -0
- scitex/resource/_utils/__init__.py +31 -0
- scitex/resource/_utils/_get_env_info.py +481 -0
- scitex/resource/limit_ram.py +33 -0
- scitex/scholar/__init__.py +24 -0
- scitex/scholar/_local_search.py +454 -0
- scitex/scholar/_paper.py +244 -0
- scitex/scholar/_pdf_downloader.py +325 -0
- scitex/scholar/_search.py +393 -0
- scitex/scholar/_vector_search.py +370 -0
- scitex/scholar/_web_sources.py +457 -0
- scitex/stats/__init__.py +31 -0
- scitex/stats/_calc_partial_corr.py +17 -0
- scitex/stats/_corr_test_multi.py +94 -0
- scitex/stats/_corr_test_wrapper.py +115 -0
- scitex/stats/_describe_wrapper.py +90 -0
- scitex/stats/_multiple_corrections.py +63 -0
- scitex/stats/_nan_stats.py +93 -0
- scitex/stats/_p2stars.py +116 -0
- scitex/stats/_p2stars_wrapper.py +56 -0
- scitex/stats/_statistical_tests.py +73 -0
- scitex/stats/desc/__init__.py +40 -0
- scitex/stats/desc/_describe.py +189 -0
- scitex/stats/desc/_nan.py +289 -0
- scitex/stats/desc/_real.py +94 -0
- scitex/stats/multiple/__init__.py +14 -0
- scitex/stats/multiple/_bonferroni_correction.py +72 -0
- scitex/stats/multiple/_fdr_correction.py +400 -0
- scitex/stats/multiple/_multicompair.py +28 -0
- scitex/stats/tests/__corr_test.py +277 -0
- scitex/stats/tests/__corr_test_multi.py +343 -0
- scitex/stats/tests/__corr_test_single.py +277 -0
- scitex/stats/tests/__init__.py +22 -0
- scitex/stats/tests/_brunner_munzel_test.py +192 -0
- scitex/stats/tests/_nocorrelation_test.py +28 -0
- scitex/stats/tests/_smirnov_grubbs.py +98 -0
- scitex/str/__init__.py +113 -0
- scitex/str/_clean_path.py +75 -0
- scitex/str/_color_text.py +52 -0
- scitex/str/_decapitalize.py +58 -0
- scitex/str/_factor_out_digits.py +281 -0
- scitex/str/_format_plot_text.py +498 -0
- scitex/str/_grep.py +48 -0
- scitex/str/_latex.py +155 -0
- scitex/str/_latex_fallback.py +471 -0
- scitex/str/_mask_api.py +39 -0
- scitex/str/_mask_api_key.py +8 -0
- scitex/str/_parse.py +158 -0
- scitex/str/_print_block.py +47 -0
- scitex/str/_print_debug.py +68 -0
- scitex/str/_printc.py +62 -0
- scitex/str/_readable_bytes.py +38 -0
- scitex/str/_remove_ansi.py +23 -0
- scitex/str/_replace.py +134 -0
- scitex/str/_search.py +125 -0
- scitex/str/_squeeze_space.py +36 -0
- scitex/tex/__init__.py +10 -0
- scitex/tex/_preview.py +103 -0
- scitex/tex/_to_vec.py +116 -0
- scitex/torch/__init__.py +18 -0
- scitex/torch/_apply_to.py +34 -0
- scitex/torch/_nan_funcs.py +77 -0
- scitex/types/_ArrayLike.py +44 -0
- scitex/types/_ColorLike.py +21 -0
- scitex/types/__init__.py +14 -0
- scitex/types/_is_listed_X.py +70 -0
- scitex/utils/__init__.py +22 -0
- scitex/utils/_compress_hdf5.py +116 -0
- scitex/utils/_email.py +120 -0
- scitex/utils/_grid.py +148 -0
- scitex/utils/_notify.py +247 -0
- scitex/utils/_search.py +121 -0
- scitex/web/__init__.py +38 -0
- scitex/web/_search_pubmed.py +438 -0
- scitex/web/_summarize_url.py +158 -0
- scitex-2.0.0.dist-info/METADATA +307 -0
- scitex-2.0.0.dist-info/RECORD +572 -0
- scitex-2.0.0.dist-info/WHEEL +6 -0
- scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
- scitex-2.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 16:26:18 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
from functools import wraps
|
|
13
|
+
|
|
14
|
+
import scitex
|
|
15
|
+
import numpy as np
|
|
16
|
+
import pandas as pd
|
|
17
|
+
import seaborn as sns
|
|
18
|
+
|
|
19
|
+
from ....plt import ax as ax_module
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def sns_copy_doc(func):
|
|
23
|
+
@wraps(func)
|
|
24
|
+
def wrapper(self, *args, **kwargs):
|
|
25
|
+
return func(self, *args, **kwargs)
|
|
26
|
+
|
|
27
|
+
wrapper.__doc__ = getattr(sns, func.__name__.split("sns_")[-1]).__doc__
|
|
28
|
+
return wrapper
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class SeabornMixin:
|
|
32
|
+
|
|
33
|
+
def _sns_base(
|
|
34
|
+
self, method_name, *args, track=True, track_obj=None, id=None, **kwargs
|
|
35
|
+
):
|
|
36
|
+
sns_method_name = method_name.split("sns_")[-1]
|
|
37
|
+
|
|
38
|
+
with self._no_tracking():
|
|
39
|
+
sns_plot_fn = getattr(sns, sns_method_name)
|
|
40
|
+
|
|
41
|
+
if kwargs.get("hue_colors"):
|
|
42
|
+
kwargs = scitex.gen.alternate_kwarg(
|
|
43
|
+
kwargs, primary_key="palette", alternate_key="hue_colors"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
self._axis_mpl = sns_plot_fn(ax=self._axis_mpl, *args, **kwargs)
|
|
47
|
+
|
|
48
|
+
# Track the plot if required
|
|
49
|
+
track_obj = track_obj if track_obj is not None else args
|
|
50
|
+
# Create a tracked_dict with appropriate structure
|
|
51
|
+
tracked_dict = {
|
|
52
|
+
'data': track_obj, # Use 'data' key for consistency with formatters
|
|
53
|
+
'args': args # Keep args for backward compatibility
|
|
54
|
+
}
|
|
55
|
+
self._track(track, id, method_name, tracked_dict, kwargs)
|
|
56
|
+
|
|
57
|
+
def _sns_base_xyhue(self, method_name, *args, track=True, id=None, **kwargs):
|
|
58
|
+
"""Formats data passed to sns functions with (data=data, x=x, y=y) keyword arguments"""
|
|
59
|
+
df = kwargs.get("data")
|
|
60
|
+
x, y, hue = kwargs.get("x"), kwargs.get("y"), kwargs.get("hue")
|
|
61
|
+
|
|
62
|
+
track_obj = self._sns_prepare_xyhue(df, x, y, hue) if df is not None else None
|
|
63
|
+
self._sns_base(
|
|
64
|
+
method_name,
|
|
65
|
+
*args,
|
|
66
|
+
track=track,
|
|
67
|
+
track_obj=track_obj,
|
|
68
|
+
id=id,
|
|
69
|
+
**kwargs,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
def _sns_prepare_xyhue(self, data=None, x=None, y=None, hue=None, **kwargs):
|
|
73
|
+
"""Returns obj to track"""
|
|
74
|
+
data = data.reset_index()
|
|
75
|
+
|
|
76
|
+
if hue is not None:
|
|
77
|
+
if x is None and y is None:
|
|
78
|
+
|
|
79
|
+
return data
|
|
80
|
+
elif x is None:
|
|
81
|
+
|
|
82
|
+
agg_dict = {}
|
|
83
|
+
for hh in data[hue].unique():
|
|
84
|
+
agg_dict[hh] = data.loc[data[hue] == hh, y]
|
|
85
|
+
df = scitex.pd.force_df(agg_dict)
|
|
86
|
+
return df
|
|
87
|
+
|
|
88
|
+
elif y is None:
|
|
89
|
+
|
|
90
|
+
df = pd.concat(
|
|
91
|
+
[data.loc[data[hue] == hh, x] for hh in data[hue].unique()],
|
|
92
|
+
axis=1,
|
|
93
|
+
)
|
|
94
|
+
return df
|
|
95
|
+
else:
|
|
96
|
+
pivoted_data = data.pivot_table(
|
|
97
|
+
values=y,
|
|
98
|
+
index=data.index,
|
|
99
|
+
columns=[x, hue],
|
|
100
|
+
aggfunc="first",
|
|
101
|
+
)
|
|
102
|
+
pivoted_data.columns = [
|
|
103
|
+
f"{col[0]}-{col[1]}" for col in pivoted_data.columns
|
|
104
|
+
]
|
|
105
|
+
return pivoted_data
|
|
106
|
+
else:
|
|
107
|
+
if x is None and y is None:
|
|
108
|
+
return data
|
|
109
|
+
|
|
110
|
+
elif x is None:
|
|
111
|
+
return data[[y]]
|
|
112
|
+
|
|
113
|
+
elif y is None:
|
|
114
|
+
return data[[x]]
|
|
115
|
+
|
|
116
|
+
else:
|
|
117
|
+
return data.pivot_table(
|
|
118
|
+
values=y, index=data.index, columns=x, aggfunc="first"
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
@sns_copy_doc
|
|
122
|
+
def sns_barplot(self, data=None, x=None, y=None, track=True, id=None, **kwargs):
|
|
123
|
+
self._sns_base_xyhue(
|
|
124
|
+
"sns_barplot", data=data, x=x, y=y, track=track, id=id, **kwargs
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
@sns_copy_doc
|
|
128
|
+
def sns_boxplot(
|
|
129
|
+
self,
|
|
130
|
+
data=None,
|
|
131
|
+
x=None,
|
|
132
|
+
y=None,
|
|
133
|
+
strip=False,
|
|
134
|
+
track=True,
|
|
135
|
+
id=None,
|
|
136
|
+
**kwargs,
|
|
137
|
+
):
|
|
138
|
+
self._sns_base_xyhue(
|
|
139
|
+
"sns_boxplot", data=data, x=x, y=y, track=track, id=id, **kwargs
|
|
140
|
+
)
|
|
141
|
+
if strip:
|
|
142
|
+
strip_kwargs = kwargs.copy()
|
|
143
|
+
strip_kwargs.pop("notch", None) # Remove boxplot-specific kwargs
|
|
144
|
+
strip_kwargs.pop("whis", None)
|
|
145
|
+
self.sns_stripplot(
|
|
146
|
+
data=data,
|
|
147
|
+
x=x,
|
|
148
|
+
y=y,
|
|
149
|
+
track=False,
|
|
150
|
+
id=f"{id}_strip",
|
|
151
|
+
**strip_kwargs,
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
@sns_copy_doc
|
|
155
|
+
def sns_heatmap(self, *args, xyz=False, track=True, id=None, **kwargs):
|
|
156
|
+
method_name = "sns_heatmap"
|
|
157
|
+
df = args[0]
|
|
158
|
+
if xyz:
|
|
159
|
+
df = scitex.pd.to_xyz(df)
|
|
160
|
+
self._sns_base(method_name, *args, track=track, track_obj=df, id=id, **kwargs)
|
|
161
|
+
|
|
162
|
+
@sns_copy_doc
|
|
163
|
+
def sns_histplot(
|
|
164
|
+
self, data=None, x=None, y=None, bins=10, align_bins=True, track=True, id=None, **kwargs
|
|
165
|
+
):
|
|
166
|
+
"""
|
|
167
|
+
Plot a histogram using seaborn with bin alignment support.
|
|
168
|
+
|
|
169
|
+
This method enhances the seaborn histplot with the ability to align
|
|
170
|
+
bins across multiple histograms on the same axis and export bin data.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
data: Input data (DataFrame, array, or series)
|
|
174
|
+
x: Column name for x-axis data
|
|
175
|
+
y: Column name for y-axis data
|
|
176
|
+
bins: Bin specification (count or edges)
|
|
177
|
+
align_bins: Whether to align bins with other histograms on this axis
|
|
178
|
+
track: Whether to track this operation
|
|
179
|
+
id: Identifier for tracking
|
|
180
|
+
**kwargs: Additional keywords passed to seaborn histplot
|
|
181
|
+
"""
|
|
182
|
+
# Method Name for downstream csv exporting
|
|
183
|
+
method_name = "sns_histplot"
|
|
184
|
+
|
|
185
|
+
# Get the data to plot for bin alignment
|
|
186
|
+
plot_data = None
|
|
187
|
+
if data is not None and x is not None:
|
|
188
|
+
plot_data = data[x].values if hasattr(data, 'columns') and x in data.columns else None
|
|
189
|
+
|
|
190
|
+
# Get axis and histogram IDs for bin alignment
|
|
191
|
+
axis_id = str(hash(self._axis_mpl))
|
|
192
|
+
hist_id = id if id is not None else str(self.id)
|
|
193
|
+
|
|
194
|
+
# Calculate range from data if needed
|
|
195
|
+
range_value = kwargs.get('binrange', None)
|
|
196
|
+
|
|
197
|
+
# Align bins if requested and data is available
|
|
198
|
+
if align_bins and plot_data is not None:
|
|
199
|
+
from ....plt.utils import histogram_bin_manager
|
|
200
|
+
bins_val, range_val = histogram_bin_manager.register_histogram(
|
|
201
|
+
axis_id, hist_id, plot_data, bins, range_value
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
# Update bins in kwargs
|
|
205
|
+
kwargs['bins'] = bins_val
|
|
206
|
+
|
|
207
|
+
# Update range in kwargs if it was provided
|
|
208
|
+
if range_value is not None:
|
|
209
|
+
kwargs['binrange'] = range_val
|
|
210
|
+
|
|
211
|
+
# Plotting with seaborn
|
|
212
|
+
with self._no_tracking():
|
|
213
|
+
# Execute the seaborn histplot function
|
|
214
|
+
# Don't pass bins as a separate parameter since it may already be in kwargs
|
|
215
|
+
sns_plot = sns.histplot(data=data, x=x, y=y, ax=self._axis_mpl, **kwargs)
|
|
216
|
+
|
|
217
|
+
# Extract bin information from the plotted artists
|
|
218
|
+
hist_result = None
|
|
219
|
+
if hasattr(sns_plot, 'patches') and sns_plot.patches:
|
|
220
|
+
# Get bin information from the plot patches
|
|
221
|
+
patches = sns_plot.patches
|
|
222
|
+
if patches:
|
|
223
|
+
counts = np.array([p.get_height() for p in patches])
|
|
224
|
+
# Extract bin edges from patch positions
|
|
225
|
+
bin_edges = []
|
|
226
|
+
for p in patches:
|
|
227
|
+
bin_edges.append(p.get_x())
|
|
228
|
+
# Add the rightmost edge
|
|
229
|
+
if patches:
|
|
230
|
+
bin_edges.append(patches[-1].get_x() + patches[-1].get_width())
|
|
231
|
+
|
|
232
|
+
hist_result = (counts, np.array(bin_edges))
|
|
233
|
+
|
|
234
|
+
# Create a track object for the formatter
|
|
235
|
+
track_obj = self._sns_prepare_xyhue(data, x, y, kwargs.get("hue"))
|
|
236
|
+
|
|
237
|
+
# Enhanced tracked dict with histogram result
|
|
238
|
+
tracked_dict = {
|
|
239
|
+
'data': track_obj,
|
|
240
|
+
'args': (data, x, y),
|
|
241
|
+
'hist_result': hist_result
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
# Track the operation
|
|
245
|
+
self._track(track, id, method_name, tracked_dict, kwargs)
|
|
246
|
+
|
|
247
|
+
return sns_plot
|
|
248
|
+
|
|
249
|
+
@sns_copy_doc
|
|
250
|
+
def sns_kdeplot(
|
|
251
|
+
self,
|
|
252
|
+
data=None,
|
|
253
|
+
x=None,
|
|
254
|
+
y=None,
|
|
255
|
+
xlim=None,
|
|
256
|
+
ylim=None,
|
|
257
|
+
track=True,
|
|
258
|
+
id=None,
|
|
259
|
+
**kwargs,
|
|
260
|
+
):
|
|
261
|
+
if kwargs.get("hue"):
|
|
262
|
+
hues = data[kwargs["hue"]]
|
|
263
|
+
|
|
264
|
+
if x is not None:
|
|
265
|
+
lim = xlim
|
|
266
|
+
for hue in np.unique(hues):
|
|
267
|
+
_data = data.loc[hues == hue, x]
|
|
268
|
+
self.plot_kde(_data, xlim=lim, label=hue, id=hue, **kwargs)
|
|
269
|
+
|
|
270
|
+
if y is not None:
|
|
271
|
+
lim = ylim
|
|
272
|
+
for hue in np.unique(hues):
|
|
273
|
+
_data = data.loc[hues == hue, y]
|
|
274
|
+
self.plot_kde(_data, xlim=lim, label=hue, id=hue, **kwargs)
|
|
275
|
+
|
|
276
|
+
else:
|
|
277
|
+
if x is not None:
|
|
278
|
+
_data, lim = data[x], xlim
|
|
279
|
+
if y is not None:
|
|
280
|
+
_data, lim = data[y], ylim
|
|
281
|
+
self.plot_kde(_data, xlim=lim, **kwargs)
|
|
282
|
+
|
|
283
|
+
@sns_copy_doc
|
|
284
|
+
def sns_pairplot(self, *args, track=True, id=None, **kwargs):
|
|
285
|
+
self._sns_base("sns_pairplot", *args, track=track, id=id, **kwargs)
|
|
286
|
+
|
|
287
|
+
@sns_copy_doc
|
|
288
|
+
def sns_scatterplot(self, data=None, x=None, y=None, track=True, id=None, **kwargs):
|
|
289
|
+
self._sns_base_xyhue(
|
|
290
|
+
"sns_scatterplot",
|
|
291
|
+
data=data,
|
|
292
|
+
x=x,
|
|
293
|
+
y=y,
|
|
294
|
+
track=track,
|
|
295
|
+
id=id,
|
|
296
|
+
**kwargs,
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
@sns_copy_doc
|
|
300
|
+
def sns_lineplot(self, data=None, x=None, y=None, track=True, id=None, **kwargs):
|
|
301
|
+
self._sns_base_xyhue(
|
|
302
|
+
"sns_lineplot",
|
|
303
|
+
data=data,
|
|
304
|
+
x=x,
|
|
305
|
+
y=y,
|
|
306
|
+
track=track,
|
|
307
|
+
id=id,
|
|
308
|
+
**kwargs,
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
@sns_copy_doc
|
|
312
|
+
def sns_swarmplot(self, data=None, x=None, y=None, track=True, id=None, **kwargs):
|
|
313
|
+
self._sns_base_xyhue(
|
|
314
|
+
"sns_swarmplot", data=data, x=x, y=y, track=track, id=id, **kwargs
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
@sns_copy_doc
|
|
318
|
+
def sns_stripplot(self, data=None, x=None, y=None, track=True, id=None, **kwargs):
|
|
319
|
+
self._sns_base_xyhue(
|
|
320
|
+
"sns_stripplot", data=data, x=x, y=y, track=track, id=id, **kwargs
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
# @sns_copy_doc
|
|
324
|
+
# def sns_violinplot(
|
|
325
|
+
# self, data=None, x=None, y=None, track=True, id=None, **kwargs
|
|
326
|
+
# ):
|
|
327
|
+
# self._sns_base_xyhue(
|
|
328
|
+
# "sns_violinplot", data=data, x=x, y=y, track=track, id=id, **kwargs
|
|
329
|
+
# )
|
|
330
|
+
|
|
331
|
+
@sns_copy_doc
|
|
332
|
+
def sns_violinplot(
|
|
333
|
+
self,
|
|
334
|
+
data=None,
|
|
335
|
+
x=None,
|
|
336
|
+
y=None,
|
|
337
|
+
track=True,
|
|
338
|
+
id=None,
|
|
339
|
+
half=False,
|
|
340
|
+
**kwargs,
|
|
341
|
+
):
|
|
342
|
+
if half:
|
|
343
|
+
with self._no_tracking():
|
|
344
|
+
self._axis_mpl = ax_module.plot_half_violin(
|
|
345
|
+
self._axis_mpl, data=data, x=x, y=y, **kwargs
|
|
346
|
+
)
|
|
347
|
+
else:
|
|
348
|
+
self._sns_base_xyhue(
|
|
349
|
+
"sns_violinplot",
|
|
350
|
+
data=data,
|
|
351
|
+
x=x,
|
|
352
|
+
y=y,
|
|
353
|
+
track=track,
|
|
354
|
+
id=id,
|
|
355
|
+
**kwargs,
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
# Tracking
|
|
359
|
+
track_obj = self._sns_prepare_xyhue(data, x, y, kwargs.get("hue"))
|
|
360
|
+
self._track(track, id, "sns_violinplot", track_obj, kwargs)
|
|
361
|
+
|
|
362
|
+
return self._axis_mpl
|
|
363
|
+
|
|
364
|
+
@sns_copy_doc
|
|
365
|
+
def sns_jointplot(self, *args, track=True, id=None, **kwargs):
|
|
366
|
+
self._sns_base("sns_jointplot", *args, track=track, id=id, **kwargs)
|
|
367
|
+
|
|
368
|
+
# EOF
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-30 18:40:59 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
"""
|
|
13
|
+
Functionality:
|
|
14
|
+
* Handles tracking and history management for matplotlib plot operations
|
|
15
|
+
Input:
|
|
16
|
+
* Plot method calls, their arguments, and tracking configuration
|
|
17
|
+
Output:
|
|
18
|
+
* Tracked plotting history and DataFrame export for analysis
|
|
19
|
+
Prerequisites:
|
|
20
|
+
* pandas, matplotlib
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from contextlib import contextmanager
|
|
24
|
+
|
|
25
|
+
import pandas as pd
|
|
26
|
+
|
|
27
|
+
from .._export_as_csv import export_as_csv as _export_as_csv
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class TrackingMixin:
|
|
31
|
+
"""Mixin class for tracking matplotlib plotting operations.
|
|
32
|
+
|
|
33
|
+
Example
|
|
34
|
+
-------
|
|
35
|
+
>>> fig, ax = plt.subplots()
|
|
36
|
+
>>> ax.track = True
|
|
37
|
+
>>> ax.id = 0
|
|
38
|
+
>>> ax._ax_history = OrderedDict()
|
|
39
|
+
>>> ax.plot([1, 2, 3], [4, 5, 6], id="plot1")
|
|
40
|
+
>>> print(ax.history)
|
|
41
|
+
{'plot1': ('plot1', 'plot', {'plot_df': DataFrame, ...}, {})}
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def _track(self, track, id, method_name, tracked_dict, kwargs=None):
|
|
45
|
+
"""Track plotting operation with auto-generated IDs.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
track: Whether to track this operation
|
|
49
|
+
id: Identifier for the plot (can be None)
|
|
50
|
+
method_name: Name of the plotting method
|
|
51
|
+
tracked_dict: Dictionary of tracked data
|
|
52
|
+
kwargs: Original keyword arguments
|
|
53
|
+
"""
|
|
54
|
+
# Extract id from kwargs and remove it before passing to matplotlib
|
|
55
|
+
if kwargs is not None and hasattr(kwargs, "get") and "id" in kwargs:
|
|
56
|
+
id = kwargs.pop("id")
|
|
57
|
+
|
|
58
|
+
# Default kwargs to empty dict if None
|
|
59
|
+
if kwargs is None:
|
|
60
|
+
kwargs = {}
|
|
61
|
+
|
|
62
|
+
if track is None:
|
|
63
|
+
track = self.track
|
|
64
|
+
|
|
65
|
+
if track:
|
|
66
|
+
# If no ID was provided, generate one using method_name + counter
|
|
67
|
+
if id is None:
|
|
68
|
+
# Initialize method counters if not exist
|
|
69
|
+
if not hasattr(self, '_method_counters'):
|
|
70
|
+
self._method_counters = {}
|
|
71
|
+
|
|
72
|
+
# Get current counter value for this method and increment it
|
|
73
|
+
counter = self._method_counters.get(method_name, 0)
|
|
74
|
+
self._method_counters[method_name] = counter + 1
|
|
75
|
+
|
|
76
|
+
# Format ID as method_name_counter (e.g., bar_1, plot_3)
|
|
77
|
+
id = f"{method_name}_{counter}"
|
|
78
|
+
|
|
79
|
+
# For backward compatibility
|
|
80
|
+
self.id += 1
|
|
81
|
+
|
|
82
|
+
# Store the tracking record
|
|
83
|
+
self._ax_history[id] = (id, method_name, tracked_dict, kwargs)
|
|
84
|
+
|
|
85
|
+
@contextmanager
|
|
86
|
+
def _no_tracking(self):
|
|
87
|
+
"""Context manager to temporarily disable tracking."""
|
|
88
|
+
original_track = self.track
|
|
89
|
+
self.track = False
|
|
90
|
+
try:
|
|
91
|
+
yield
|
|
92
|
+
finally:
|
|
93
|
+
self.track = original_track
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def history(self):
|
|
97
|
+
return {k: self._ax_history[k] for k in self._ax_history}
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def flat(self):
|
|
101
|
+
if isinstance(self._axis_mpl, list):
|
|
102
|
+
return self._axis_mpl
|
|
103
|
+
else:
|
|
104
|
+
return [self._axis_mpl]
|
|
105
|
+
|
|
106
|
+
def reset_history(self):
|
|
107
|
+
self._ax_history = {}
|
|
108
|
+
|
|
109
|
+
def export_as_csv(self):
|
|
110
|
+
"""
|
|
111
|
+
Export tracked plotting data to a DataFrame.
|
|
112
|
+
"""
|
|
113
|
+
df = _export_as_csv(self.history)
|
|
114
|
+
|
|
115
|
+
return df if df is not None else pd.DataFrame()
|
|
116
|
+
|
|
117
|
+
def export_as_csv_for_sigmaplot(self, include_visual_params=True):
|
|
118
|
+
"""
|
|
119
|
+
Export tracked plotting data to a DataFrame in SigmaPlot format.
|
|
120
|
+
|
|
121
|
+
Parameters
|
|
122
|
+
----------
|
|
123
|
+
include_visual_params : bool, optional
|
|
124
|
+
Whether to include visual parameters (xlabel, ylabel, scales, etc.)
|
|
125
|
+
at the top of the CSV. Default is True.
|
|
126
|
+
|
|
127
|
+
Returns
|
|
128
|
+
-------
|
|
129
|
+
pandas.DataFrame
|
|
130
|
+
DataFrame containing the plotted data formatted for SigmaPlot.
|
|
131
|
+
|
|
132
|
+
Examples
|
|
133
|
+
--------
|
|
134
|
+
>>> fig, ax = scitex.plt.subplots()
|
|
135
|
+
>>> ax.plot([1, 2, 3], [4, 5, 6])
|
|
136
|
+
>>> ax.scatter([1, 2, 3], [7, 8, 9])
|
|
137
|
+
>>> df = ax.export_as_csv_for_sigmaplot()
|
|
138
|
+
>>> df.to_csv('for_sigmaplot.csv', index=False)
|
|
139
|
+
"""
|
|
140
|
+
df = _export_as_csv(self.history)
|
|
141
|
+
|
|
142
|
+
return df if df is not None else pd.DataFrame()
|
|
143
|
+
|
|
144
|
+
# def _track(
|
|
145
|
+
# self,
|
|
146
|
+
# track: Optional[bool],
|
|
147
|
+
# plot_id: Optional[str],
|
|
148
|
+
# method_name: str,
|
|
149
|
+
# tracked_dict: Any,
|
|
150
|
+
# kwargs: Dict[str, Any]
|
|
151
|
+
# ) -> None:
|
|
152
|
+
# """Tracks plotting operation if tracking is enabled."""
|
|
153
|
+
# if track is None:
|
|
154
|
+
# track = self.track
|
|
155
|
+
# if track:
|
|
156
|
+
# plot_id = plot_id if plot_id is not None else self.id
|
|
157
|
+
# self.id += 1
|
|
158
|
+
# self._ax_history[plot_id] = (plot_id, method_name, tracked_dict, kwargs)
|
|
159
|
+
|
|
160
|
+
# @contextmanager
|
|
161
|
+
# def _no_tracking(self) -> None:
|
|
162
|
+
# """Temporarily disables tracking within a context."""
|
|
163
|
+
# original_track = self.track
|
|
164
|
+
# self.track = False
|
|
165
|
+
# try:
|
|
166
|
+
# yield
|
|
167
|
+
# finally:
|
|
168
|
+
# self.track = original_track
|
|
169
|
+
|
|
170
|
+
# @property
|
|
171
|
+
# def history(self) -> Dict[str, Tuple]:
|
|
172
|
+
# """Returns the plotting history."""
|
|
173
|
+
# return dict(self._ax_history)
|
|
174
|
+
|
|
175
|
+
# def reset_history(self) -> None:
|
|
176
|
+
# """Clears the plotting history."""
|
|
177
|
+
# self._ax_history = OrderedDict()
|
|
178
|
+
|
|
179
|
+
# def export_as_csv(self) -> pd.DataFrame:
|
|
180
|
+
# """Converts plotting history to a SigmaPlot-compatible DataFrame."""
|
|
181
|
+
# df = _export_as_csv(self.history)
|
|
182
|
+
# return df if df is not None else pd.DataFrame()
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
# EOF
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-01 08:54:38 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/__init__.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/_subplots/_AxisWrapperMixins/__init__.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
from ._AdjustmentMixin import AdjustmentMixin
|
|
12
|
+
from ._MatplotlibPlotMixin import MatplotlibPlotMixin
|
|
13
|
+
from ._SeabornMixin import SeabornMixin
|
|
14
|
+
from ._TrackingMixin import TrackingMixin
|
|
15
|
+
|
|
16
|
+
# EOF
|