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,295 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-19 08:49:35 (ywatanabe)"
|
|
4
|
+
# File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/utils/_configure_mpl.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/utils/_configure_mpl.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
from typing import Any, Dict, Tuple, Union
|
|
13
|
+
|
|
14
|
+
import matplotlib.pyplot as plt
|
|
15
|
+
import scitex
|
|
16
|
+
import numpy as np
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def configure_mpl(
|
|
20
|
+
plt,
|
|
21
|
+
fig_size_mm=(160, 100),
|
|
22
|
+
fig_scale=1.0,
|
|
23
|
+
dpi_display=100,
|
|
24
|
+
dpi_save=300,
|
|
25
|
+
fontsize="medium",
|
|
26
|
+
autolayout=True,
|
|
27
|
+
n_ticks=4,
|
|
28
|
+
hide_top_right_spines=True,
|
|
29
|
+
line_width=1.0, # Increased from 0.5 for better visibility
|
|
30
|
+
alpha=0.85, # Adjusted for better contrast
|
|
31
|
+
enable_latex=True, # Enable LaTeX rendering by default
|
|
32
|
+
latex_preamble=None, # Custom LaTeX preamble
|
|
33
|
+
verbose=False,
|
|
34
|
+
**kwargs,
|
|
35
|
+
) -> Tuple[Any, Dict]:
|
|
36
|
+
"""Configures Matplotlib settings for publication-quality plots.
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
plt : matplotlib.pyplot
|
|
41
|
+
Matplotlib pyplot module
|
|
42
|
+
fig_size_mm : tuple of int, optional
|
|
43
|
+
Figure width and height in millimeters, by default (160, 100)
|
|
44
|
+
fig_scale : float, optional
|
|
45
|
+
Scaling factor for figure size, by default 1.0
|
|
46
|
+
dpi_display : int, optional
|
|
47
|
+
Display resolution in DPI, by default 100
|
|
48
|
+
dpi_save : int, optional
|
|
49
|
+
Saving resolution in DPI, by default 300
|
|
50
|
+
fontsize : Union[str, int, float], optional
|
|
51
|
+
Base font size ('xx-small' to 'xx-large' or points), by default 'medium'
|
|
52
|
+
Other sizes are derived from this:
|
|
53
|
+
- Title: 125% of base
|
|
54
|
+
- Labels: 100% of base
|
|
55
|
+
- Ticks/Legend: 85% of base
|
|
56
|
+
autolayout : bool, optional
|
|
57
|
+
Whether to enable automatic tight layout, by default True
|
|
58
|
+
hide_top_right_spines : bool, optional
|
|
59
|
+
Whether to hide top and right spines, by default True
|
|
60
|
+
line_width : float, optional
|
|
61
|
+
Default line width, by default 1.0
|
|
62
|
+
alpha : float, optional
|
|
63
|
+
Color transparency, by default 0.85
|
|
64
|
+
n_ticks : int, optional
|
|
65
|
+
Number of ticks on each axis, by default 4
|
|
66
|
+
verbose : bool, optional
|
|
67
|
+
Whether to print configuration details, by default False
|
|
68
|
+
|
|
69
|
+
Returns
|
|
70
|
+
-------
|
|
71
|
+
tuple
|
|
72
|
+
(plt, dict of RGBA colors)
|
|
73
|
+
"""
|
|
74
|
+
# Convert base font size
|
|
75
|
+
base_size = _convert_font_size(fontsize)
|
|
76
|
+
|
|
77
|
+
# Ensure minimum sizes for different elements with better proportions
|
|
78
|
+
title_size = max(base_size * 1.25, 10.0) # Increased for better hierarchy
|
|
79
|
+
label_size = max(base_size * 1.0, 9.0) # Minimum 9pt for good readability
|
|
80
|
+
small_size = max(base_size * 0.85, 8.0) # Increased ratio for better legibility
|
|
81
|
+
|
|
82
|
+
# Colors
|
|
83
|
+
RGBA = {
|
|
84
|
+
k: scitex.plt.color.update_alpha(v, alpha)
|
|
85
|
+
for k, v in scitex.plt.color.PARAMS["RGBA"].items()
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
RGBA_NORM = {
|
|
89
|
+
k: tuple(scitex.plt.color.update_alpha(v, alpha))
|
|
90
|
+
for k, v in scitex.plt.color.PARAMS["RGBA_NORM"].items()
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
RGBA_NORM_FOR_CYCLE = {
|
|
94
|
+
k: tuple(scitex.plt.color.update_alpha(v, alpha))
|
|
95
|
+
for k, v in scitex.plt.color.PARAMS["RGBA_NORM_FOR_CYCLE"].items()
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
# Normalize figure size from mm to inches
|
|
99
|
+
figsize_inch = (
|
|
100
|
+
fig_size_mm[0] / 25.4 * fig_scale,
|
|
101
|
+
fig_size_mm[1] / 25.4 * fig_scale,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Prepare matplotlib configuration
|
|
105
|
+
mpl_config = {
|
|
106
|
+
# Resolution
|
|
107
|
+
"figure.dpi": dpi_display,
|
|
108
|
+
"savefig.dpi": dpi_save,
|
|
109
|
+
# Figure Size
|
|
110
|
+
"figure.figsize": figsize_inch,
|
|
111
|
+
# Font Sizes
|
|
112
|
+
"font.size": base_size,
|
|
113
|
+
"axes.titlesize": title_size,
|
|
114
|
+
"axes.labelsize": label_size,
|
|
115
|
+
"xtick.labelsize": small_size,
|
|
116
|
+
"ytick.labelsize": small_size,
|
|
117
|
+
"legend.fontsize": small_size,
|
|
118
|
+
# Auto Layout
|
|
119
|
+
"figure.autolayout": autolayout,
|
|
120
|
+
# Top and Right Axes
|
|
121
|
+
"axes.spines.top": not hide_top_right_spines,
|
|
122
|
+
"axes.spines.right": not hide_top_right_spines,
|
|
123
|
+
# Spine width
|
|
124
|
+
"axes.linewidth": 0.8, # Slightly thicker axes lines
|
|
125
|
+
# Custom color cycle
|
|
126
|
+
"axes.prop_cycle": plt.cycler(color=list(RGBA_NORM_FOR_CYCLE.values())),
|
|
127
|
+
# Line
|
|
128
|
+
"lines.linewidth": line_width,
|
|
129
|
+
"lines.markersize": 6.0, # Better default marker size
|
|
130
|
+
# Grid (if used)
|
|
131
|
+
"grid.linewidth": 0.6,
|
|
132
|
+
"grid.alpha": 0.3,
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
# Configure LaTeX rendering if enabled with enhanced fallback
|
|
136
|
+
if enable_latex:
|
|
137
|
+
latex_success = False
|
|
138
|
+
try:
|
|
139
|
+
# Try to enable LaTeX rendering
|
|
140
|
+
test_config = {
|
|
141
|
+
"text.usetex": True,
|
|
142
|
+
"text.latex.preamble": latex_preamble or r"\usepackage{amsmath}\usepackage{amssymb}",
|
|
143
|
+
"font.family": "serif",
|
|
144
|
+
"font.serif": ["Computer Modern Roman"],
|
|
145
|
+
"mathtext.fontset": "cm",
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
# Test LaTeX capability before applying
|
|
149
|
+
with plt.rc_context(test_config):
|
|
150
|
+
try:
|
|
151
|
+
# Create a test figure to verify LaTeX works
|
|
152
|
+
fig, ax = plt.subplots(figsize=(1, 1))
|
|
153
|
+
ax.text(0.5, 0.5, r'$x^2 + y^2 = r^2$', usetex=True)
|
|
154
|
+
fig.canvas.draw() # Force rendering
|
|
155
|
+
plt.close(fig)
|
|
156
|
+
latex_success = True
|
|
157
|
+
except Exception as latex_error:
|
|
158
|
+
plt.close(fig)
|
|
159
|
+
if verbose:
|
|
160
|
+
print(f"⚠️ LaTeX test render failed: {latex_error}")
|
|
161
|
+
raise latex_error
|
|
162
|
+
|
|
163
|
+
if latex_success:
|
|
164
|
+
mpl_config.update(test_config)
|
|
165
|
+
if verbose:
|
|
166
|
+
print("✅ LaTeX rendering enabled and tested")
|
|
167
|
+
|
|
168
|
+
except Exception as e:
|
|
169
|
+
if verbose:
|
|
170
|
+
print(f"⚠️ LaTeX rendering failed, falling back to mathtext: {e}")
|
|
171
|
+
print(" This may be due to missing LaTeX fonts or Node.js conflicts")
|
|
172
|
+
|
|
173
|
+
# Enhanced fallback to mathtext with better configuration
|
|
174
|
+
mpl_config.update({
|
|
175
|
+
"text.usetex": False,
|
|
176
|
+
"mathtext.default": "regular",
|
|
177
|
+
"font.family": "serif",
|
|
178
|
+
"mathtext.fontset": "cm",
|
|
179
|
+
"mathtext.fallback": "cm", # Fallback font for missing symbols
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
# Enable LaTeX fallback mode in the str module
|
|
183
|
+
try:
|
|
184
|
+
from scitex.str._latex_fallback import set_fallback_mode
|
|
185
|
+
set_fallback_mode("force_mathtext")
|
|
186
|
+
if verbose:
|
|
187
|
+
print("📝 Enabled automatic LaTeX fallback mode")
|
|
188
|
+
except ImportError:
|
|
189
|
+
if verbose:
|
|
190
|
+
print("⚠️ LaTeX fallback module not available")
|
|
191
|
+
|
|
192
|
+
else:
|
|
193
|
+
# Use mathtext only with enhanced configuration
|
|
194
|
+
mpl_config.update({
|
|
195
|
+
"text.usetex": False,
|
|
196
|
+
"mathtext.default": "regular",
|
|
197
|
+
"mathtext.fontset": "cm",
|
|
198
|
+
"mathtext.fallback": "cm",
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
# Set fallback mode to mathtext
|
|
202
|
+
try:
|
|
203
|
+
from scitex.str._latex_fallback import set_fallback_mode
|
|
204
|
+
set_fallback_mode("force_mathtext")
|
|
205
|
+
except ImportError:
|
|
206
|
+
pass
|
|
207
|
+
|
|
208
|
+
# Update Matplotlib configuration
|
|
209
|
+
plt.rcParams.update(mpl_config)
|
|
210
|
+
|
|
211
|
+
if verbose:
|
|
212
|
+
print("\n" + "-" * 40)
|
|
213
|
+
print("Matplotlib has been configured as follows:\n")
|
|
214
|
+
print(f"Figure DPI (Display): {dpi_display} DPI")
|
|
215
|
+
print(f"Figure DPI (Save): {dpi_save} DPI")
|
|
216
|
+
print(
|
|
217
|
+
f"Figure Size (Not the Axis Size): "
|
|
218
|
+
f"{fig_size_mm[0] * fig_scale:.1f} x "
|
|
219
|
+
f"{fig_size_mm[1] * fig_scale:.1f} mm (width x height)"
|
|
220
|
+
)
|
|
221
|
+
print("\nFont Sizes:")
|
|
222
|
+
print(f" Base Size: {base_size:.1f}pt")
|
|
223
|
+
print(f" Title: {title_size:.1f}pt (125% of base, min 10pt)")
|
|
224
|
+
print(f" Axis Labels: {label_size:.1f}pt (100% of base, min 9pt)")
|
|
225
|
+
print(f" Tick Labels: {small_size:.1f}pt (85% of base, min 8pt)")
|
|
226
|
+
print(f" Legend: {small_size:.1f}pt (85% of base, min 8pt)")
|
|
227
|
+
print(f"\nHide Top and Right Axes: {hide_top_right_spines}")
|
|
228
|
+
print(f"Line Width: {line_width}")
|
|
229
|
+
# print(f"Number of Ticks: {n_ticks}")
|
|
230
|
+
print(f"\nCustom Colors (RGBA):")
|
|
231
|
+
for color_str, rgba in RGBA.items():
|
|
232
|
+
print(f" {color_str}: {rgba}")
|
|
233
|
+
print("-" * 40)
|
|
234
|
+
|
|
235
|
+
# Store n_ticks for later use
|
|
236
|
+
plt._n_ticks = n_ticks
|
|
237
|
+
|
|
238
|
+
# Add a utility function to plt
|
|
239
|
+
def set_n_ticks(ax, n=None):
|
|
240
|
+
if n is None:
|
|
241
|
+
n = plt._n_ticks
|
|
242
|
+
ax.xaxis.set_major_locator(plt.MaxNLocator(n))
|
|
243
|
+
ax.yaxis.set_major_locator(plt.MaxNLocator(n))
|
|
244
|
+
|
|
245
|
+
plt.set_n_ticks = set_n_ticks
|
|
246
|
+
|
|
247
|
+
return plt, RGBA_NORM
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _convert_font_size(size: Union[str, int, float]) -> float:
|
|
251
|
+
"""Converts various font size specifications to numerical values.
|
|
252
|
+
|
|
253
|
+
Parameters
|
|
254
|
+
----------
|
|
255
|
+
size : Union[str, int, float]
|
|
256
|
+
Font size specification. Can be:
|
|
257
|
+
- String: 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'
|
|
258
|
+
- Numeric: direct point size value
|
|
259
|
+
|
|
260
|
+
Returns
|
|
261
|
+
-------
|
|
262
|
+
float
|
|
263
|
+
Font size in points
|
|
264
|
+
"""
|
|
265
|
+
if isinstance(size, str):
|
|
266
|
+
size_map = {
|
|
267
|
+
"xx-small": 9,
|
|
268
|
+
"x-small": 11,
|
|
269
|
+
"small": 13,
|
|
270
|
+
"medium": 15,
|
|
271
|
+
"large": 18,
|
|
272
|
+
"x-large": 22,
|
|
273
|
+
"xx-large": 26,
|
|
274
|
+
}
|
|
275
|
+
return size_map.get(size.lower(), 15)
|
|
276
|
+
elif isinstance(size, (int, float)):
|
|
277
|
+
return max(float(size), 9.0) # Ensure minimum size of 9
|
|
278
|
+
else:
|
|
279
|
+
raise ValueError(f"Unsupported font size type: {type(size)}")
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
if __name__ == "__main__":
|
|
283
|
+
plt, CC = configure_mpl(plt)
|
|
284
|
+
fig, axes = plt.subplots(nrows=2, sharex=True, sharey=True)
|
|
285
|
+
x = np.linspace(0, 10, 100)
|
|
286
|
+
for idx_cc, cc_str in enumerate(CC):
|
|
287
|
+
phase_shift = idx_cc * np.pi / len(CC)
|
|
288
|
+
y = np.sin(x + phase_shift)
|
|
289
|
+
axes[0].plot(x, y, label="Default color cycle")
|
|
290
|
+
axes[1].plot(x, y, color=CC[cc_str], label=f"{cc_str}")
|
|
291
|
+
axes[0].legend()
|
|
292
|
+
axes[1].legend()
|
|
293
|
+
plt.show()
|
|
294
|
+
|
|
295
|
+
# EOF
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/utils/_histogram_utils.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/utils/_histogram_utils.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
from typing import List, Tuple, Union, Optional, Dict
|
|
15
|
+
|
|
16
|
+
class HistogramBinManager:
|
|
17
|
+
"""
|
|
18
|
+
Utility class to manage histogram bin alignment across multiple histograms.
|
|
19
|
+
|
|
20
|
+
This class maintains a registry of histograms and their bin configurations
|
|
21
|
+
for each axis, allowing histograms on the same axis to use consistent binning.
|
|
22
|
+
|
|
23
|
+
Attributes:
|
|
24
|
+
_axis_registry (Dict): Registry of bin configurations by axis ID
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(self):
|
|
28
|
+
self._axis_registry = {}
|
|
29
|
+
|
|
30
|
+
def register_histogram(self,
|
|
31
|
+
axis_id: str,
|
|
32
|
+
hist_id: str,
|
|
33
|
+
data: np.ndarray,
|
|
34
|
+
bins: Union[int, str, np.ndarray] = 10,
|
|
35
|
+
range: Optional[Tuple[float, float]] = None):
|
|
36
|
+
"""
|
|
37
|
+
Register a histogram with the bin manager.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
axis_id (str): Identifier for the axis
|
|
41
|
+
hist_id (str): Identifier for the histogram
|
|
42
|
+
data (np.ndarray): The data array for the histogram
|
|
43
|
+
bins (Union[int, str, np.ndarray]): Number of bins or bin edges
|
|
44
|
+
range (Optional[Tuple[float, float]]): Range of the histogram
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
Tuple[int, Tuple[float, float]]: Consistent bins and range for the axis
|
|
48
|
+
"""
|
|
49
|
+
# Initialize registry for this axis if needed
|
|
50
|
+
if axis_id not in self._axis_registry:
|
|
51
|
+
self._axis_registry[axis_id] = {
|
|
52
|
+
'histograms': {},
|
|
53
|
+
'common_config': None
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Calculate data range if not provided
|
|
57
|
+
if range is None:
|
|
58
|
+
range = (np.min(data), np.max(data))
|
|
59
|
+
|
|
60
|
+
# Store histogram info in registry
|
|
61
|
+
self._axis_registry[axis_id]['histograms'][hist_id] = {
|
|
62
|
+
'data': data,
|
|
63
|
+
'bins': bins,
|
|
64
|
+
'range': range
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
# Calculate common configuration if needed
|
|
68
|
+
if self._axis_registry[axis_id]['common_config'] is None:
|
|
69
|
+
self._update_common_config(axis_id)
|
|
70
|
+
|
|
71
|
+
return self._axis_registry[axis_id]['common_config']
|
|
72
|
+
|
|
73
|
+
def _update_common_config(self, axis_id: str):
|
|
74
|
+
"""
|
|
75
|
+
Update the common bin configuration for an axis.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
axis_id (str): Identifier for the axis
|
|
79
|
+
"""
|
|
80
|
+
histograms = self._axis_registry[axis_id]['histograms']
|
|
81
|
+
|
|
82
|
+
if not histograms:
|
|
83
|
+
return
|
|
84
|
+
|
|
85
|
+
# Find common range across all histograms on this axis
|
|
86
|
+
min_val = min(hist['range'][0] for hist in histograms.values())
|
|
87
|
+
max_val = max(hist['range'][1] for hist in histograms.values())
|
|
88
|
+
|
|
89
|
+
# Use maximum number of bins from all histograms
|
|
90
|
+
# (if any histogram uses a string or array for bins, this gets more complex)
|
|
91
|
+
bins_values = [hist['bins'] for hist in histograms.values()
|
|
92
|
+
if isinstance(hist['bins'], int)]
|
|
93
|
+
|
|
94
|
+
# Default to 10 bins if no integer bin counts
|
|
95
|
+
n_bins = max(bins_values) if bins_values else 10
|
|
96
|
+
|
|
97
|
+
# Set common configuration
|
|
98
|
+
self._axis_registry[axis_id]['common_config'] = (n_bins, (min_val, max_val))
|
|
99
|
+
|
|
100
|
+
def get_common_config(self, axis_id: str) -> Tuple[int, Tuple[float, float]]:
|
|
101
|
+
"""
|
|
102
|
+
Get the common bin configuration for an axis.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
axis_id (str): Identifier for the axis
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
Tuple[int, Tuple[float, float]]: Common bins and range for the axis
|
|
109
|
+
"""
|
|
110
|
+
if axis_id in self._axis_registry:
|
|
111
|
+
return self._axis_registry[axis_id]['common_config']
|
|
112
|
+
|
|
113
|
+
# Default if axis not registered
|
|
114
|
+
return (10, (0, 1))
|
|
115
|
+
|
|
116
|
+
def clear_axis(self, axis_id: str):
|
|
117
|
+
"""
|
|
118
|
+
Clear registry for a specific axis.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
axis_id (str): Identifier for the axis to clear
|
|
122
|
+
"""
|
|
123
|
+
if axis_id in self._axis_registry:
|
|
124
|
+
del self._axis_registry[axis_id]
|
|
125
|
+
|
|
126
|
+
def clear_all(self):
|
|
127
|
+
"""Clear the entire registry."""
|
|
128
|
+
self._axis_registry = {}
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# Global instance
|
|
132
|
+
histogram_bin_manager = HistogramBinManager()
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-01 23:21:22 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_im2grid.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/_im2grid.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
from PIL import Image
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def im2grid(image_paths, default_color=(255, 255, 255)):
|
|
16
|
+
"""
|
|
17
|
+
Create a grid of images from a 2D NumPy array of image paths.
|
|
18
|
+
Skips positions where image_paths is None.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
image_paths (2D numpy array of str or None): Array of image file paths or None for empty slots
|
|
22
|
+
default_color (tuple): RGB color tuple for empty spaces
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
PIL.Image: A new image consisting of the grid of images
|
|
26
|
+
"""
|
|
27
|
+
from scitex.io import load as scitex_io_load
|
|
28
|
+
|
|
29
|
+
nrows, ncols = image_paths.shape
|
|
30
|
+
|
|
31
|
+
# Load images, skip None paths
|
|
32
|
+
images = []
|
|
33
|
+
for row in image_paths:
|
|
34
|
+
row_images = []
|
|
35
|
+
for path in row:
|
|
36
|
+
if path is not None:
|
|
37
|
+
# img = Image.open(path)
|
|
38
|
+
img = scitex_io_load(path)
|
|
39
|
+
else:
|
|
40
|
+
img = None
|
|
41
|
+
row_images.append(img)
|
|
42
|
+
images.append(row_images)
|
|
43
|
+
|
|
44
|
+
# Assuming all images are the same size, use the first non-None image to determine size
|
|
45
|
+
for row in images:
|
|
46
|
+
for img in row:
|
|
47
|
+
if img is not None:
|
|
48
|
+
img_width, img_height = img.size
|
|
49
|
+
break
|
|
50
|
+
else:
|
|
51
|
+
continue
|
|
52
|
+
break
|
|
53
|
+
else:
|
|
54
|
+
raise ValueError("All image paths are None.")
|
|
55
|
+
|
|
56
|
+
# Create a new image with the total size
|
|
57
|
+
grid_width = img_width * ncols
|
|
58
|
+
grid_height = img_height * nrows
|
|
59
|
+
grid_image = Image.new("RGB", (grid_width, grid_height), default_color)
|
|
60
|
+
|
|
61
|
+
# Paste images into the grid
|
|
62
|
+
for y, row in enumerate(images):
|
|
63
|
+
for x, img in enumerate(row):
|
|
64
|
+
if img is not None:
|
|
65
|
+
grid_image.paste(img, (x * img_width, y * img_height))
|
|
66
|
+
|
|
67
|
+
return grid_image
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# EOF
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 15:12:10 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/utils/_is_valid_axis.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/utils/_is_valid_axis.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import inspect
|
|
14
|
+
import matplotlib
|
|
15
|
+
|
|
16
|
+
def is_valid_axis(axis):
|
|
17
|
+
"""
|
|
18
|
+
Check if the provided object is a valid axis (matplotlib Axes or scitex AxisWrapper).
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
axis : object
|
|
23
|
+
The object to check
|
|
24
|
+
|
|
25
|
+
Returns
|
|
26
|
+
-------
|
|
27
|
+
bool
|
|
28
|
+
True if the object is a valid axis, False otherwise
|
|
29
|
+
|
|
30
|
+
Examples
|
|
31
|
+
--------
|
|
32
|
+
>>> import matplotlib.pyplot as plt
|
|
33
|
+
>>> import scitex
|
|
34
|
+
>>> fig, ax = plt.subplots()
|
|
35
|
+
>>> is_valid_axis(ax)
|
|
36
|
+
True
|
|
37
|
+
>>> mfig, max = scitex.plt.subplots()
|
|
38
|
+
>>> is_valid_axis(max)
|
|
39
|
+
True
|
|
40
|
+
"""
|
|
41
|
+
# Check if it's a matplotlib Axes directly
|
|
42
|
+
if isinstance(axis, matplotlib.axes._axes.Axes):
|
|
43
|
+
return True
|
|
44
|
+
|
|
45
|
+
# Check if it's an AxisWrapper from scitex
|
|
46
|
+
# This checks the class hierarchy to see if it has an AxisWrapper in its inheritance chain
|
|
47
|
+
for cls in inspect.getmro(type(axis)):
|
|
48
|
+
if cls.__name__ == 'AxisWrapper':
|
|
49
|
+
return True
|
|
50
|
+
|
|
51
|
+
# Check if it has common axis methods (fallback check)
|
|
52
|
+
axis_methods = ['plot', 'scatter', 'set_xlabel', 'set_ylabel', 'get_figure']
|
|
53
|
+
has_methods = all(hasattr(axis, method) for method in axis_methods)
|
|
54
|
+
|
|
55
|
+
return has_methods
|
|
56
|
+
|
|
57
|
+
def assert_valid_axis(axis, error_message=None):
|
|
58
|
+
"""
|
|
59
|
+
Assert that the provided object is a valid axis (matplotlib Axes or scitex AxisWrapper).
|
|
60
|
+
|
|
61
|
+
Parameters
|
|
62
|
+
----------
|
|
63
|
+
axis : object
|
|
64
|
+
The object to check
|
|
65
|
+
error_message : str, optional
|
|
66
|
+
Custom error message if assertion fails
|
|
67
|
+
|
|
68
|
+
Raises
|
|
69
|
+
------
|
|
70
|
+
AssertionError
|
|
71
|
+
If the provided object is not a valid axis
|
|
72
|
+
"""
|
|
73
|
+
if error_message is None:
|
|
74
|
+
error_message = "First argument must be a matplotlib axis or scitex axis wrapper"
|
|
75
|
+
|
|
76
|
+
assert is_valid_axis(axis), error_message
|
|
77
|
+
|
|
78
|
+
# EOF
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-03 01:09:23 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/utils/_mk_colorbar.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/utils/_mk_colorbar.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
# def mk_colorbar(start="white", end="blue"):
|
|
13
|
+
# xx = np.linspace(0, 1, 256)
|
|
14
|
+
|
|
15
|
+
# start = np.array(scitex.plt.colors.RGB[start])
|
|
16
|
+
# end = np.array(scitex.plt.colors.RGB[end])
|
|
17
|
+
# colors = (end - start)[:, np.newaxis] * xx
|
|
18
|
+
|
|
19
|
+
# colors -= colors.min()
|
|
20
|
+
# colors /= colors.max()
|
|
21
|
+
|
|
22
|
+
# fig, ax = plt.subplots()
|
|
23
|
+
# [ax.axvline(_xx, color=colors[:, i_xx]) for i_xx, _xx in enumerate(xx)]
|
|
24
|
+
# ax.xaxis.set_ticks_position("none")
|
|
25
|
+
# ax.yaxis.set_ticks_position("none")
|
|
26
|
+
# ax.set_aspect(0.2)
|
|
27
|
+
# return fig
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def mk_colorbar(start="white", end="blue"):
|
|
31
|
+
"""Create a colorbar gradient between two colors.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
start (str): Starting color name
|
|
35
|
+
end (str): Ending color name
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
matplotlib.figure.Figure: Figure with colorbar
|
|
39
|
+
"""
|
|
40
|
+
import matplotlib.colors as mcolors
|
|
41
|
+
import matplotlib.pyplot as plt
|
|
42
|
+
import numpy as np
|
|
43
|
+
|
|
44
|
+
# import scitex
|
|
45
|
+
from scitex.plt.color._PARAMS import RGB
|
|
46
|
+
|
|
47
|
+
# Get RGB values for start and end colors
|
|
48
|
+
start_rgb = RGB[start]
|
|
49
|
+
end_rgb = RGB[end]
|
|
50
|
+
|
|
51
|
+
# Create a colormap
|
|
52
|
+
colors = [start_rgb, end_rgb]
|
|
53
|
+
cmap = mcolors.LinearSegmentedColormap.from_list("custom_cmap", colors, N=256)
|
|
54
|
+
|
|
55
|
+
# Create the figure and plot the colorbar
|
|
56
|
+
fig, ax = plt.subplots(figsize=(6, 1))
|
|
57
|
+
gradient = np.linspace(0, 1, 256).reshape(1, -1)
|
|
58
|
+
ax.imshow(gradient, aspect="auto", cmap=cmap)
|
|
59
|
+
ax.set_xticks([])
|
|
60
|
+
ax.set_yticks([])
|
|
61
|
+
|
|
62
|
+
return fig
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# EOF
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-30 21:18:45 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_mk_patches.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/_mk_patches.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib.patches as mpatches
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def mk_patches(colors, labels):
|
|
16
|
+
"""
|
|
17
|
+
colors = ["red", "blue"]
|
|
18
|
+
labels = ["label_1", "label_2"]
|
|
19
|
+
ax.legend(handles=scitex.plt.mk_patches(colors, labels))
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
patches = [mpatches.Patch(color=c, label=l) for c, l in zip(colors, labels)]
|
|
23
|
+
return patches
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# EOF
|