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,226 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-19 02:53:28 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_FigWrapper.py.new
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/_subplots/_FigWrapper.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
from functools import wraps
|
|
13
|
+
import warnings
|
|
14
|
+
import numpy as np
|
|
15
|
+
import pandas as pd
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class FigWrapper:
|
|
19
|
+
def __init__(self, fig_mpl):
|
|
20
|
+
self._fig_mpl = fig_mpl
|
|
21
|
+
self._last_saved_info = None
|
|
22
|
+
self._not_saved_yet_flag = True
|
|
23
|
+
self._called_from_mng_io_save = False
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def figure(
|
|
27
|
+
self,
|
|
28
|
+
):
|
|
29
|
+
return self._fig_mpl
|
|
30
|
+
|
|
31
|
+
def __getattr__(self, attr):
|
|
32
|
+
# print(f"Attribute of FigWrapper: {attr}")
|
|
33
|
+
attr_mpl = getattr(self._fig_mpl, attr)
|
|
34
|
+
|
|
35
|
+
if callable(attr_mpl):
|
|
36
|
+
|
|
37
|
+
@wraps(attr_mpl)
|
|
38
|
+
def wrapper(*args, track=None, id=None, **kwargs):
|
|
39
|
+
results = attr_mpl(*args, **kwargs)
|
|
40
|
+
# self._track(track, id, attr, args, kwargs)
|
|
41
|
+
return results
|
|
42
|
+
|
|
43
|
+
return wrapper
|
|
44
|
+
|
|
45
|
+
else:
|
|
46
|
+
return attr_mpl
|
|
47
|
+
|
|
48
|
+
def __dir__(self):
|
|
49
|
+
# Combine attributes from both self and the wrapped matplotlib figure
|
|
50
|
+
attrs = set(dir(self.__class__))
|
|
51
|
+
attrs.update(object.__dir__(self))
|
|
52
|
+
attrs.update(dir(self._fig_mpl))
|
|
53
|
+
return sorted(attrs)
|
|
54
|
+
|
|
55
|
+
# def savefig(self, fname, *args, **kwargs):
|
|
56
|
+
# if not self._called_from_mng_io_save:
|
|
57
|
+
# warnings.warn(
|
|
58
|
+
# f"Instead of `FigWrapper.savefig({fname})`, use `scitex.io.save(fig, {fname}, symlink_from_cwd=True)` to handle symlink and export as csv.",
|
|
59
|
+
# UserWarning,
|
|
60
|
+
# )
|
|
61
|
+
# self._called_from_mng_io_save = False
|
|
62
|
+
# self._fig_mpl.savefig(fname, *args, **kwargs)
|
|
63
|
+
|
|
64
|
+
def export_as_csv(self):
|
|
65
|
+
"""Export plotted data from all axes.
|
|
66
|
+
|
|
67
|
+
This method collects data from all axes in the figure and combines
|
|
68
|
+
them into a single DataFrame with appropriate axis identifiers in
|
|
69
|
+
the column names.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
pd.DataFrame: Combined DataFrame with data from all axes,
|
|
73
|
+
with axis ID prefixes for each column.
|
|
74
|
+
"""
|
|
75
|
+
dfs = []
|
|
76
|
+
|
|
77
|
+
# Use the _traverse_axes helper method to iterate through all axes
|
|
78
|
+
# regardless of their structure (single, array, list, etc.)
|
|
79
|
+
for ii, ax in enumerate(self._traverse_axes()):
|
|
80
|
+
# Try different ways to access the export_as_csv method
|
|
81
|
+
df = None
|
|
82
|
+
try:
|
|
83
|
+
if hasattr(ax, '_axis_mpl') and hasattr(ax._axis_mpl, 'export_as_csv'):
|
|
84
|
+
# If it's a nested structure with _axis_mpl having export_as_csv
|
|
85
|
+
df = ax._axis_mpl.export_as_csv()
|
|
86
|
+
elif hasattr(ax, 'export_as_csv'):
|
|
87
|
+
# Direct AxisWrapper object
|
|
88
|
+
df = ax.export_as_csv()
|
|
89
|
+
else:
|
|
90
|
+
# Skip if no export method available
|
|
91
|
+
continue
|
|
92
|
+
except Exception:
|
|
93
|
+
continue
|
|
94
|
+
|
|
95
|
+
# Process the DataFrame if it's not empty
|
|
96
|
+
if df is not None and not df.empty:
|
|
97
|
+
# Add axis ID prefix to column names if not already present
|
|
98
|
+
prefix = f"ax_{ii:02d}_"
|
|
99
|
+
df.columns = [
|
|
100
|
+
col if col.startswith(prefix) else f"{prefix}{col}"
|
|
101
|
+
for col in df.columns
|
|
102
|
+
]
|
|
103
|
+
dfs.append(df)
|
|
104
|
+
|
|
105
|
+
# Return concatenated DataFrame or empty DataFrame if no data
|
|
106
|
+
return pd.concat(dfs, axis=1) if dfs else pd.DataFrame()
|
|
107
|
+
|
|
108
|
+
def _traverse_axes(self):
|
|
109
|
+
"""Helper method to traverse all axis wrappers in the figure."""
|
|
110
|
+
if hasattr(self, 'axes'):
|
|
111
|
+
# Check if we're dealing with an AxesWrapper instance
|
|
112
|
+
if hasattr(self.axes, '_axes_scitex') and hasattr(self.axes._axes_scitex, 'flat'):
|
|
113
|
+
# This is an AxesWrapper, get the individual AxisWrapper objects
|
|
114
|
+
for ax in self.axes._axes_scitex.flat:
|
|
115
|
+
yield ax
|
|
116
|
+
elif not hasattr(self.axes, '__iter__'):
|
|
117
|
+
# Single axis case
|
|
118
|
+
yield self.axes
|
|
119
|
+
else:
|
|
120
|
+
# Multiple axes case
|
|
121
|
+
if hasattr(self.axes, 'flat'):
|
|
122
|
+
# 2D array of axes
|
|
123
|
+
for ax in self.axes.flat:
|
|
124
|
+
yield ax
|
|
125
|
+
elif hasattr(self.axes, 'ravel'):
|
|
126
|
+
# Numpy array
|
|
127
|
+
for ax in self.axes.ravel():
|
|
128
|
+
yield ax
|
|
129
|
+
elif isinstance(self.axes, (list, tuple)):
|
|
130
|
+
# List of axes
|
|
131
|
+
for ax in self.axes:
|
|
132
|
+
yield ax
|
|
133
|
+
|
|
134
|
+
def legend(self, *args, loc="upper left", **kwargs):
|
|
135
|
+
"""Legend with upper left by default for all axes."""
|
|
136
|
+
for ax in self._traverse_axes():
|
|
137
|
+
try:
|
|
138
|
+
ax.legend(*args, loc=loc, **kwargs)
|
|
139
|
+
except Exception as e:
|
|
140
|
+
pass
|
|
141
|
+
|
|
142
|
+
def supxyt(self, x=False, y=False, t=False):
|
|
143
|
+
"""Wrapper for supxlabel, supylabel, and suptitle"""
|
|
144
|
+
if x is not False:
|
|
145
|
+
self._fig_mpl.supxlabel(x)
|
|
146
|
+
if y is not False:
|
|
147
|
+
self._fig_mpl.supylabel(y)
|
|
148
|
+
if t is not False:
|
|
149
|
+
self._fig_mpl.suptitle(t)
|
|
150
|
+
return self._fig_mpl
|
|
151
|
+
|
|
152
|
+
def tight_layout(self, *, rect=[0, 0.03, 1, 0.95], **kwargs):
|
|
153
|
+
"""Wrapper for tight_layout with rect=[0, 0.03, 1, 0.95] by default.
|
|
154
|
+
|
|
155
|
+
Handles cases where certain axes (like colorbars) are incompatible
|
|
156
|
+
with tight_layout. If the figure is using constrained_layout, this
|
|
157
|
+
method does nothing as constrained_layout handles spacing automatically.
|
|
158
|
+
"""
|
|
159
|
+
import warnings
|
|
160
|
+
|
|
161
|
+
# Check if figure is already using constrained_layout
|
|
162
|
+
if hasattr(self._fig_mpl, 'get_constrained_layout') and self._fig_mpl.get_constrained_layout():
|
|
163
|
+
# Figure is using constrained_layout, which handles colorbars better
|
|
164
|
+
# No need to call tight_layout
|
|
165
|
+
return
|
|
166
|
+
|
|
167
|
+
try:
|
|
168
|
+
with warnings.catch_warnings():
|
|
169
|
+
# Suppress the specific warning about incompatible axes
|
|
170
|
+
warnings.filterwarnings("ignore",
|
|
171
|
+
message="This figure includes Axes that are not compatible with tight_layout")
|
|
172
|
+
self._fig_mpl.tight_layout(rect=rect, **kwargs)
|
|
173
|
+
except Exception:
|
|
174
|
+
# If tight_layout fails completely, try constrained_layout as fallback
|
|
175
|
+
try:
|
|
176
|
+
self._fig_mpl.set_constrained_layout(True)
|
|
177
|
+
self._fig_mpl.set_constrained_layout_pads(w_pad=0.04, h_pad=0.04)
|
|
178
|
+
except Exception:
|
|
179
|
+
# If both fail, do nothing - figure will use default layout
|
|
180
|
+
pass
|
|
181
|
+
|
|
182
|
+
def adjust_layout(self, **kwargs):
|
|
183
|
+
"""Adjust the constrained layout parameters.
|
|
184
|
+
|
|
185
|
+
Parameters
|
|
186
|
+
----------
|
|
187
|
+
w_pad : float, optional
|
|
188
|
+
Width padding around axes (default: 0.05)
|
|
189
|
+
h_pad : float, optional
|
|
190
|
+
Height padding around axes (default: 0.05)
|
|
191
|
+
wspace : float, optional
|
|
192
|
+
Width space between subplots (default: 0.02)
|
|
193
|
+
hspace : float, optional
|
|
194
|
+
Height space between subplots (default: 0.02)
|
|
195
|
+
rect : list of 4 floats, optional
|
|
196
|
+
Rectangle in normalized figure coordinates to fit the whole layout
|
|
197
|
+
[left, bottom, right, top] (default: [0, 0, 1, 1])
|
|
198
|
+
"""
|
|
199
|
+
if hasattr(self._fig_mpl, 'get_constrained_layout') and self._fig_mpl.get_constrained_layout():
|
|
200
|
+
# Update constrained layout parameters
|
|
201
|
+
self._fig_mpl.set_constrained_layout_pads(**kwargs)
|
|
202
|
+
else:
|
|
203
|
+
# Fall back to tight_layout with rect parameter if provided
|
|
204
|
+
if 'rect' in kwargs:
|
|
205
|
+
self.tight_layout(rect=kwargs['rect'])
|
|
206
|
+
|
|
207
|
+
def close(self):
|
|
208
|
+
"""Close the underlying matplotlib figure"""
|
|
209
|
+
import matplotlib.pyplot as plt
|
|
210
|
+
plt.close(self._fig_mpl)
|
|
211
|
+
|
|
212
|
+
@property
|
|
213
|
+
def number(self):
|
|
214
|
+
"""Return the figure number for matplotlib.pyplot.close() compatibility"""
|
|
215
|
+
return self._fig_mpl.number
|
|
216
|
+
|
|
217
|
+
def __del__(self):
|
|
218
|
+
"""Cleanup when FigWrapper is deleted"""
|
|
219
|
+
try:
|
|
220
|
+
import matplotlib.pyplot as plt
|
|
221
|
+
plt.close(self._fig_mpl)
|
|
222
|
+
except:
|
|
223
|
+
pass
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
# EOF
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-29 03:46:53 (ywatanabe)"
|
|
4
|
+
# File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_SubplotsWrapper.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/_subplots/_SubplotsWrapper.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
from collections import OrderedDict
|
|
13
|
+
|
|
14
|
+
import matplotlib.pyplot as plt
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
from ._AxesWrapper import AxesWrapper
|
|
18
|
+
from ._AxisWrapper import AxisWrapper
|
|
19
|
+
from ._FigWrapper import FigWrapper
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class SubplotsWrapper:
|
|
23
|
+
"""
|
|
24
|
+
A wrapper class monitors data plotted using the ax methods from matplotlib.pyplot.
|
|
25
|
+
This data can be converted into a CSV file formatted for SigmaPlot compatibility.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
self._subplots_wrapper_history = OrderedDict()
|
|
30
|
+
self._fig_scitex = None
|
|
31
|
+
self._counter_part = plt.subplots
|
|
32
|
+
|
|
33
|
+
def __call__(self, *args, track=True, sharex=False, sharey=False, constrained_layout=None, **kwargs):
|
|
34
|
+
|
|
35
|
+
# If constrained_layout is not specified, use it by default for better colorbar handling
|
|
36
|
+
if constrained_layout is None and 'layout' not in kwargs:
|
|
37
|
+
# Use a dict to set padding parameters for better spacing
|
|
38
|
+
# Increased w_pad to prevent colorbar overlap
|
|
39
|
+
kwargs['constrained_layout'] = {'w_pad': 0.1, 'h_pad': 0.1, 'wspace': 0.05, 'hspace': 0.05}
|
|
40
|
+
|
|
41
|
+
# Start from the original matplotlib figure and axes
|
|
42
|
+
self._fig_mpl, self._axes_mpl = self._counter_part(
|
|
43
|
+
*args, sharex=sharex, sharey=sharey, **kwargs
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
# Wrap the figure
|
|
47
|
+
self._fig_scitex = FigWrapper(self._fig_mpl)
|
|
48
|
+
|
|
49
|
+
# Ensure axes_mpl is always an array
|
|
50
|
+
axes_array_mpl = np.atleast_1d(self._axes_mpl)
|
|
51
|
+
axes_shape_mpl = axes_array_mpl.shape
|
|
52
|
+
|
|
53
|
+
# Handle single axis case
|
|
54
|
+
if axes_array_mpl.size == 1:
|
|
55
|
+
# Use squeeze() to get the scalar Axes object if it's a 0-d array
|
|
56
|
+
ax_mpl_scalar = (
|
|
57
|
+
axes_array_mpl.item() if axes_array_mpl.ndim == 0 else axes_array_mpl[0]
|
|
58
|
+
)
|
|
59
|
+
self._axis_scitex = AxisWrapper(self._fig_scitex, ax_mpl_scalar, track)
|
|
60
|
+
self._fig_scitex.axes = np.atleast_1d([self._axis_scitex])
|
|
61
|
+
return self._fig_scitex, self._axis_scitex
|
|
62
|
+
|
|
63
|
+
# Handle multiple axes case
|
|
64
|
+
axes_flat_mpl = axes_array_mpl.ravel()
|
|
65
|
+
axes_flat_scitex_list = [
|
|
66
|
+
AxisWrapper(self._fig_scitex, ax_, track) for ax_ in axes_flat_mpl
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
# Reshape the axes_flat_scitex_list axes to match the original layout
|
|
70
|
+
axes_array_scitex = np.array(axes_flat_scitex_list).reshape(axes_shape_mpl)
|
|
71
|
+
|
|
72
|
+
# Wrap the array of axes
|
|
73
|
+
self._axes_scitex = AxesWrapper(self._fig_scitex, axes_array_scitex)
|
|
74
|
+
self._fig_scitex.axes = self._axes_scitex
|
|
75
|
+
return self._fig_scitex, self._axes_scitex
|
|
76
|
+
|
|
77
|
+
# def __getattr__(self, name):
|
|
78
|
+
# """
|
|
79
|
+
# Fallback to fetch attributes from the original matplotlib.pyplot.subplots function
|
|
80
|
+
# if they are not defined directly in this wrapper instance.
|
|
81
|
+
# This allows accessing attributes like __name__, __doc__ etc. from the original function.
|
|
82
|
+
# """
|
|
83
|
+
# print(f"Attribute of SubplotsWrapper: {name}")
|
|
84
|
+
# # Check if the attribute exists in the counterpart function
|
|
85
|
+
# if hasattr(self._counter_part, name):
|
|
86
|
+
# return getattr(self._counter_part, name)
|
|
87
|
+
# # Raise the standard error if not found in the wrapper or the counterpart
|
|
88
|
+
# raise AttributeError(
|
|
89
|
+
# f"'{type(self).__name__}' object and its counterpart '{self._counter_part.__name__}' have no attribute '{name}'"
|
|
90
|
+
# )
|
|
91
|
+
|
|
92
|
+
def __dir__(
|
|
93
|
+
self,
|
|
94
|
+
):
|
|
95
|
+
"""
|
|
96
|
+
Provide combined directory for tab completion, including
|
|
97
|
+
attributes from this wrapper and the original matplotlib.pyplot.subplots function.
|
|
98
|
+
"""
|
|
99
|
+
# Get attributes defined explicitly in this instance/class
|
|
100
|
+
local_attrs = set(super().__dir__())
|
|
101
|
+
# Get attributes from the counterpart function
|
|
102
|
+
try:
|
|
103
|
+
counterpart_attrs = set(dir(self._counter_part))
|
|
104
|
+
except Exception:
|
|
105
|
+
counterpart_attrs = set()
|
|
106
|
+
# Return the sorted union
|
|
107
|
+
return sorted(local_attrs.union(counterpart_attrs))
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# Instantiate the wrapper. This instance will be imported and used.
|
|
111
|
+
subplots = SubplotsWrapper()
|
|
112
|
+
|
|
113
|
+
if __name__ == "__main__":
|
|
114
|
+
import matplotlib
|
|
115
|
+
import scitex
|
|
116
|
+
|
|
117
|
+
matplotlib.use("TkAgg") # "TkAgg"
|
|
118
|
+
|
|
119
|
+
fig, ax = subplots()
|
|
120
|
+
ax.plot([1, 2, 3], [4, 5, 6], id="plot1")
|
|
121
|
+
ax.plot([4, 5, 6], [1, 2, 3], id="plot2")
|
|
122
|
+
scitex.io.save(fig, "/tmp/subplots_demo/plots.png")
|
|
123
|
+
|
|
124
|
+
# Behaves like native matplotlib.pyplot.subplots without tracking
|
|
125
|
+
fig, ax = subplots(track=False)
|
|
126
|
+
ax.plot([1, 2, 3], [4, 5, 6], id="plot3")
|
|
127
|
+
ax.plot([4, 5, 6], [1, 2, 3], id="plot4")
|
|
128
|
+
scitex.io.save(fig, "/tmp/subplots_demo/plots.png")
|
|
129
|
+
|
|
130
|
+
fig, ax = subplots()
|
|
131
|
+
ax.scatter([1, 2, 3], [4, 5, 6], id="scatter1")
|
|
132
|
+
ax.scatter([4, 5, 6], [1, 2, 3], id="scatter2")
|
|
133
|
+
scitex.io.save(fig, "/tmp/subplots_demo/scatters.png")
|
|
134
|
+
|
|
135
|
+
fig, ax = subplots()
|
|
136
|
+
ax.boxplot([1, 2, 3], id="boxplot1")
|
|
137
|
+
scitex.io.save(fig, "/tmp/subplots_demo/boxplot1.png")
|
|
138
|
+
|
|
139
|
+
fig, ax = subplots()
|
|
140
|
+
ax.bar(["A", "B", "C"], [4, 5, 6], id="bar1")
|
|
141
|
+
scitex.io.save(fig, "/tmp/subplots_demo/bar1.png")
|
|
142
|
+
|
|
143
|
+
print(ax.export_as_csv())
|
|
144
|
+
# plot1_plot_x plot1_plot_y plot2_plot_x ... boxplot1_boxplot_x bar1_bar_x bar1_bar_y
|
|
145
|
+
# 0 1.0 4.0 4.0 ... 1.0 A 4.0
|
|
146
|
+
# 1 2.0 5.0 5.0 ... 2.0 B 5.0
|
|
147
|
+
# 2 3.0 6.0 6.0 ... 3.0 C 6.0
|
|
148
|
+
|
|
149
|
+
print(ax.export_as_csv().keys()) # plot3 and plot 4 are not tracked
|
|
150
|
+
# [3 rows x 11 columns]
|
|
151
|
+
# Index(['plot1_plot_x', 'plot1_plot_y', 'plot2_plot_x', 'plot2_plot_y',
|
|
152
|
+
# 'scatter1_scatter_x', 'scatter1_scatter_y', 'scatter2_scatter_x',
|
|
153
|
+
# 'scatter2_scatter_y', 'boxplot1_boxplot_x', 'bar1_bar_x', 'bar1_bar_y'],
|
|
154
|
+
# dtype='object')
|
|
155
|
+
|
|
156
|
+
# If a path is passed, the sigmaplot-friendly dataframe is saved as a csv file.
|
|
157
|
+
ax.export_as_csv("./tmp/subplots_demo/for_sigmaplot.csv")
|
|
158
|
+
# Saved to: ./tmp/subplots_demo/for_sigmaplot.csv
|
|
159
|
+
|
|
160
|
+
"""
|
|
161
|
+
from matplotlib.pyplot import subplots as counter_part
|
|
162
|
+
from scitex.plt import subplots as msubplots
|
|
163
|
+
print(set(dir(msubplots)) - set(dir(counter_part)))
|
|
164
|
+
is_compatible = np.all([kk in set(dir(msubplots)) for kk in set(dir(counter_part))])
|
|
165
|
+
if is_compatible:
|
|
166
|
+
print(f"{msubplots.__name__} is compatible with {counter_part.__name__}")
|
|
167
|
+
else:
|
|
168
|
+
print(f"{msubplots.__name__} is incompatible with {counter_part.__name__}")
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
# EOF
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 05:22:40 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/_scitex_repo/src/scitex/plt/_subplots/__init__.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/_subplots/__init__.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
# Import export_as_csv module functions
|
|
13
|
+
from ._export_as_csv import export_as_csv, format_record
|
|
14
|
+
|
|
15
|
+
# Import formatters for backward compatibility
|
|
16
|
+
from ._export_as_csv_formatters import (
|
|
17
|
+
_format_plot_kde,
|
|
18
|
+
_format_plot_line,
|
|
19
|
+
_format_plot_conf_mat,
|
|
20
|
+
_format_plot_mean_std,
|
|
21
|
+
_format_plot_ecdf,
|
|
22
|
+
_format_plot_raster,
|
|
23
|
+
_format_plot_joyplot,
|
|
24
|
+
_format_plot,
|
|
25
|
+
_format_scatter,
|
|
26
|
+
_format_bar,
|
|
27
|
+
_format_hist,
|
|
28
|
+
_format_boxplot,
|
|
29
|
+
_format_errorbar,
|
|
30
|
+
_format_fill_between,
|
|
31
|
+
_format_imshow,
|
|
32
|
+
_format_violin,
|
|
33
|
+
_format_sns_boxplot,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# import importlib
|
|
37
|
+
# import inspect
|
|
38
|
+
|
|
39
|
+
# # Get the current directory
|
|
40
|
+
# current_dir = os.path.dirname(__file__)
|
|
41
|
+
|
|
42
|
+
# # Iterate through all Python files in the current directory
|
|
43
|
+
# for filename in os.listdir(current_dir):
|
|
44
|
+
# if filename.endswith(".py") and not filename.startswith("__"):
|
|
45
|
+
# module_name = filename[:-3] # Remove .py extension
|
|
46
|
+
# module = importlib.import_module(f".{module_name}", package=__name__)
|
|
47
|
+
|
|
48
|
+
# # Import only functions and classes from the module
|
|
49
|
+
# for name, obj in inspect.getmembers(module):
|
|
50
|
+
# if inspect.isfunction(obj) or inspect.isclass(obj):
|
|
51
|
+
# if not name.startswith("_"):
|
|
52
|
+
# globals()[name] = obj
|
|
53
|
+
|
|
54
|
+
# # Clean up temporary variables
|
|
55
|
+
# del (
|
|
56
|
+
# os,
|
|
57
|
+
# importlib,
|
|
58
|
+
# inspect,
|
|
59
|
+
# current_dir,
|
|
60
|
+
# filename,
|
|
61
|
+
# module_name,
|
|
62
|
+
# module,
|
|
63
|
+
# name,
|
|
64
|
+
# obj,
|
|
65
|
+
# )
|
|
66
|
+
|
|
67
|
+
# ################################################################################
|
|
68
|
+
# # For Matplotlib Compatibility
|
|
69
|
+
# ################################################################################
|
|
70
|
+
# import matplotlib.pyplot.subplots as counter_part
|
|
71
|
+
|
|
72
|
+
# _local_module_attributes = list(globals().keys())
|
|
73
|
+
# print(_local_module_attributes)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# def __getattr__(name):
|
|
77
|
+
# """
|
|
78
|
+
# Fallback to fetch attributes from matplotlib.pyplot
|
|
79
|
+
# if they are not defined directly in this module.
|
|
80
|
+
# """
|
|
81
|
+
# try:
|
|
82
|
+
# # Get the attribute from matplotlib.pyplot
|
|
83
|
+
# return getattr(counter_part, name)
|
|
84
|
+
# except AttributeError:
|
|
85
|
+
# # Raise the standard error if not found in pyplot either
|
|
86
|
+
# raise AttributeError(
|
|
87
|
+
# f"module '{__name__}' nor matplotlib.pyplot has attribute '{name}'"
|
|
88
|
+
# ) from None
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
# def __dir__():
|
|
92
|
+
# """
|
|
93
|
+
# Provide combined directory for tab completion, including
|
|
94
|
+
# attributes from this module and matplotlib.pyplot.
|
|
95
|
+
# """
|
|
96
|
+
# # Get attributes defined explicitly in this module
|
|
97
|
+
# local_attrs = set(_local_module_attributes)
|
|
98
|
+
# # Get attributes from matplotlib.pyplot
|
|
99
|
+
# pyplot_attrs = set(dir(counter_part))
|
|
100
|
+
# # Return the sorted union
|
|
101
|
+
# return sorted(local_attrs.union(pyplot_attrs))
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
"""
|
|
105
|
+
import matplotlib.pyplot as plt
|
|
106
|
+
import scitex.plt as mplt
|
|
107
|
+
|
|
108
|
+
print(set(dir(mplt.subplots)) - set(dir(plt.subplots)))
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
# EOF
|