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,84 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-06-07 15:45:36 (ywatanabe)"
|
|
4
|
+
# File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/.claude-worktree/scitex_repo/src/scitex/plt/ax/_style/_hide_spines.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/ax/_style/_hide_spines.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
# Time-stamp: "2024-04-26 20:03:45 (ywatanabe)"
|
|
14
|
+
|
|
15
|
+
import matplotlib
|
|
16
|
+
from ....plt.utils import assert_valid_axis
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def hide_spines(
|
|
20
|
+
axis,
|
|
21
|
+
top=True,
|
|
22
|
+
bottom=False,
|
|
23
|
+
left=False,
|
|
24
|
+
right=True,
|
|
25
|
+
ticks=False,
|
|
26
|
+
labels=False,
|
|
27
|
+
):
|
|
28
|
+
"""
|
|
29
|
+
Hides the specified spines of a matplotlib Axes object or scitex axis wrapper and optionally removes the ticks and labels.
|
|
30
|
+
|
|
31
|
+
This function is designed to work with matplotlib Axes objects or scitex axis wrappers. It allows for a cleaner, more minimalist
|
|
32
|
+
presentation of plots by hiding the spines (the lines denoting the boundaries of the plot area) and optionally
|
|
33
|
+
removing the ticks and labels from the axes.
|
|
34
|
+
|
|
35
|
+
Arguments:
|
|
36
|
+
ax (matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper): The axis for which the spines will be hidden.
|
|
37
|
+
top (bool, optional): If True, hides the top spine. Defaults to True.
|
|
38
|
+
bottom (bool, optional): If True, hides the bottom spine. Defaults to False.
|
|
39
|
+
left (bool, optional): If True, hides the left spine. Defaults to False.
|
|
40
|
+
right (bool, optional): If True, hides the right spine. Defaults to True.
|
|
41
|
+
ticks (bool, optional): If True, removes the ticks from the hidden spines' axes. Defaults to False.
|
|
42
|
+
labels (bool, optional): If True, removes the labels from the hidden spines' axes. Defaults to False.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper: The modified axis with the specified spines hidden.
|
|
46
|
+
|
|
47
|
+
Example:
|
|
48
|
+
>>> fig, ax = plt.subplots()
|
|
49
|
+
>>> hide_spines(ax)
|
|
50
|
+
>>> plt.show()
|
|
51
|
+
"""
|
|
52
|
+
assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
53
|
+
|
|
54
|
+
tgts = []
|
|
55
|
+
if top:
|
|
56
|
+
tgts.append("top")
|
|
57
|
+
if bottom:
|
|
58
|
+
tgts.append("bottom")
|
|
59
|
+
if left:
|
|
60
|
+
tgts.append("left")
|
|
61
|
+
if right:
|
|
62
|
+
tgts.append("right")
|
|
63
|
+
|
|
64
|
+
for tgt in tgts:
|
|
65
|
+
# Spines
|
|
66
|
+
axis.spines[tgt].set_visible(False)
|
|
67
|
+
|
|
68
|
+
# Ticks
|
|
69
|
+
if ticks:
|
|
70
|
+
if tgt == "bottom":
|
|
71
|
+
axis.xaxis.set_ticks_position("none")
|
|
72
|
+
elif tgt == "left":
|
|
73
|
+
axis.yaxis.set_ticks_position("none")
|
|
74
|
+
|
|
75
|
+
# Labels
|
|
76
|
+
if labels:
|
|
77
|
+
if tgt == "bottom":
|
|
78
|
+
axis.set_xticklabels([])
|
|
79
|
+
elif tgt == "left":
|
|
80
|
+
axis.set_yticklabels([])
|
|
81
|
+
|
|
82
|
+
return axis
|
|
83
|
+
|
|
84
|
+
# EOF
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 09:00:56 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_style/_map_ticks.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_style/_map_ticks.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib
|
|
13
|
+
import matplotlib.pyplot as plt
|
|
14
|
+
import numpy as np
|
|
15
|
+
|
|
16
|
+
from ....plt.utils import assert_valid_axis
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def map_ticks(ax, src, tgt, axis="x"):
|
|
20
|
+
"""
|
|
21
|
+
Maps source tick positions or labels to new target labels on a matplotlib Axes object.
|
|
22
|
+
Supports both numeric positions and string labels for source ticks ('src'), enabling the mapping
|
|
23
|
+
to new target labels ('tgt'). This ensures only the specified target ticks are displayed on the
|
|
24
|
+
final axis, enhancing the clarity and readability of plots.
|
|
25
|
+
|
|
26
|
+
Parameters:
|
|
27
|
+
- ax (matplotlib.axes.Axes or scitex.plt._subplots._AxisWrapper.AxisWrapper): The Axes object to modify.
|
|
28
|
+
- src (list of str or numeric): Source positions (if numeric) or labels (if str) to map from.
|
|
29
|
+
When using string labels, ensure they match the current tick labels on the axis.
|
|
30
|
+
- tgt (list of str): New target labels to apply to the axis. Must have the same length as 'src'.
|
|
31
|
+
- axis (str): Specifies which axis to apply the tick modifications ('x' or 'y').
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
- ax (matplotlib.axes.Axes or scitex.plt._subplots._AxisWrapper.AxisWrapper): The modified Axes object with adjusted tick labels.
|
|
35
|
+
|
|
36
|
+
Examples:
|
|
37
|
+
--------
|
|
38
|
+
Numeric Example:
|
|
39
|
+
fig, ax = plt.subplots()
|
|
40
|
+
x = np.linspace(0, 2 * np.pi, 100)
|
|
41
|
+
y = np.sin(x)
|
|
42
|
+
ax.plot(x, y) # Plot a sine wave
|
|
43
|
+
src = [0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi] # Numeric src positions
|
|
44
|
+
tgt = ['0', 'π/2', 'π', '3π/2', '2π'] # Corresponding target labels
|
|
45
|
+
map_ticks(ax, src, tgt, axis="x") # Map src to tgt on the x-axis
|
|
46
|
+
plt.show()
|
|
47
|
+
|
|
48
|
+
String Example:
|
|
49
|
+
fig, ax = plt.subplots()
|
|
50
|
+
categories = ['A', 'B', 'C', 'D', 'E'] # Initial categories
|
|
51
|
+
values = [1, 3, 2, 5, 4]
|
|
52
|
+
ax.bar(categories, values) # Bar plot with string labels
|
|
53
|
+
src = ['A', 'B', 'C', 'D', 'E'] # Source labels to map from
|
|
54
|
+
tgt = ['Alpha', 'Beta', 'Gamma', 'Delta', 'Epsilon'] # New target labels
|
|
55
|
+
map_ticks(ax, src, tgt, axis="x") # Apply the mapping
|
|
56
|
+
plt.show()
|
|
57
|
+
"""
|
|
58
|
+
assert_valid_axis(ax, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
59
|
+
|
|
60
|
+
if len(src) != len(tgt):
|
|
61
|
+
raise ValueError(
|
|
62
|
+
"Source ('src') and target ('tgt') must have the same number of elements."
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Determine tick positions if src is string data
|
|
66
|
+
if all(isinstance(item, str) for item in src):
|
|
67
|
+
if axis == "x":
|
|
68
|
+
all_labels = [label.get_text() for label in ax.get_xticklabels()]
|
|
69
|
+
else:
|
|
70
|
+
all_labels = [label.get_text() for label in ax.get_yticklabels()]
|
|
71
|
+
|
|
72
|
+
# Find positions of src labels
|
|
73
|
+
src_positions = [all_labels.index(s) for s in src if s in all_labels]
|
|
74
|
+
else:
|
|
75
|
+
# Use src as positions directly if numeric
|
|
76
|
+
src_positions = src
|
|
77
|
+
|
|
78
|
+
# Set the ticks and labels based on the specified axis
|
|
79
|
+
if axis == "x":
|
|
80
|
+
ax.set_xticks(src_positions)
|
|
81
|
+
ax.set_xticklabels(tgt)
|
|
82
|
+
elif axis == "y":
|
|
83
|
+
ax.set_yticks(src_positions)
|
|
84
|
+
ax.set_yticklabels(tgt)
|
|
85
|
+
else:
|
|
86
|
+
raise ValueError("Invalid axis argument. Use 'x' or 'y'.")
|
|
87
|
+
|
|
88
|
+
return ax
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def numeric_example():
|
|
92
|
+
"""Example demonstrating numeric tick mapping.
|
|
93
|
+
|
|
94
|
+
Shows how to replace numeric tick positions with custom labels,
|
|
95
|
+
such as replacing radian values with pi notation in trigonometric plots.
|
|
96
|
+
|
|
97
|
+
Returns
|
|
98
|
+
-------
|
|
99
|
+
matplotlib.figure.Figure
|
|
100
|
+
Figure with two subplots showing before and after tick mapping.
|
|
101
|
+
|
|
102
|
+
Examples
|
|
103
|
+
--------
|
|
104
|
+
>>> fig = numeric_example()
|
|
105
|
+
>>> plt.show()
|
|
106
|
+
|
|
107
|
+
Notes
|
|
108
|
+
-----
|
|
109
|
+
The top subplot shows original numeric labels, while the bottom
|
|
110
|
+
subplot shows the same data with custom pi notation labels.
|
|
111
|
+
"""
|
|
112
|
+
fig, axs = plt.subplots(2, 1, figsize=(10, 6)) # Two rows, one column
|
|
113
|
+
|
|
114
|
+
# Original plot
|
|
115
|
+
x = np.linspace(0, 2 * np.pi, 100)
|
|
116
|
+
y = np.sin(x)
|
|
117
|
+
axs[0].plot(x, y) # Plot a sine wave on the first row
|
|
118
|
+
axs[0].set_title("Original Numeric Labels")
|
|
119
|
+
|
|
120
|
+
# Numeric src positions for ticks (e.g., multiples of pi) and target labels
|
|
121
|
+
src = [0, np.pi / 2, np.pi, 3 * np.pi / 2, 2 * np.pi]
|
|
122
|
+
tgt = ["0", "π/2", "π", "3π/2", "2π"]
|
|
123
|
+
|
|
124
|
+
# Plot with mapped ticks
|
|
125
|
+
axs[1].plot(x, y) # Plot again on the second row for mapped labels
|
|
126
|
+
map_ticks(axs[1], src, tgt, axis="x")
|
|
127
|
+
axs[1].set_title("Mapped Numeric Labels")
|
|
128
|
+
|
|
129
|
+
return fig
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def string_example():
|
|
133
|
+
"""Example demonstrating string tick mapping.
|
|
134
|
+
|
|
135
|
+
Shows how to replace categorical string labels with more descriptive
|
|
136
|
+
alternatives, useful for improving plot readability.
|
|
137
|
+
|
|
138
|
+
Returns
|
|
139
|
+
-------
|
|
140
|
+
matplotlib.figure.Figure
|
|
141
|
+
Figure with two subplots showing before and after tick mapping.
|
|
142
|
+
|
|
143
|
+
Examples
|
|
144
|
+
--------
|
|
145
|
+
>>> fig = string_example()
|
|
146
|
+
>>> plt.show()
|
|
147
|
+
|
|
148
|
+
Notes
|
|
149
|
+
-----
|
|
150
|
+
The top subplot shows original short category labels (A, B, C...),
|
|
151
|
+
while the bottom subplot shows the same data with descriptive Greek
|
|
152
|
+
letter names.
|
|
153
|
+
"""
|
|
154
|
+
fig, axs = plt.subplots(2, 1, figsize=(10, 6)) # Two rows, one column
|
|
155
|
+
|
|
156
|
+
# Original plot with categorical string labels
|
|
157
|
+
categories = ["A", "B", "C", "D", "E"]
|
|
158
|
+
values = [1, 3, 2, 5, 4]
|
|
159
|
+
axs[0].bar(categories, values)
|
|
160
|
+
axs[0].set_title("Original String Labels")
|
|
161
|
+
|
|
162
|
+
# src as the existing labels to change and target labels
|
|
163
|
+
src = categories
|
|
164
|
+
tgt = ["Alpha", "Beta", "Gamma", "Delta", "Epsilon"]
|
|
165
|
+
|
|
166
|
+
# Plot with mapped string labels
|
|
167
|
+
axs[1].bar(categories, values) # Bar plot again on the second row for mapped labels
|
|
168
|
+
map_ticks(axs[1], src, tgt, axis="x")
|
|
169
|
+
axs[1].set_title("Mapped String Labels")
|
|
170
|
+
|
|
171
|
+
return fig
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
# Execute examples
|
|
175
|
+
if __name__ == "__main__":
|
|
176
|
+
fig_numeric = numeric_example()
|
|
177
|
+
fig_string = string_example()
|
|
178
|
+
|
|
179
|
+
plt.tight_layout()
|
|
180
|
+
plt.show()
|
|
181
|
+
|
|
182
|
+
# EOF
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-10-27 13:24:32 (ywatanabe)"
|
|
4
|
+
# /home/ywatanabe/proj/_scitex_repo_openhands/src/scitex/plt/ax/_rotate_labels.py
|
|
5
|
+
|
|
6
|
+
"""This script does XYZ."""
|
|
7
|
+
|
|
8
|
+
"""Imports"""
|
|
9
|
+
import numpy as np
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def rotate_labels(ax, x=45, y=45, x_ha=None, y_ha=None, x_va=None, y_va=None,
|
|
13
|
+
auto_adjust=True, scientific_convention=True):
|
|
14
|
+
"""
|
|
15
|
+
Rotate x and y axis labels of a matplotlib Axes object with automatic positioning.
|
|
16
|
+
|
|
17
|
+
Parameters
|
|
18
|
+
----------
|
|
19
|
+
ax : matplotlib.axes.Axes
|
|
20
|
+
The Axes object to modify.
|
|
21
|
+
x : float, optional
|
|
22
|
+
Rotation angle for x-axis labels in degrees. Default is 45.
|
|
23
|
+
y : float, optional
|
|
24
|
+
Rotation angle for y-axis labels in degrees. Default is 45.
|
|
25
|
+
x_ha : str, optional
|
|
26
|
+
Horizontal alignment for x-axis labels. If None, automatically determined.
|
|
27
|
+
y_ha : str, optional
|
|
28
|
+
Horizontal alignment for y-axis labels. If None, automatically determined.
|
|
29
|
+
x_va : str, optional
|
|
30
|
+
Vertical alignment for x-axis labels. If None, automatically determined.
|
|
31
|
+
y_va : str, optional
|
|
32
|
+
Vertical alignment for y-axis labels. If None, automatically determined.
|
|
33
|
+
auto_adjust : bool, optional
|
|
34
|
+
Whether to automatically adjust alignment based on rotation angle. Default is True.
|
|
35
|
+
scientific_convention : bool, optional
|
|
36
|
+
Whether to follow scientific plotting conventions. Default is True.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
matplotlib.axes.Axes
|
|
41
|
+
The modified Axes object.
|
|
42
|
+
|
|
43
|
+
Example
|
|
44
|
+
-------
|
|
45
|
+
fig, ax = plt.subplots()
|
|
46
|
+
ax.plot([1, 2, 3], [1, 2, 3])
|
|
47
|
+
rotate_labels(ax)
|
|
48
|
+
plt.show()
|
|
49
|
+
|
|
50
|
+
Notes
|
|
51
|
+
-----
|
|
52
|
+
Scientific conventions for label rotation:
|
|
53
|
+
- X-axis labels: For angles 0-90°, use 'right' alignment; for 90-180°, use 'left'
|
|
54
|
+
- Y-axis labels: For angles 0-90°, use 'center' alignment; adjust vertical as needed
|
|
55
|
+
- Optimal readability maintained through automatic positioning
|
|
56
|
+
"""
|
|
57
|
+
# Get current tick positions
|
|
58
|
+
xticks = ax.get_xticks()
|
|
59
|
+
yticks = ax.get_yticks()
|
|
60
|
+
|
|
61
|
+
# Set ticks explicitly
|
|
62
|
+
ax.set_xticks(xticks)
|
|
63
|
+
ax.set_yticks(yticks)
|
|
64
|
+
|
|
65
|
+
# Auto-adjust alignment based on rotation angle and scientific conventions
|
|
66
|
+
if auto_adjust:
|
|
67
|
+
x_ha, x_va = _get_optimal_alignment('x', x, x_ha, x_va, scientific_convention)
|
|
68
|
+
y_ha, y_va = _get_optimal_alignment('y', y, y_ha, y_va, scientific_convention)
|
|
69
|
+
|
|
70
|
+
# Apply defaults if not auto-adjusting
|
|
71
|
+
if x_ha is None:
|
|
72
|
+
x_ha = "center"
|
|
73
|
+
if y_ha is None:
|
|
74
|
+
y_ha = "center"
|
|
75
|
+
if x_va is None:
|
|
76
|
+
x_va = "center"
|
|
77
|
+
if y_va is None:
|
|
78
|
+
y_va = "center"
|
|
79
|
+
|
|
80
|
+
# Set labels with rotation and proper alignment
|
|
81
|
+
ax.set_xticklabels(ax.get_xticklabels(), rotation=x, ha=x_ha, va=x_va)
|
|
82
|
+
ax.set_yticklabels(ax.get_yticklabels(), rotation=y, ha=y_ha, va=y_va)
|
|
83
|
+
|
|
84
|
+
# Auto-adjust subplot parameters for better layout if needed
|
|
85
|
+
if auto_adjust and scientific_convention:
|
|
86
|
+
_adjust_subplot_params(ax, x, y)
|
|
87
|
+
|
|
88
|
+
return ax
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _get_optimal_alignment(axis, angle, ha, va, scientific_convention):
|
|
92
|
+
"""
|
|
93
|
+
Determine optimal alignment based on rotation angle and scientific conventions.
|
|
94
|
+
|
|
95
|
+
Parameters
|
|
96
|
+
----------
|
|
97
|
+
axis : str
|
|
98
|
+
'x' or 'y' axis
|
|
99
|
+
angle : float
|
|
100
|
+
Rotation angle in degrees
|
|
101
|
+
ha : str or None
|
|
102
|
+
Current horizontal alignment
|
|
103
|
+
va : str or None
|
|
104
|
+
Current vertical alignment
|
|
105
|
+
scientific_convention : bool
|
|
106
|
+
Whether to follow scientific conventions
|
|
107
|
+
|
|
108
|
+
Returns
|
|
109
|
+
-------
|
|
110
|
+
tuple
|
|
111
|
+
(horizontal_alignment, vertical_alignment)
|
|
112
|
+
"""
|
|
113
|
+
# Normalize angle to 0-360 range
|
|
114
|
+
angle = angle % 360
|
|
115
|
+
|
|
116
|
+
if axis == 'x':
|
|
117
|
+
if scientific_convention:
|
|
118
|
+
# Scientific convention for x-axis labels
|
|
119
|
+
if 0 <= angle <= 30:
|
|
120
|
+
ha = ha or 'center'
|
|
121
|
+
va = va or 'top'
|
|
122
|
+
elif 30 < angle <= 60:
|
|
123
|
+
ha = ha or 'right'
|
|
124
|
+
va = va or 'top'
|
|
125
|
+
elif 60 < angle <= 120:
|
|
126
|
+
ha = ha or 'right'
|
|
127
|
+
va = va or 'center'
|
|
128
|
+
elif 120 < angle <= 150:
|
|
129
|
+
ha = ha or 'right'
|
|
130
|
+
va = va or 'bottom'
|
|
131
|
+
elif 150 < angle <= 210:
|
|
132
|
+
ha = ha or 'center'
|
|
133
|
+
va = va or 'bottom'
|
|
134
|
+
elif 210 < angle <= 240:
|
|
135
|
+
ha = ha or 'left'
|
|
136
|
+
va = va or 'bottom'
|
|
137
|
+
elif 240 < angle <= 300:
|
|
138
|
+
ha = ha or 'left'
|
|
139
|
+
va = va or 'center'
|
|
140
|
+
else: # 300-360
|
|
141
|
+
ha = ha or 'left'
|
|
142
|
+
va = va or 'top'
|
|
143
|
+
else:
|
|
144
|
+
ha = ha or 'center'
|
|
145
|
+
va = va or 'top'
|
|
146
|
+
|
|
147
|
+
else: # y-axis
|
|
148
|
+
if scientific_convention:
|
|
149
|
+
# Scientific convention for y-axis labels
|
|
150
|
+
if 0 <= angle <= 30:
|
|
151
|
+
ha = ha or 'right'
|
|
152
|
+
va = va or 'center'
|
|
153
|
+
elif 30 < angle <= 60:
|
|
154
|
+
ha = ha or 'right'
|
|
155
|
+
va = va or 'bottom'
|
|
156
|
+
elif 60 < angle <= 120:
|
|
157
|
+
ha = ha or 'center'
|
|
158
|
+
va = va or 'bottom'
|
|
159
|
+
elif 120 < angle <= 150:
|
|
160
|
+
ha = ha or 'left'
|
|
161
|
+
va = va or 'bottom'
|
|
162
|
+
elif 150 < angle <= 210:
|
|
163
|
+
ha = ha or 'left'
|
|
164
|
+
va = va or 'center'
|
|
165
|
+
elif 210 < angle <= 240:
|
|
166
|
+
ha = ha or 'left'
|
|
167
|
+
va = va or 'top'
|
|
168
|
+
elif 240 < angle <= 300:
|
|
169
|
+
ha = ha or 'center'
|
|
170
|
+
va = va or 'top'
|
|
171
|
+
else: # 300-360
|
|
172
|
+
ha = ha or 'right'
|
|
173
|
+
va = va or 'top'
|
|
174
|
+
else:
|
|
175
|
+
ha = ha or 'center'
|
|
176
|
+
va = va or 'center'
|
|
177
|
+
|
|
178
|
+
return ha, va
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def _adjust_subplot_params(ax, x_angle, y_angle):
|
|
182
|
+
"""
|
|
183
|
+
Automatically adjust subplot parameters to accommodate rotated labels.
|
|
184
|
+
|
|
185
|
+
Parameters
|
|
186
|
+
----------
|
|
187
|
+
ax : matplotlib.axes.Axes
|
|
188
|
+
The axes object
|
|
189
|
+
x_angle : float
|
|
190
|
+
X-axis rotation angle
|
|
191
|
+
y_angle : float
|
|
192
|
+
Y-axis rotation angle
|
|
193
|
+
"""
|
|
194
|
+
fig = ax.get_figure()
|
|
195
|
+
|
|
196
|
+
# Calculate required margins based on rotation angles
|
|
197
|
+
x_margin_factor = abs(np.sin(np.radians(x_angle))) * 0.1
|
|
198
|
+
y_margin_factor = abs(np.sin(np.radians(y_angle))) * 0.15
|
|
199
|
+
|
|
200
|
+
# Get current subplot parameters
|
|
201
|
+
try:
|
|
202
|
+
subplotpars = fig.subplotpars
|
|
203
|
+
current_bottom = subplotpars.bottom
|
|
204
|
+
current_left = subplotpars.left
|
|
205
|
+
|
|
206
|
+
# Adjust margins if they need to be increased
|
|
207
|
+
new_bottom = max(current_bottom, 0.1 + x_margin_factor)
|
|
208
|
+
new_left = max(current_left, 0.1 + y_margin_factor)
|
|
209
|
+
|
|
210
|
+
# Only adjust if we're increasing the margins significantly
|
|
211
|
+
if new_bottom > current_bottom + 0.05 or new_left > current_left + 0.05:
|
|
212
|
+
fig.subplots_adjust(bottom=new_bottom, left=new_left)
|
|
213
|
+
except Exception:
|
|
214
|
+
# Skip adjustment if there are issues
|
|
215
|
+
pass
|