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,266 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 22:21:41 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_heatmap.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_plot/_plot_heatmap.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
|
+
|
|
17
|
+
def plot_heatmap(
|
|
18
|
+
ax,
|
|
19
|
+
data,
|
|
20
|
+
x_labels=None,
|
|
21
|
+
y_labels=None,
|
|
22
|
+
cmap="viridis",
|
|
23
|
+
cbar_label="ColorBar Label",
|
|
24
|
+
annot_format="{x:.1f}",
|
|
25
|
+
show_annot=True,
|
|
26
|
+
annot_color_lighter="black",
|
|
27
|
+
annot_color_darker="white",
|
|
28
|
+
**kwargs,
|
|
29
|
+
):
|
|
30
|
+
"""
|
|
31
|
+
Plot a heatmap on the given axes.
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
ax : matplotlib.axes.Axes
|
|
36
|
+
The axes to plot on
|
|
37
|
+
data : array-like
|
|
38
|
+
The 2D data to display as heatmap
|
|
39
|
+
x_labels : list, optional
|
|
40
|
+
Labels for the x-axis
|
|
41
|
+
y_labels : list, optional
|
|
42
|
+
Labels for the y-axis
|
|
43
|
+
cmap : str or matplotlib colormap, optional
|
|
44
|
+
Colormap to use, default "viridis"
|
|
45
|
+
cbar_label : str, optional
|
|
46
|
+
Label for the colorbar, default "ColorBar Label"
|
|
47
|
+
show_annot : bool, optional
|
|
48
|
+
Whether to annotate the heatmap with values, default True
|
|
49
|
+
annot_format : str, optional
|
|
50
|
+
Format string for annotations, default "{x:.1f}"
|
|
51
|
+
annot_color_lighter : str, optional
|
|
52
|
+
Color for annotations on lighter background, default "black"
|
|
53
|
+
annot_color_darker : str, optional
|
|
54
|
+
Color for annotations on darker background, default "white"
|
|
55
|
+
**kwargs
|
|
56
|
+
Additional keyword arguments passed to matplotlib.axes.Axes.imshow()
|
|
57
|
+
|
|
58
|
+
Returns
|
|
59
|
+
-------
|
|
60
|
+
im : matplotlib.image.AxesImage
|
|
61
|
+
The image object created by imshow
|
|
62
|
+
cbar : matplotlib.colorbar.Colorbar
|
|
63
|
+
The colorbar object
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
im, cbar = _mpl_heatmap(
|
|
67
|
+
data,
|
|
68
|
+
x_labels,
|
|
69
|
+
y_labels,
|
|
70
|
+
ax=ax,
|
|
71
|
+
cmap=cmap,
|
|
72
|
+
cbarlabel=cbar_label,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
if show_annot:
|
|
76
|
+
textcolors = _switch_annot_colors(cmap, annot_color_lighter, annot_color_darker)
|
|
77
|
+
texts = _mpl_annotate_heatmap(
|
|
78
|
+
im,
|
|
79
|
+
valfmt=annot_format,
|
|
80
|
+
textcolors=textcolors,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
return ax, im, cbar
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _switch_annot_colors(cmap, annot_color_lighter, annot_color_darker):
|
|
87
|
+
# Get colormap
|
|
88
|
+
cmap_obj = plt.cm.get_cmap(cmap)
|
|
89
|
+
|
|
90
|
+
# Sample the colormap at its extremes
|
|
91
|
+
dark_color = cmap_obj(0.1) # Not using 0.0 to avoid edge effects
|
|
92
|
+
light_color = cmap_obj(0.9) # Not using 1.0 to avoid edge effects
|
|
93
|
+
|
|
94
|
+
# Calculate perceived brightness
|
|
95
|
+
dark_brightness = (
|
|
96
|
+
0.2126 * dark_color[0] + 0.7152 * dark_color[1] + 0.0722 * dark_color[2]
|
|
97
|
+
)
|
|
98
|
+
light_brightness = (
|
|
99
|
+
0.2126 * light_color[0] + 0.7152 * light_color[1] + 0.0722 * light_color[2]
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# Choose text colors based on background brightness
|
|
103
|
+
if dark_brightness < 0.5:
|
|
104
|
+
return (annot_color_lighter, annot_color_darker)
|
|
105
|
+
else:
|
|
106
|
+
return (annot_color_darker, annot_color_lighter)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _mpl_heatmap(
|
|
110
|
+
data, row_labels, col_labels, ax=None, cbar_kw=None, cbarlabel="", **kwargs
|
|
111
|
+
):
|
|
112
|
+
"""
|
|
113
|
+
A function to annotate a heatmap.
|
|
114
|
+
|
|
115
|
+
Parameters
|
|
116
|
+
----------
|
|
117
|
+
im : matplotlib.image.AxesImage
|
|
118
|
+
The image to be annotated
|
|
119
|
+
data : array-like, optional
|
|
120
|
+
Data used to annotate. If None, the image's array is used
|
|
121
|
+
valfmt : str or matplotlib.ticker.Formatter, optional
|
|
122
|
+
Format of the annotations, default "{x:.2f}"
|
|
123
|
+
textcolors : tuple of str, optional
|
|
124
|
+
Colors for the annotations. The first is used for values below
|
|
125
|
+
threshold, the second for those above, default ("lightgray", "black")
|
|
126
|
+
threshold : float, optional
|
|
127
|
+
Value in normalized colormap space (0 to 1) above which the
|
|
128
|
+
second color is used. If None, 0.7*max(data) is used
|
|
129
|
+
**textkw
|
|
130
|
+
Additional keyword arguments passed to matplotlib.axes.Axes.text()
|
|
131
|
+
|
|
132
|
+
Returns
|
|
133
|
+
-------
|
|
134
|
+
texts : list of matplotlib.text.Text
|
|
135
|
+
The annotation text objects
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
if ax is None:
|
|
139
|
+
ax = plt.gca()
|
|
140
|
+
|
|
141
|
+
if cbar_kw is None:
|
|
142
|
+
cbar_kw = {}
|
|
143
|
+
|
|
144
|
+
# Plot the heatmap
|
|
145
|
+
im = ax.imshow(data, **kwargs)
|
|
146
|
+
|
|
147
|
+
# Create colorbar
|
|
148
|
+
cbar = ax.figure.colorbar(im, ax=ax, **cbar_kw)
|
|
149
|
+
cbar.ax.set_ylabel(cbarlabel, rotation=-90, va="bottom")
|
|
150
|
+
|
|
151
|
+
# Show all ticks and label them with the respective list entries.
|
|
152
|
+
ax.set_xticks(
|
|
153
|
+
range(data.shape[1]),
|
|
154
|
+
labels=col_labels,
|
|
155
|
+
# rotation=45,
|
|
156
|
+
# ha="right",
|
|
157
|
+
# rotation_mode="anchor",
|
|
158
|
+
)
|
|
159
|
+
ax.set_yticks(range(data.shape[0]), labels=row_labels)
|
|
160
|
+
|
|
161
|
+
# Let the horizontal axes labeling appear on top.
|
|
162
|
+
ax.tick_params(top=False, bottom=True, labeltop=False, labelbottom=True)
|
|
163
|
+
|
|
164
|
+
# Turn spines off
|
|
165
|
+
ax.spines[:].set_visible(False)
|
|
166
|
+
|
|
167
|
+
ax.set_xticks(np.arange(data.shape[1] + 1) - 0.5, minor=True)
|
|
168
|
+
ax.set_yticks(np.arange(data.shape[0] + 1) - 0.5, minor=True)
|
|
169
|
+
ax.tick_params(which="minor", bottom=False, left=False)
|
|
170
|
+
|
|
171
|
+
return im, cbar
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def _mpl_annotate_heatmap(
|
|
175
|
+
im,
|
|
176
|
+
data=None,
|
|
177
|
+
valfmt="{x:.2f}",
|
|
178
|
+
textcolors=("lightgray", "black"),
|
|
179
|
+
threshold=None,
|
|
180
|
+
**textkw,
|
|
181
|
+
):
|
|
182
|
+
"""
|
|
183
|
+
A function to annotate a heatmap.
|
|
184
|
+
|
|
185
|
+
Parameters
|
|
186
|
+
----------
|
|
187
|
+
im : matplotlib.image.AxesImage
|
|
188
|
+
The image to be annotated
|
|
189
|
+
data : array-like, optional
|
|
190
|
+
Data used to annotate. If None, the image's array is used
|
|
191
|
+
valfmt : str or matplotlib.ticker.Formatter, optional
|
|
192
|
+
Format of the annotations, default "{x:.2f}"
|
|
193
|
+
textcolors : tuple of str, optional
|
|
194
|
+
Colors for the annotations. The first is used for values below
|
|
195
|
+
threshold, the second for those above, default ("lightgray", "black")
|
|
196
|
+
threshold : float, optional
|
|
197
|
+
Value in normalized colormap space (0 to 1) above which the
|
|
198
|
+
second color is used. If None, 0.7*max(data) is used
|
|
199
|
+
**textkw
|
|
200
|
+
Additional keyword arguments passed to matplotlib.axes.Axes.text()
|
|
201
|
+
|
|
202
|
+
Returns
|
|
203
|
+
-------
|
|
204
|
+
texts : list of matplotlib.text.Text
|
|
205
|
+
The annotation text objects
|
|
206
|
+
"""
|
|
207
|
+
|
|
208
|
+
if not isinstance(data, (list, np.ndarray)):
|
|
209
|
+
data = im.get_array()
|
|
210
|
+
|
|
211
|
+
# Normalize the threshold to the images color range.
|
|
212
|
+
if threshold is not None:
|
|
213
|
+
threshold = im.norm(threshold)
|
|
214
|
+
else:
|
|
215
|
+
# Use 0.7 instead of 0.5 for better visibility with most colormaps
|
|
216
|
+
threshold = im.norm(data.max()) * 0.7
|
|
217
|
+
|
|
218
|
+
# Set default alignment to center, but allow it to be
|
|
219
|
+
# overwritten by textkw.
|
|
220
|
+
kw = dict(horizontalalignment="center", verticalalignment="center")
|
|
221
|
+
kw.update(textkw)
|
|
222
|
+
|
|
223
|
+
# Get the formatter in case a string is supplied
|
|
224
|
+
if isinstance(valfmt, str):
|
|
225
|
+
valfmt = matplotlib.ticker.StrMethodFormatter(valfmt)
|
|
226
|
+
|
|
227
|
+
# Loop over the data and create a `Text` for each "pixel".
|
|
228
|
+
# Change the text's color depending on the data.
|
|
229
|
+
texts = []
|
|
230
|
+
for ii in range(data.shape[0]):
|
|
231
|
+
for jj in range(data.shape[1]):
|
|
232
|
+
kw.update(color=textcolors[int(im.norm(data[ii, jj]) > threshold)])
|
|
233
|
+
text = im.axes.text(jj, ii, valfmt(data[ii, jj], None), **kw)
|
|
234
|
+
texts.append(text)
|
|
235
|
+
|
|
236
|
+
return texts
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
if __name__ == "__main__":
|
|
240
|
+
import matplotlib
|
|
241
|
+
import matplotlib as mpl
|
|
242
|
+
import matplotlib.pyplot as plt
|
|
243
|
+
import numpy as np
|
|
244
|
+
|
|
245
|
+
data = np.random.rand(5, 10)
|
|
246
|
+
x_labels = [f"X{ii+1}" for ii in range(5)]
|
|
247
|
+
y_labels = [f"Y{ii+1}" for ii in range(10)]
|
|
248
|
+
|
|
249
|
+
fig, ax = plt.subplots()
|
|
250
|
+
|
|
251
|
+
im, cbar = plot_heatmap(
|
|
252
|
+
ax,
|
|
253
|
+
data,
|
|
254
|
+
x_labels=x_labels,
|
|
255
|
+
y_labels=y_labels,
|
|
256
|
+
show_annot=True,
|
|
257
|
+
annot_color_lighter="white",
|
|
258
|
+
annot_color_darker="black",
|
|
259
|
+
cmap="Blues",
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
fig.tight_layout()
|
|
263
|
+
plt.show()
|
|
264
|
+
# EOF
|
|
265
|
+
|
|
266
|
+
# EOF
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-01 08:39:46 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_image2d.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_plot/_plot_image2d.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib
|
|
13
|
+
from scitex.plt.utils import assert_valid_axis
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def plot_image(
|
|
17
|
+
ax,
|
|
18
|
+
arr_2d,
|
|
19
|
+
cbar=True,
|
|
20
|
+
cbar_label=None,
|
|
21
|
+
cbar_shrink=1.0,
|
|
22
|
+
cbar_fraction=0.046,
|
|
23
|
+
cbar_pad=0.04,
|
|
24
|
+
cmap="viridis",
|
|
25
|
+
aspect="auto",
|
|
26
|
+
vmin=None,
|
|
27
|
+
vmax=None,
|
|
28
|
+
**kwargs,
|
|
29
|
+
):
|
|
30
|
+
"""
|
|
31
|
+
Imshows an two-dimensional array with theese two conditions:
|
|
32
|
+
1) The first dimension represents the x dim, from left to right.
|
|
33
|
+
2) The second dimension represents the y dim, from bottom to top
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
ax : matplotlib.axes.Axes or scitex.plt._subplots._AxisWrapper.AxisWrapper
|
|
38
|
+
The axis to plot on
|
|
39
|
+
arr_2d : numpy.ndarray
|
|
40
|
+
The 2D array to display
|
|
41
|
+
cbar : bool, optional
|
|
42
|
+
Whether to show colorbar, by default True
|
|
43
|
+
cbar_label : str, optional
|
|
44
|
+
Label for the colorbar, by default None
|
|
45
|
+
cbar_shrink : float, optional
|
|
46
|
+
Shrink factor for the colorbar, by default 1.0
|
|
47
|
+
cbar_fraction : float, optional
|
|
48
|
+
Fraction of original axes to use for colorbar, by default 0.046
|
|
49
|
+
cbar_pad : float, optional
|
|
50
|
+
Padding between the image axes and colorbar axes, by default 0.04
|
|
51
|
+
cmap : str, optional
|
|
52
|
+
Colormap name, by default "viridis"
|
|
53
|
+
aspect : str, optional
|
|
54
|
+
Aspect ratio adjustment, by default "auto"
|
|
55
|
+
vmin : float, optional
|
|
56
|
+
Minimum data value for colormap scaling, by default None
|
|
57
|
+
vmax : float, optional
|
|
58
|
+
Maximum data value for colormap scaling, by default None
|
|
59
|
+
**kwargs
|
|
60
|
+
Additional keyword arguments passed to ax.imshow()
|
|
61
|
+
|
|
62
|
+
Returns
|
|
63
|
+
-------
|
|
64
|
+
matplotlib.axes.Axes or scitex.plt._subplots._AxisWrapper.AxisWrapper
|
|
65
|
+
The axis with the image plotted
|
|
66
|
+
"""
|
|
67
|
+
assert_valid_axis(ax, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
68
|
+
assert arr_2d.ndim == 2, "Input array must be 2-dimensional"
|
|
69
|
+
|
|
70
|
+
if kwargs.get("xyz"):
|
|
71
|
+
kwargs.pop("xyz")
|
|
72
|
+
|
|
73
|
+
# Transposes arr_2d for correct orientation
|
|
74
|
+
arr_2d = arr_2d.T
|
|
75
|
+
|
|
76
|
+
# Cals the original ax.imshow() method on the transposed array
|
|
77
|
+
im = ax.imshow(arr_2d, cmap=cmap, vmin=vmin, vmax=vmax, aspect=aspect, **kwargs)
|
|
78
|
+
|
|
79
|
+
# Color bar
|
|
80
|
+
if cbar:
|
|
81
|
+
fig = ax.get_figure()
|
|
82
|
+
_cbar = fig.colorbar(
|
|
83
|
+
im, ax=ax, shrink=cbar_shrink, fraction=cbar_fraction, pad=cbar_pad
|
|
84
|
+
)
|
|
85
|
+
if cbar_label:
|
|
86
|
+
_cbar.set_label(cbar_label)
|
|
87
|
+
|
|
88
|
+
# Invert y-axis to match typical image orientation
|
|
89
|
+
ax.invert_yaxis()
|
|
90
|
+
|
|
91
|
+
return ax
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# EOF
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 09:03:23 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_joyplot.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_plot/_plot_joyplot.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import warnings
|
|
13
|
+
|
|
14
|
+
import joypy
|
|
15
|
+
|
|
16
|
+
from .._style._set_xyt import set_xyt as scitex_plt_set_xyt
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def plot_joyplot(ax, data, orientation="vertical", **kwargs):
|
|
20
|
+
"""
|
|
21
|
+
Create a joyplot (ridgeline plot) with proper orientation handling.
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
ax : matplotlib.axes.Axes
|
|
26
|
+
The axes to plot on
|
|
27
|
+
data : pandas.DataFrame or array-like
|
|
28
|
+
The data to plot
|
|
29
|
+
orientation : str, default "vertical"
|
|
30
|
+
Plot orientation. Either "vertical" or "horizontal"
|
|
31
|
+
**kwargs
|
|
32
|
+
Additional keyword arguments passed to joypy.joyplot()
|
|
33
|
+
|
|
34
|
+
Returns
|
|
35
|
+
-------
|
|
36
|
+
matplotlib.axes.Axes
|
|
37
|
+
The axes with the joyplot
|
|
38
|
+
|
|
39
|
+
Raises
|
|
40
|
+
------
|
|
41
|
+
ValueError
|
|
42
|
+
If orientation is not "vertical" or "horizontal"
|
|
43
|
+
"""
|
|
44
|
+
if orientation not in ["vertical", "horizontal"]:
|
|
45
|
+
raise ValueError("orientation must be either 'vertical' or 'horizontal'")
|
|
46
|
+
|
|
47
|
+
# Handle orientation by setting appropriate joypy parameters
|
|
48
|
+
if orientation == "horizontal":
|
|
49
|
+
# For horizontal orientation, we need to transpose the data display
|
|
50
|
+
# joypy doesn't have direct horizontal support, so we work with the result
|
|
51
|
+
kwargs.setdefault("kind", "kde") # Ensure we're using KDE plots
|
|
52
|
+
|
|
53
|
+
fig, axes = joypy.joyplot(
|
|
54
|
+
data=data,
|
|
55
|
+
**kwargs,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
# Set appropriate labels based on orientation
|
|
59
|
+
if orientation == "vertical":
|
|
60
|
+
ax = scitex_plt_set_xyt(ax, None, "Density", "Joyplot")
|
|
61
|
+
elif orientation == "horizontal":
|
|
62
|
+
ax = scitex_plt_set_xyt(ax, "Density", None, "Joyplot")
|
|
63
|
+
# For horizontal plots, we might need additional transformations
|
|
64
|
+
# This is a limitation of joypy which primarily supports vertical plots
|
|
65
|
+
|
|
66
|
+
return ax
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
# def plot_vertical_joyplot(ax, data, **kwargs):
|
|
70
|
+
# return _plot_joyplot(ax, data, "vertical", **kwargs)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# def plot_horizontal_joyplot(ax, data, **kwargs):
|
|
74
|
+
# return _plot_joyplot(ax, data, "horizontal", **kwargs)
|
|
75
|
+
|
|
76
|
+
# EOF
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-01 15:23:01 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/_scitex_repo/src/scitex/plt/ax/_plot/_plot_raster.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_plot/_plot_raster.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib
|
|
13
|
+
from bisect import bisect_left
|
|
14
|
+
|
|
15
|
+
import matplotlib.pyplot as plt
|
|
16
|
+
import numpy as np
|
|
17
|
+
import pandas as pd
|
|
18
|
+
from ....plt.utils import assert_valid_axis
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def plot_raster(
|
|
22
|
+
ax,
|
|
23
|
+
event_times,
|
|
24
|
+
time=None,
|
|
25
|
+
labels=None,
|
|
26
|
+
colors=None,
|
|
27
|
+
orientation="horizontal",
|
|
28
|
+
y_offset=None,
|
|
29
|
+
lineoffsets=None,
|
|
30
|
+
apply_set_n_ticks=True,
|
|
31
|
+
n_xticks=4,
|
|
32
|
+
n_yticks=None,
|
|
33
|
+
**kwargs
|
|
34
|
+
):
|
|
35
|
+
"""
|
|
36
|
+
Create a raster plot using eventplot with custom labels and colors.
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
41
|
+
The axes on which to draw the raster plot.
|
|
42
|
+
event_times : Array-like or list of lists
|
|
43
|
+
Time points of events by channels/trials
|
|
44
|
+
time : array-like, optional
|
|
45
|
+
The time indices for the events (default: np.linspace(0, max(event_times))).
|
|
46
|
+
labels : list, optional
|
|
47
|
+
Labels for each channel/trial.
|
|
48
|
+
colors : list, optional
|
|
49
|
+
Colors for each channel/trial.
|
|
50
|
+
orientation: str, optional
|
|
51
|
+
Orientation of raster plot (default: horizontal).
|
|
52
|
+
y_offset : float, optional
|
|
53
|
+
Vertical spacing between trials/channels.
|
|
54
|
+
lineoffsets : array-like, optional
|
|
55
|
+
Y-positions for each trial/channel (overrides automatic positioning).
|
|
56
|
+
apply_set_n_ticks : bool, optional
|
|
57
|
+
Whether to apply set_n_ticks for cleaner axis (default: True).
|
|
58
|
+
n_xticks : int, optional
|
|
59
|
+
Number of x-axis ticks (default: 4).
|
|
60
|
+
n_yticks : int or None, optional
|
|
61
|
+
Number of y-axis ticks (default: None, auto-determined).
|
|
62
|
+
**kwargs : dict
|
|
63
|
+
Additional keyword arguments for eventplot.
|
|
64
|
+
|
|
65
|
+
Returns
|
|
66
|
+
-------
|
|
67
|
+
ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
68
|
+
The axes with the raster plot.
|
|
69
|
+
df : pandas.DataFrame
|
|
70
|
+
DataFrame with time indices and channel events.
|
|
71
|
+
"""
|
|
72
|
+
assert_valid_axis(ax, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
73
|
+
|
|
74
|
+
# Format event_times data
|
|
75
|
+
event_times_list = _ensure_list(event_times)
|
|
76
|
+
|
|
77
|
+
# Handle colors and labels
|
|
78
|
+
colors = _handle_colors(colors, event_times_list)
|
|
79
|
+
|
|
80
|
+
# Handle lineoffsets for positioning between trials/channels
|
|
81
|
+
if lineoffsets is None:
|
|
82
|
+
if y_offset is None:
|
|
83
|
+
y_offset = 1.0 # Default spacing
|
|
84
|
+
lineoffsets = np.arange(len(event_times_list)) * y_offset
|
|
85
|
+
|
|
86
|
+
# Ensure lineoffsets is iterable and matches event_times_list length
|
|
87
|
+
if np.isscalar(lineoffsets):
|
|
88
|
+
lineoffsets = [lineoffsets]
|
|
89
|
+
if len(lineoffsets) < len(event_times_list):
|
|
90
|
+
lineoffsets = list(lineoffsets) + list(range(len(lineoffsets), len(event_times_list)))
|
|
91
|
+
|
|
92
|
+
# Plotting as eventplot using event_times_list with proper positioning
|
|
93
|
+
for ii, (pos, color, offset) in enumerate(zip(event_times_list, colors, lineoffsets)):
|
|
94
|
+
label = _define_label(labels, ii)
|
|
95
|
+
ax.eventplot(pos, lineoffsets=offset, orientation=orientation,
|
|
96
|
+
colors=color, label=label, **kwargs)
|
|
97
|
+
|
|
98
|
+
# Apply set_n_ticks for cleaner axes if requested
|
|
99
|
+
if apply_set_n_ticks:
|
|
100
|
+
from scitex.plt.ax._style._set_n_ticks import set_n_ticks
|
|
101
|
+
|
|
102
|
+
# For categorical y-axis (trials/channels), use appropriate tick count
|
|
103
|
+
if n_yticks is None:
|
|
104
|
+
n_yticks = min(len(event_times_list), 8) # Max 8 ticks for readability
|
|
105
|
+
|
|
106
|
+
# Only apply if we have reasonable numeric ranges
|
|
107
|
+
try:
|
|
108
|
+
x_range = ax.get_xlim()
|
|
109
|
+
y_range = ax.get_ylim()
|
|
110
|
+
|
|
111
|
+
# Apply x-ticks if we have a reasonable numeric range
|
|
112
|
+
if x_range[1] - x_range[0] > 0:
|
|
113
|
+
set_n_ticks(ax, n_xticks=n_xticks, n_yticks=None)
|
|
114
|
+
|
|
115
|
+
# Apply y-ticks only if we don't have categorical labels
|
|
116
|
+
if labels is None and y_range[1] - y_range[0] > 0:
|
|
117
|
+
set_n_ticks(ax, n_xticks=None, n_yticks=n_yticks)
|
|
118
|
+
|
|
119
|
+
except Exception:
|
|
120
|
+
# Skip set_n_ticks if there are issues (e.g., categorical data)
|
|
121
|
+
pass
|
|
122
|
+
|
|
123
|
+
# Legend
|
|
124
|
+
if labels is not None:
|
|
125
|
+
ax.legend()
|
|
126
|
+
|
|
127
|
+
# Return event_times in a useful format
|
|
128
|
+
event_times_digital_df = _event_times_to_digital_df(event_times_list, time, lineoffsets)
|
|
129
|
+
|
|
130
|
+
return ax, event_times_digital_df
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _ensure_list(event_times):
|
|
134
|
+
return [[pos] if isinstance(pos, (int, float)) else pos for pos in event_times]
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _define_label(labels, ii):
|
|
138
|
+
if (labels is not None) and (ii < len(labels)):
|
|
139
|
+
return labels[ii]
|
|
140
|
+
else:
|
|
141
|
+
return None
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _handle_colors(colors, event_times_list):
|
|
145
|
+
if colors is None:
|
|
146
|
+
colors = plt.rcParams["axes.prop_cycle"].by_key()["color"]
|
|
147
|
+
if len(colors) < len(event_times_list):
|
|
148
|
+
colors = colors * (len(event_times_list) // len(colors) + 1)
|
|
149
|
+
return colors
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _event_times_to_digital_df(event_times_list, time, lineoffsets=None):
|
|
153
|
+
if time is None:
|
|
154
|
+
time = np.linspace(0, np.max([np.max(pos) for pos in event_times_list]), 1000)
|
|
155
|
+
|
|
156
|
+
digi = np.full((len(event_times_list), len(time)), np.nan, dtype=float)
|
|
157
|
+
|
|
158
|
+
for i_ch, posis_ch in enumerate(event_times_list):
|
|
159
|
+
for posi_ch in posis_ch:
|
|
160
|
+
i_insert = bisect_left(time, posi_ch)
|
|
161
|
+
if i_insert == len(time):
|
|
162
|
+
i_insert -= 1
|
|
163
|
+
# Use lineoffset position if available, otherwise use channel index
|
|
164
|
+
if lineoffsets is not None and i_ch < len(lineoffsets):
|
|
165
|
+
digi[i_ch, i_insert] = lineoffsets[i_ch]
|
|
166
|
+
else:
|
|
167
|
+
digi[i_ch, i_insert] = i_ch
|
|
168
|
+
|
|
169
|
+
return pd.DataFrame(digi.T, index=time)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
# EOF
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-01 08:45:44 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_rectangle.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_plot/_plot_rectangle.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
from matplotlib.patches import Rectangle
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def plot_rectangle(ax, xx, yy, ww, hh, **kwargs):
|
|
16
|
+
"""Add a rectangle patch to an axes.
|
|
17
|
+
|
|
18
|
+
Convenience function for adding rectangular patches to plots, useful for
|
|
19
|
+
highlighting regions, creating box annotations, or drawing geometric shapes.
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
ax : matplotlib.axes.Axes
|
|
24
|
+
The axes to add the rectangle to.
|
|
25
|
+
xx : float
|
|
26
|
+
X-coordinate of the rectangle's bottom-left corner.
|
|
27
|
+
yy : float
|
|
28
|
+
Y-coordinate of the rectangle's bottom-left corner.
|
|
29
|
+
ww : float
|
|
30
|
+
Width of the rectangle.
|
|
31
|
+
hh : float
|
|
32
|
+
Height of the rectangle.
|
|
33
|
+
**kwargs : dict
|
|
34
|
+
Additional keyword arguments passed to matplotlib.patches.Rectangle.
|
|
35
|
+
Common options include:
|
|
36
|
+
- facecolor/fc : fill color
|
|
37
|
+
- edgecolor/ec : edge color
|
|
38
|
+
- linewidth/lw : edge line width
|
|
39
|
+
- alpha : transparency (0-1)
|
|
40
|
+
- linestyle/ls : edge line style
|
|
41
|
+
|
|
42
|
+
Returns
|
|
43
|
+
-------
|
|
44
|
+
matplotlib.axes.Axes
|
|
45
|
+
The axes with the rectangle added.
|
|
46
|
+
|
|
47
|
+
Examples
|
|
48
|
+
--------
|
|
49
|
+
>>> fig, ax = plt.subplots()
|
|
50
|
+
>>> ax.plot([0, 10], [0, 10])
|
|
51
|
+
>>> # Highlight a region
|
|
52
|
+
>>> plot_rectangle(ax, 2, 3, 4, 3, facecolor='yellow', alpha=0.3)
|
|
53
|
+
|
|
54
|
+
>>> # Draw a box annotation
|
|
55
|
+
>>> plot_rectangle(ax, 5, 5, 2, 2, facecolor='none', edgecolor='red', linewidth=2)
|
|
56
|
+
|
|
57
|
+
>>> # Create a filled rectangle
|
|
58
|
+
>>> plot_rectangle(ax, 0, 0, 1, 1, facecolor='blue', edgecolor='black')
|
|
59
|
+
|
|
60
|
+
See Also
|
|
61
|
+
--------
|
|
62
|
+
matplotlib.patches.Rectangle : The underlying Rectangle class
|
|
63
|
+
matplotlib.axes.Axes.add_patch : Method used to add the patch
|
|
64
|
+
"""
|
|
65
|
+
ax.add_patch(Rectangle((xx, yy), ww, hh, **kwargs))
|
|
66
|
+
return ax
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
# EOF
|