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
scitex/pd/_to_xy.py
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/./env/bin/python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-09-03 07:01:31 (ywatanabe)"
|
|
4
|
+
# ./src/scitex/pd/_to_xy.py
|
|
5
|
+
|
|
6
|
+
import scitex
|
|
7
|
+
import numpy as np
|
|
8
|
+
import pandas as pd
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def to_xy(data_frame):
|
|
12
|
+
"""
|
|
13
|
+
Convert a heatmap DataFrame into x, y, z format.
|
|
14
|
+
|
|
15
|
+
Ensure the index and columns are the same, and if either exists, replace with that.
|
|
16
|
+
|
|
17
|
+
Example
|
|
18
|
+
-------
|
|
19
|
+
data_frame = pd.DataFrame(...) # Your DataFrame here
|
|
20
|
+
out = to_xy(data_frame)
|
|
21
|
+
print(out)
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
data_frame : pandas.DataFrame
|
|
26
|
+
The input DataFrame to be converted.
|
|
27
|
+
|
|
28
|
+
Returns
|
|
29
|
+
-------
|
|
30
|
+
pandas.DataFrame
|
|
31
|
+
A DataFrame formatted with columns ['x', 'y', 'z']
|
|
32
|
+
"""
|
|
33
|
+
assert data_frame.shape[0] == data_frame.shape[1]
|
|
34
|
+
|
|
35
|
+
if not data_frame.index.equals(data_frame.columns):
|
|
36
|
+
|
|
37
|
+
if (data_frame.index == np.array(range(len(data_frame.index)))).all():
|
|
38
|
+
data_frame.columns = data_frame.index
|
|
39
|
+
elif (data_frame.columns == np.array(range(len(data_frame.columns)))).all():
|
|
40
|
+
data_frame.index = data_frame.columns
|
|
41
|
+
else:
|
|
42
|
+
ValueError
|
|
43
|
+
# else:
|
|
44
|
+
# ValueError "Either of index or columns has to be passed"
|
|
45
|
+
|
|
46
|
+
formatted_data_frames = []
|
|
47
|
+
|
|
48
|
+
for column in data_frame.columns:
|
|
49
|
+
column_data_frame = data_frame[column]
|
|
50
|
+
y_label = column_data_frame.name
|
|
51
|
+
column_data_frame = pd.DataFrame(column_data_frame)
|
|
52
|
+
column_data_frame["x"] = column_data_frame.index
|
|
53
|
+
column_data_frame["y"] = y_label
|
|
54
|
+
column_data_frame = column_data_frame.reset_index().drop(columns=["index"])
|
|
55
|
+
column_data_frame = column_data_frame.rename(columns={y_label: "z"})
|
|
56
|
+
column_data_frame = scitex.pd.mv(column_data_frame, "z", -1)
|
|
57
|
+
formatted_data_frames.append(column_data_frame)
|
|
58
|
+
|
|
59
|
+
return pd.concat(formatted_data_frames, ignore_index=True)
|
scitex/pd/_to_xyz.py
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/./env/bin/python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-09-28 11:17:22 (ywatanabe)"
|
|
4
|
+
# ./src/scitex/pd/_to_xyz.py
|
|
5
|
+
|
|
6
|
+
import scitex
|
|
7
|
+
import numpy as np
|
|
8
|
+
import pandas as pd
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def to_xyz(data_frame):
|
|
12
|
+
"""
|
|
13
|
+
Convert a DataFrame into x, y, z format (long format).
|
|
14
|
+
|
|
15
|
+
Transforms a DataFrame from wide format (matrix/heatmap) to long format
|
|
16
|
+
where each value becomes a row with x (row index), y (column name),
|
|
17
|
+
and z (value) columns.
|
|
18
|
+
|
|
19
|
+
Example
|
|
20
|
+
-------
|
|
21
|
+
data_frame = pd.DataFrame(...) # Your DataFrame here
|
|
22
|
+
out = to_xyz(data_frame)
|
|
23
|
+
print(out)
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
data_frame : pandas.DataFrame
|
|
28
|
+
The input DataFrame to be converted.
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
pandas.DataFrame
|
|
33
|
+
A DataFrame formatted with columns ['x', 'y', 'z']
|
|
34
|
+
"""
|
|
35
|
+
x_name = data_frame.index.name or "x"
|
|
36
|
+
y_name = data_frame.columns.name or "y"
|
|
37
|
+
|
|
38
|
+
formatted_data_frames = []
|
|
39
|
+
|
|
40
|
+
for column in data_frame.columns:
|
|
41
|
+
column_data_frame = data_frame[column]
|
|
42
|
+
formatted_data = pd.DataFrame(
|
|
43
|
+
{
|
|
44
|
+
x_name: column_data_frame.index,
|
|
45
|
+
y_name: column,
|
|
46
|
+
"z": column_data_frame.values,
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
formatted_data_frames.append(formatted_data)
|
|
50
|
+
|
|
51
|
+
result = pd.concat(formatted_data_frames, ignore_index=True)
|
|
52
|
+
|
|
53
|
+
# Ensure column order is x, y, z
|
|
54
|
+
col_order = [x_name, y_name, "z"]
|
|
55
|
+
result = result[col_order]
|
|
56
|
+
|
|
57
|
+
return result
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# def to_xyz(data_frame):
|
|
61
|
+
# """
|
|
62
|
+
# Convert a heatmap DataFrame into x, y, z format.
|
|
63
|
+
|
|
64
|
+
# Ensure the index and columns are the same, and if either exists, replace with that.
|
|
65
|
+
|
|
66
|
+
# Example
|
|
67
|
+
# -------
|
|
68
|
+
# data_frame = pd.DataFrame(...) # Your DataFrame here
|
|
69
|
+
# out = to_xy(data_frame)
|
|
70
|
+
# print(out)
|
|
71
|
+
|
|
72
|
+
# Parameters
|
|
73
|
+
# ----------
|
|
74
|
+
# data_frame : pandas.DataFrame
|
|
75
|
+
# The input DataFrame to be converted.
|
|
76
|
+
|
|
77
|
+
# Returns
|
|
78
|
+
# -------
|
|
79
|
+
# pandas.DataFrame
|
|
80
|
+
# A DataFrame formatted with columns ['x', 'y', 'z']
|
|
81
|
+
# """
|
|
82
|
+
# assert data_frame.shape[0] == data_frame.shape[1]
|
|
83
|
+
|
|
84
|
+
# if not data_frame.index.equals(data_frame.columns):
|
|
85
|
+
|
|
86
|
+
# if (data_frame.index == np.array(range(len(data_frame.index)))).all():
|
|
87
|
+
# data_frame.columns = data_frame.index
|
|
88
|
+
# elif (
|
|
89
|
+
# data_frame.columns == np.array(range(len(data_frame.columns)))
|
|
90
|
+
# ).all():
|
|
91
|
+
# data_frame.index = data_frame.columns
|
|
92
|
+
# else:
|
|
93
|
+
# raise ValueError("Either index or columns must be a range of integers")
|
|
94
|
+
|
|
95
|
+
# formatted_data_frames = []
|
|
96
|
+
|
|
97
|
+
# for column in data_frame.columns:
|
|
98
|
+
# column_data_frame = data_frame[column]
|
|
99
|
+
# y_label = column_data_frame.name
|
|
100
|
+
# column_data_frame = pd.DataFrame(column_data_frame)
|
|
101
|
+
# column_data_frame["x"] = column_data_frame.index
|
|
102
|
+
# column_data_frame["y"] = y_label
|
|
103
|
+
# column_data_frame = column_data_frame.reset_index().drop(
|
|
104
|
+
# columns=["index"]
|
|
105
|
+
# )
|
|
106
|
+
# column_data_frame = column_data_frame.rename(columns={y_label: "z"})
|
|
107
|
+
# column_data_frame = scitex.pd.mv(column_data_frame, "z", -1)
|
|
108
|
+
# formatted_data_frames.append(column_data_frame)
|
|
109
|
+
|
|
110
|
+
# return pd.concat(formatted_data_frames, ignore_index=True)
|
scitex/plt/__init__.py
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-06-13 22:42:39 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/SciTeX-Code/src/scitex/plt/__init__.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/__init__.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
"""Scitex plt module."""
|
|
13
|
+
|
|
14
|
+
from ._tpl import termplot
|
|
15
|
+
from . import color
|
|
16
|
+
from . import utils
|
|
17
|
+
|
|
18
|
+
# Lazy import for subplots to avoid circular dependencies
|
|
19
|
+
_subplots = None
|
|
20
|
+
|
|
21
|
+
def subplots(*args, **kwargs):
|
|
22
|
+
"""Lazy-loaded subplots function."""
|
|
23
|
+
global _subplots
|
|
24
|
+
if _subplots is None:
|
|
25
|
+
from ._subplots._SubplotsWrapper import subplots as _subplots_impl
|
|
26
|
+
_subplots = _subplots_impl
|
|
27
|
+
return _subplots(*args, **kwargs)
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
"termplot",
|
|
31
|
+
"subplots",
|
|
32
|
+
"utils",
|
|
33
|
+
"color",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
# EOF
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-19 15:36:54 (ywatanabe)"
|
|
4
|
+
# File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxesWrapper.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_AxesWrapper.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
from functools import wraps
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
import pandas as pd
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AxesWrapper:
|
|
20
|
+
def __init__(self, fig_scitex, axes_scitex):
|
|
21
|
+
self._fig_scitex = fig_scitex
|
|
22
|
+
self._axes_scitex = axes_scitex
|
|
23
|
+
|
|
24
|
+
def get_figure(self, root=True):
|
|
25
|
+
"""Get the figure, compatible with matplotlib 3.8+"""
|
|
26
|
+
return self._fig_scitex
|
|
27
|
+
|
|
28
|
+
def __dir__(self):
|
|
29
|
+
# Combine attributes from both self and the wrapped matplotlib axes
|
|
30
|
+
attrs = set(dir(self.__class__))
|
|
31
|
+
attrs.update(object.__dir__(self))
|
|
32
|
+
|
|
33
|
+
# Add attributes from the axes objects if available
|
|
34
|
+
if hasattr(self, "_axes_scitex") and self._axes_scitex is not None:
|
|
35
|
+
# Get attributes from the first axis if there are any
|
|
36
|
+
if self._axes_scitex.size > 0:
|
|
37
|
+
first_ax = self._axes_scitex.flat[0]
|
|
38
|
+
attrs.update(dir(first_ax))
|
|
39
|
+
|
|
40
|
+
return sorted(attrs)
|
|
41
|
+
|
|
42
|
+
def __getattr__(self, name):
|
|
43
|
+
# Note that self._axes_scitex is "numpy.ndarray"
|
|
44
|
+
# print(f"Attribute of AxesWrapper: {name}")
|
|
45
|
+
methods = []
|
|
46
|
+
try:
|
|
47
|
+
for axis in self._axes_scitex.flat:
|
|
48
|
+
methods.append(getattr(axis, name))
|
|
49
|
+
except Exception:
|
|
50
|
+
methods = []
|
|
51
|
+
|
|
52
|
+
if methods and all(callable(m) for m in methods):
|
|
53
|
+
|
|
54
|
+
@wraps(methods[0])
|
|
55
|
+
def wrapper(*args, **kwargs):
|
|
56
|
+
return [
|
|
57
|
+
getattr(ax, name)(*args, **kwargs)
|
|
58
|
+
for ax in self._axes_scitex.flat
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
return wrapper
|
|
62
|
+
|
|
63
|
+
if methods and not callable(methods[0]):
|
|
64
|
+
return methods
|
|
65
|
+
|
|
66
|
+
def dummy(*args, **kwargs):
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
return dummy
|
|
70
|
+
|
|
71
|
+
# def __getitem__(self, index):
|
|
72
|
+
# subset = self._axes_scitex[index]
|
|
73
|
+
# if isinstance(index, slice):
|
|
74
|
+
# return AxesWrapper(self._fig_scitex, subset)
|
|
75
|
+
# return subset
|
|
76
|
+
|
|
77
|
+
def __getitem__(self, index):
|
|
78
|
+
subset = self._axes_scitex[index]
|
|
79
|
+
if isinstance(subset, np.ndarray):
|
|
80
|
+
return AxesWrapper(self._fig_scitex, subset)
|
|
81
|
+
return subset
|
|
82
|
+
|
|
83
|
+
def __setitem__(self, index, value):
|
|
84
|
+
"""Support item assignment for axes[row, col] = new_axis operations."""
|
|
85
|
+
self._axes_scitex[index] = value
|
|
86
|
+
|
|
87
|
+
def __iter__(self):
|
|
88
|
+
return iter(self._axes_scitex)
|
|
89
|
+
|
|
90
|
+
def __len__(self):
|
|
91
|
+
return self._axes_scitex.size
|
|
92
|
+
|
|
93
|
+
def __array__(self):
|
|
94
|
+
"""Support conversion to numpy array.
|
|
95
|
+
|
|
96
|
+
This allows using np.array(axes) on an AxesWrapper instance, returning
|
|
97
|
+
a NumPy array with the same shape as the original axes array.
|
|
98
|
+
|
|
99
|
+
Notes:
|
|
100
|
+
- While this enables compatibility with NumPy functions, not all
|
|
101
|
+
operations will work correctly due to the nature of the wrapped
|
|
102
|
+
objects.
|
|
103
|
+
- For flattening operations, use the dedicated `flatten()` method
|
|
104
|
+
instead of `np.array(axes).flatten()`:
|
|
105
|
+
|
|
106
|
+
# RECOMMENDED:
|
|
107
|
+
flat_axes = list(axes.flatten())
|
|
108
|
+
|
|
109
|
+
# AVOID (may cause "invalid __array_struct__" error):
|
|
110
|
+
flat_axes = np.array(axes).flatten()
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
np.ndarray: Array of wrapped axes with the same shape
|
|
114
|
+
"""
|
|
115
|
+
import warnings
|
|
116
|
+
|
|
117
|
+
# Show a warning to help users avoid common mistakes
|
|
118
|
+
warnings.warn(
|
|
119
|
+
"Converting AxesWrapper to numpy array. If you're trying to flatten "
|
|
120
|
+
"the axes, use 'list(axes.flatten())' instead of 'np.array(axes).flatten()'.",
|
|
121
|
+
UserWarning,
|
|
122
|
+
stacklevel=2,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# Convert the underlying axes to a compatible numpy array representation
|
|
126
|
+
flat_axes = [ax for ax in self._axes_scitex.flat]
|
|
127
|
+
array_compatible = np.empty(len(flat_axes), dtype=object)
|
|
128
|
+
for idx, ax in enumerate(flat_axes):
|
|
129
|
+
array_compatible[idx] = ax
|
|
130
|
+
return array_compatible.reshape(self._axes_scitex.shape)
|
|
131
|
+
|
|
132
|
+
def legend(self, loc="upper left"):
|
|
133
|
+
return [ax.legend(loc=loc) for ax in self._axes_scitex.flat]
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
def history(self):
|
|
137
|
+
return [ax.history for ax in self._axes_scitex.flat]
|
|
138
|
+
|
|
139
|
+
@property
|
|
140
|
+
def shape(self):
|
|
141
|
+
return self._axes_scitex.shape
|
|
142
|
+
|
|
143
|
+
@property
|
|
144
|
+
def flat(self):
|
|
145
|
+
"""Return a flat iterator over all axes.
|
|
146
|
+
|
|
147
|
+
This property provides direct access to the flattened axes array,
|
|
148
|
+
matching numpy array behavior.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Iterator over all axes in row-major (C-style) order
|
|
152
|
+
"""
|
|
153
|
+
return self._axes_scitex.flat
|
|
154
|
+
|
|
155
|
+
def flatten(self):
|
|
156
|
+
"""Return a flattened array of all axes in the AxesWrapper.
|
|
157
|
+
|
|
158
|
+
This method collects all axes from the flat iterator and returns them
|
|
159
|
+
as a NumPy array. This ensures compatibility with code that expects
|
|
160
|
+
a flat collection of axes.
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
np.ndarray: A flattened array containing all axes
|
|
164
|
+
|
|
165
|
+
Example:
|
|
166
|
+
# Preferred way to get a list of all axes:
|
|
167
|
+
axes_list = list(axes.flatten())
|
|
168
|
+
|
|
169
|
+
# Alternatively, if you need a NumPy array:
|
|
170
|
+
axes_array = axes.flatten()
|
|
171
|
+
"""
|
|
172
|
+
return np.array([ax for ax in self._axes_scitex.flat])
|
|
173
|
+
|
|
174
|
+
def export_as_csv(self):
|
|
175
|
+
dfs = []
|
|
176
|
+
for ii, ax in enumerate(self._axes_scitex.flat):
|
|
177
|
+
df = ax.export_as_csv()
|
|
178
|
+
df.columns = [f"ax_{ii:02d}_{col}" for col in df.columns]
|
|
179
|
+
dfs.append(df)
|
|
180
|
+
return pd.concat(dfs, axis=1) if dfs else pd.DataFrame()
|
|
181
|
+
|
|
182
|
+
# EOF
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-01 17:11:28 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/_scitex_repo/src/scitex/plt/_subplots/_AxisWrapper.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/_subplots/_AxisWrapper.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import warnings
|
|
13
|
+
from functools import wraps
|
|
14
|
+
|
|
15
|
+
import matplotlib
|
|
16
|
+
|
|
17
|
+
from ._AxisWrapperMixins import (
|
|
18
|
+
AdjustmentMixin,
|
|
19
|
+
MatplotlibPlotMixin,
|
|
20
|
+
SeabornMixin,
|
|
21
|
+
TrackingMixin,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AxisWrapper(MatplotlibPlotMixin, SeabornMixin, AdjustmentMixin, TrackingMixin):
|
|
26
|
+
def __init__(self, fig_scitex, axis_mpl, track):
|
|
27
|
+
"""Initialize the AxisWrapper.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
fig_scitex: Parent figure wrapper
|
|
31
|
+
axis_mpl: Matplotlib axis to wrap
|
|
32
|
+
track: Whether to track plotting operations
|
|
33
|
+
"""
|
|
34
|
+
self._fig_mpl = fig_scitex._fig_mpl
|
|
35
|
+
# Axis Properties
|
|
36
|
+
# self.axis = axis_mpl
|
|
37
|
+
# self._axis = axis_mpl
|
|
38
|
+
# self._axis_scitex = self
|
|
39
|
+
self._axis_mpl = axis_mpl
|
|
40
|
+
|
|
41
|
+
# Axes Properties
|
|
42
|
+
# self.axes = axis_mpl
|
|
43
|
+
# self._axes = axis_mpl
|
|
44
|
+
self._axes_mpl = axis_mpl
|
|
45
|
+
# self._axes_scitex = self
|
|
46
|
+
|
|
47
|
+
# Tracking properties
|
|
48
|
+
self._ax_history = {}
|
|
49
|
+
self._method_counters = {} # Track method counts for auto-generated IDs
|
|
50
|
+
self.track = track
|
|
51
|
+
self.id = 0
|
|
52
|
+
self._counter_part = matplotlib.axes.Axes
|
|
53
|
+
|
|
54
|
+
def get_figure(self, root=True):
|
|
55
|
+
"""Get the figure, compatible with matplotlib 3.8+"""
|
|
56
|
+
return self._fig_mpl
|
|
57
|
+
|
|
58
|
+
def twinx(self):
|
|
59
|
+
"""Create a twin y-axis and wrap it with AxisWrapper."""
|
|
60
|
+
twin_ax = self._axes_mpl.twinx()
|
|
61
|
+
# Create a mock figure wrapper for the twin axis
|
|
62
|
+
class MockFigWrapper:
|
|
63
|
+
def __init__(self, fig_mpl):
|
|
64
|
+
self._fig_mpl = fig_mpl
|
|
65
|
+
mock_fig = MockFigWrapper(self._fig_mpl)
|
|
66
|
+
return AxisWrapper(fig_scitex=mock_fig, axis_mpl=twin_ax, track=self.track)
|
|
67
|
+
|
|
68
|
+
def twiny(self):
|
|
69
|
+
"""Create a twin x-axis and wrap it with AxisWrapper."""
|
|
70
|
+
twin_ax = self._axes_mpl.twiny()
|
|
71
|
+
# Create a mock figure wrapper for the twin axis
|
|
72
|
+
class MockFigWrapper:
|
|
73
|
+
def __init__(self, fig_mpl):
|
|
74
|
+
self._fig_mpl = fig_mpl
|
|
75
|
+
mock_fig = MockFigWrapper(self._fig_mpl)
|
|
76
|
+
return AxisWrapper(fig_scitex=mock_fig, axis_mpl=twin_ax, track=self.track)
|
|
77
|
+
|
|
78
|
+
def __getattr__(self, name):
|
|
79
|
+
# 0. Check if the attribute is explicitly defined in AxisWrapper or its Mixins
|
|
80
|
+
# This check happens implicitly before __getattr__ is called.
|
|
81
|
+
# If a method like `plot` is defined in BasicPlotMixin, it will be found first.
|
|
82
|
+
|
|
83
|
+
# print(f"Attribute of AxisWrapper: {name}")
|
|
84
|
+
|
|
85
|
+
# 1. Try to get the attribute from the wrapped axes instance
|
|
86
|
+
if hasattr(self._axes_mpl, name):
|
|
87
|
+
orig_attr = getattr(self._axes_mpl, name)
|
|
88
|
+
|
|
89
|
+
if callable(orig_attr):
|
|
90
|
+
|
|
91
|
+
@wraps(orig_attr)
|
|
92
|
+
def wrapper(*args, **kwargs):
|
|
93
|
+
id_value = kwargs.pop("id", None)
|
|
94
|
+
track_override = kwargs.pop("track", None)
|
|
95
|
+
|
|
96
|
+
# Call the original matplotlib method
|
|
97
|
+
result = orig_attr(*args, **kwargs)
|
|
98
|
+
|
|
99
|
+
# Determine if tracking should occur
|
|
100
|
+
should_track = (
|
|
101
|
+
track_override if track_override is not None else self.track
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Track the method call if tracking enabled
|
|
105
|
+
# Expanded list of matplotlib plotting methods to track
|
|
106
|
+
tracking_methods = {
|
|
107
|
+
# Basic plots
|
|
108
|
+
'plot', 'scatter', 'bar', 'barh', 'hist', 'boxplot', 'violinplot',
|
|
109
|
+
# Line plots
|
|
110
|
+
'fill_between', 'fill_betweenx', 'errorbar', 'step', 'stem',
|
|
111
|
+
# Statistical plots
|
|
112
|
+
'hist2d', 'hexbin', 'pie',
|
|
113
|
+
# Contour plots
|
|
114
|
+
'contour', 'contourf', 'tricontour', 'tricontourf',
|
|
115
|
+
# Image plots
|
|
116
|
+
'imshow', 'matshow', 'spy',
|
|
117
|
+
# Quiver plots
|
|
118
|
+
'quiver', 'streamplot',
|
|
119
|
+
# 3D-related (if axes3d)
|
|
120
|
+
'plot3D', 'scatter3D', 'bar3d', 'plot_surface', 'plot_wireframe',
|
|
121
|
+
# Text and annotations (data-containing)
|
|
122
|
+
'annotate', 'text'
|
|
123
|
+
}
|
|
124
|
+
if should_track and name in tracking_methods:
|
|
125
|
+
# Use the _track method from TrackingMixin
|
|
126
|
+
# If no id provided, it will auto-generate one
|
|
127
|
+
try:
|
|
128
|
+
# Convert args to tracked_dict for consistency with other tracking
|
|
129
|
+
tracked_dict = {"args": args}
|
|
130
|
+
self._track(
|
|
131
|
+
should_track, id_value, name, tracked_dict, kwargs
|
|
132
|
+
)
|
|
133
|
+
except AttributeError:
|
|
134
|
+
warnings.warn(
|
|
135
|
+
f"Tracking setup incomplete for AxisWrapper ({name}).",
|
|
136
|
+
UserWarning,
|
|
137
|
+
stacklevel=2,
|
|
138
|
+
)
|
|
139
|
+
except Exception as e:
|
|
140
|
+
# Silently continue if tracking fails to not break plotting
|
|
141
|
+
pass
|
|
142
|
+
return result # Return the result of the original call
|
|
143
|
+
|
|
144
|
+
return wrapper
|
|
145
|
+
else:
|
|
146
|
+
# If it's a non-callable attribute (property, etc.), return it directly
|
|
147
|
+
return orig_attr
|
|
148
|
+
|
|
149
|
+
# 2. If not found on instance, try the counterpart type (fallback)
|
|
150
|
+
if hasattr(self._counter_part, name):
|
|
151
|
+
counterpart_attr = getattr(self._counter_part, name)
|
|
152
|
+
warnings.warn(
|
|
153
|
+
f"SciTeX Axis_MplWrapper: '{name}' not directly handled. "
|
|
154
|
+
f"Falling back to underlying '{self._counter_part.__name__}' attribute.",
|
|
155
|
+
UserWarning,
|
|
156
|
+
stacklevel=2,
|
|
157
|
+
)
|
|
158
|
+
# If the counterpart attribute is callable (likely a method descriptor)
|
|
159
|
+
if callable(counterpart_attr):
|
|
160
|
+
# Return a new function that calls the counterpart method on self._axes_mpl
|
|
161
|
+
@wraps(counterpart_attr)
|
|
162
|
+
def fallback_method(*args, **kwargs):
|
|
163
|
+
# Note: No id/track handling for fallback methods
|
|
164
|
+
return counterpart_attr(self._axes_mpl, *args, **kwargs)
|
|
165
|
+
|
|
166
|
+
return fallback_method
|
|
167
|
+
else:
|
|
168
|
+
# Non-callable class attribute. Attempt to get from instance again,
|
|
169
|
+
# otherwise return the class attribute/descriptor.
|
|
170
|
+
try:
|
|
171
|
+
return getattr(self._axes_mpl, name)
|
|
172
|
+
except AttributeError:
|
|
173
|
+
return counterpart_attr
|
|
174
|
+
|
|
175
|
+
# 3. If not found anywhere, raise AttributeError
|
|
176
|
+
raise AttributeError(
|
|
177
|
+
f"'{type(self).__name__}' object and its underlying '{self._counter_part.__name__}' "
|
|
178
|
+
f"have no attribute '{name}'"
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
def __dir__(self):
|
|
182
|
+
# Start with attributes from the class and all parent classes (mixins)
|
|
183
|
+
attrs = set()
|
|
184
|
+
|
|
185
|
+
# Get attributes from all parent classes including mixins
|
|
186
|
+
for cls in self.__class__.__mro__:
|
|
187
|
+
attrs.update(cls.__dict__.keys())
|
|
188
|
+
|
|
189
|
+
# Add instance attributes
|
|
190
|
+
attrs.update(self.__dict__.keys())
|
|
191
|
+
|
|
192
|
+
# Safely get matplotlib axes attributes
|
|
193
|
+
try:
|
|
194
|
+
# Get attributes from the wrapped matplotlib axes
|
|
195
|
+
if hasattr(self._axes_mpl, '__class__'):
|
|
196
|
+
# Get class methods from matplotlib.axes.Axes
|
|
197
|
+
for cls in self._axes_mpl.__class__.__mro__:
|
|
198
|
+
attrs.update(name for name in cls.__dict__.keys() if not name.startswith('_'))
|
|
199
|
+
|
|
200
|
+
# Add instance attributes of the matplotlib axes
|
|
201
|
+
if hasattr(self._axes_mpl, '__dict__'):
|
|
202
|
+
attrs.update(name for name in self._axes_mpl.__dict__.keys() if not name.startswith('_'))
|
|
203
|
+
|
|
204
|
+
except Exception:
|
|
205
|
+
# If any error occurs, add common matplotlib methods manually
|
|
206
|
+
attrs.update(['plot', 'scatter', 'bar', 'barh', 'hist', 'boxplot',
|
|
207
|
+
'set_xlabel', 'set_ylabel', 'set_title', 'legend',
|
|
208
|
+
'set_xlim', 'set_ylim', 'grid', 'annotate', 'text'])
|
|
209
|
+
|
|
210
|
+
# Remove private attributes
|
|
211
|
+
attrs = {attr for attr in attrs if not attr.startswith('_')}
|
|
212
|
+
|
|
213
|
+
return sorted(attrs)
|
|
214
|
+
|
|
215
|
+
def flatten(self):
|
|
216
|
+
"""Return a list containing just this axis.
|
|
217
|
+
|
|
218
|
+
This method makes AxisWrapper compatible with code that calls flatten()
|
|
219
|
+
on an axes collection. It returns a list containing just this single axis
|
|
220
|
+
to maintain consistency with AxesWrapper.flatten().
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
list: A list containing this axis wrapper
|
|
224
|
+
|
|
225
|
+
Example:
|
|
226
|
+
# When working with either AxesWrapper or AxisWrapper, this works:
|
|
227
|
+
axes_list = list(axes.flatten())
|
|
228
|
+
"""
|
|
229
|
+
return [self]
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
"""
|
|
233
|
+
import matplotlib.pyplot as plt
|
|
234
|
+
import scitex.plt as mplt
|
|
235
|
+
|
|
236
|
+
fig_scitex, axes = plt.subplots(ncols=2)
|
|
237
|
+
mfig_scitex, maxes = mplt.subplots(ncols=2)
|
|
238
|
+
|
|
239
|
+
print(set(dir(mfig_scitex)) - set(dir(fig_scitex)))
|
|
240
|
+
print(set(dir(maxes)) - set(dir(axes)))
|
|
241
|
+
|
|
242
|
+
is_compatible = np.all([kk in set(dir(msubplots)) for kk in set(dir(counter_part))])
|
|
243
|
+
if is_compatible:
|
|
244
|
+
print(f"{msubplots.__name__} is compatible with {counter_part.__name__}")
|
|
245
|
+
else:
|
|
246
|
+
print(f"{msubplots.__name__} is incompatible with {counter_part.__name__}")
|
|
247
|
+
"""
|
|
248
|
+
|
|
249
|
+
# EOF
|