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,133 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 18:14:56 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_scatter_hist.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_plot/_plot_scatter_hist.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import numpy as np
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def plot_scatter_hist(
|
|
16
|
+
ax,
|
|
17
|
+
x,
|
|
18
|
+
y,
|
|
19
|
+
fig=None,
|
|
20
|
+
hist_bins: int = 20,
|
|
21
|
+
scatter_alpha: float = 0.6,
|
|
22
|
+
scatter_size: float = 20,
|
|
23
|
+
scatter_color: str = "blue",
|
|
24
|
+
hist_color_x: str = "blue",
|
|
25
|
+
hist_color_y: str = "red",
|
|
26
|
+
hist_alpha: float = 0.5,
|
|
27
|
+
scatter_ratio: float = 0.8,
|
|
28
|
+
**kwargs,
|
|
29
|
+
):
|
|
30
|
+
"""
|
|
31
|
+
Plot a scatter plot with histograms on the x and y axes.
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
ax : matplotlib.axes.Axes
|
|
36
|
+
The main scatter plot axes
|
|
37
|
+
x : array-like
|
|
38
|
+
x data for scatter plot and histogram
|
|
39
|
+
y : array-like
|
|
40
|
+
y data for scatter plot and histogram
|
|
41
|
+
fig : matplotlib.figure.Figure, optional
|
|
42
|
+
Figure to create axes in. If None, uses ax.figure
|
|
43
|
+
hist_bins : int, optional
|
|
44
|
+
Number of bins for histograms, default 20
|
|
45
|
+
scatter_alpha : float, optional
|
|
46
|
+
Alpha value for scatter points, default 0.6
|
|
47
|
+
scatter_size : float, optional
|
|
48
|
+
Size of scatter points, default 20
|
|
49
|
+
scatter_color : str, optional
|
|
50
|
+
Color of scatter points, default "blue"
|
|
51
|
+
hist_color_x : str, optional
|
|
52
|
+
Color of x-axis histogram, default "blue"
|
|
53
|
+
hist_color_y : str, optional
|
|
54
|
+
Color of y-axis histogram, default "red"
|
|
55
|
+
hist_alpha : float, optional
|
|
56
|
+
Alpha value for histograms, default 0.5
|
|
57
|
+
scatter_ratio : float, optional
|
|
58
|
+
Ratio of main plot to histograms, default 0.8
|
|
59
|
+
**kwargs
|
|
60
|
+
Additional keyword arguments passed to scatter and hist functions
|
|
61
|
+
|
|
62
|
+
Returns
|
|
63
|
+
-------
|
|
64
|
+
tuple
|
|
65
|
+
(ax, ax_histx, ax_histy, hist_data) - All axes objects and histogram data
|
|
66
|
+
hist_data is a dictionary containing histogram counts and bin edges
|
|
67
|
+
"""
|
|
68
|
+
# Get the current figure if not provided
|
|
69
|
+
if fig is None:
|
|
70
|
+
fig = ax.figure
|
|
71
|
+
|
|
72
|
+
# Calculate the positions based on scatter_ratio
|
|
73
|
+
margin = 0.1 * (1 - scatter_ratio)
|
|
74
|
+
hist_size = 0.2 * scatter_ratio
|
|
75
|
+
|
|
76
|
+
# Create the histogram axes
|
|
77
|
+
ax_histx = fig.add_axes(
|
|
78
|
+
[
|
|
79
|
+
ax.get_position().x0,
|
|
80
|
+
ax.get_position().y1 + margin,
|
|
81
|
+
ax.get_position().width * scatter_ratio,
|
|
82
|
+
hist_size,
|
|
83
|
+
]
|
|
84
|
+
)
|
|
85
|
+
ax_histy = fig.add_axes(
|
|
86
|
+
[
|
|
87
|
+
ax.get_position().x1 + margin,
|
|
88
|
+
ax.get_position().y0,
|
|
89
|
+
hist_size,
|
|
90
|
+
ax.get_position().height * scatter_ratio,
|
|
91
|
+
]
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# No labels for histograms
|
|
95
|
+
ax_histx.tick_params(axis="x", labelbottom=False)
|
|
96
|
+
ax_histy.tick_params(axis="y", labelleft=False)
|
|
97
|
+
|
|
98
|
+
# The scatter plot
|
|
99
|
+
ax.scatter(
|
|
100
|
+
x,
|
|
101
|
+
y,
|
|
102
|
+
alpha=scatter_alpha,
|
|
103
|
+
s=scatter_size,
|
|
104
|
+
color=scatter_color,
|
|
105
|
+
**kwargs,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Calculate histogram data
|
|
109
|
+
hist_x, bin_edges_x = np.histogram(x, bins=hist_bins)
|
|
110
|
+
hist_y, bin_edges_y = np.histogram(y, bins=hist_bins)
|
|
111
|
+
|
|
112
|
+
# Plot histograms
|
|
113
|
+
ax_histx.hist(x, bins=hist_bins, color=hist_color_x, alpha=hist_alpha)
|
|
114
|
+
ax_histy.hist(
|
|
115
|
+
y,
|
|
116
|
+
bins=hist_bins,
|
|
117
|
+
orientation="horizontal",
|
|
118
|
+
color=hist_color_y,
|
|
119
|
+
alpha=hist_alpha,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Create return data structure
|
|
123
|
+
hist_data = {
|
|
124
|
+
"hist_x": hist_x,
|
|
125
|
+
"hist_y": hist_y,
|
|
126
|
+
"bin_edges_x": bin_edges_x,
|
|
127
|
+
"bin_edges_y": bin_edges_y,
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return ax, ax_histx, ax_histy, hist_data
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
# EOF
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 23:28:32 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_shaded_line.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_plot/_plot_shaded_line.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
from typing import List, Optional, Tuple, Union
|
|
13
|
+
|
|
14
|
+
import matplotlib
|
|
15
|
+
import numpy as np
|
|
16
|
+
import pandas as pd
|
|
17
|
+
from matplotlib.axes._axes import Axes
|
|
18
|
+
|
|
19
|
+
from ....types import ColorLike
|
|
20
|
+
from ....plt.utils import assert_valid_axis
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _plot_single_shaded_line(
|
|
24
|
+
axis: Union[Axes, 'AxisWrapper'],
|
|
25
|
+
xx: np.ndarray,
|
|
26
|
+
y_lower: np.ndarray,
|
|
27
|
+
y_middle: np.ndarray,
|
|
28
|
+
y_upper: np.ndarray,
|
|
29
|
+
color: Optional[ColorLike] = None,
|
|
30
|
+
alpha: float = 0.3,
|
|
31
|
+
**kwargs
|
|
32
|
+
) -> Tuple[Union[Axes, 'AxisWrapper'], pd.DataFrame]:
|
|
33
|
+
"""Plot a line with shaded area between y_lower and y_upper bounds."""
|
|
34
|
+
assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
35
|
+
assert (
|
|
36
|
+
len(xx) == len(y_middle) == len(y_lower) == len(y_upper)
|
|
37
|
+
), "All arrays must have the same length"
|
|
38
|
+
|
|
39
|
+
label = kwargs.get("label")
|
|
40
|
+
if kwargs.get("label"):
|
|
41
|
+
del kwargs["label"]
|
|
42
|
+
axis.plot(xx, y_middle, color=color, alpha=alpha, label=label, **kwargs)
|
|
43
|
+
kwargs["linewidth"] = 0
|
|
44
|
+
kwargs["edgecolor"] = "none" # Remove edge line
|
|
45
|
+
axis.fill_between(xx, y_lower, y_upper, alpha=alpha, color=color, **kwargs)
|
|
46
|
+
|
|
47
|
+
return axis, pd.DataFrame(
|
|
48
|
+
{"x": xx, "y_lower": y_lower, "y_middle": y_middle, "y_upper": y_upper}
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _plot_shaded_line(
|
|
53
|
+
axis: Union[Axes, 'AxisWrapper'],
|
|
54
|
+
xs: List[np.ndarray],
|
|
55
|
+
ys_lower: List[np.ndarray],
|
|
56
|
+
ys_middle: List[np.ndarray],
|
|
57
|
+
ys_upper: List[np.ndarray],
|
|
58
|
+
color: Optional[Union[List[ColorLike], ColorLike]] = None,
|
|
59
|
+
**kwargs
|
|
60
|
+
) -> Tuple[Union[Axes, 'AxisWrapper'], List[pd.DataFrame]]:
|
|
61
|
+
"""Plot multiple lines with shaded areas between ys_lower and ys_upper bounds."""
|
|
62
|
+
assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
63
|
+
assert (
|
|
64
|
+
len(xs) == len(ys_lower) == len(ys_middle) == len(ys_upper)
|
|
65
|
+
), "All input lists must have the same length"
|
|
66
|
+
|
|
67
|
+
results = []
|
|
68
|
+
colors = color
|
|
69
|
+
color_list = colors
|
|
70
|
+
|
|
71
|
+
if colors is not None:
|
|
72
|
+
if not isinstance(colors, list):
|
|
73
|
+
color_list = [colors] * len(xs)
|
|
74
|
+
else:
|
|
75
|
+
assert len(colors) == len(xs), "Number of colors must match number of lines"
|
|
76
|
+
color_list = colors
|
|
77
|
+
|
|
78
|
+
for idx, (xx, y_lower, y_middle, y_upper) in enumerate(
|
|
79
|
+
zip(xs, ys_lower, ys_middle, ys_upper)
|
|
80
|
+
):
|
|
81
|
+
this_kwargs = kwargs.copy()
|
|
82
|
+
this_kwargs["color"] = color_list[idx]
|
|
83
|
+
_, result_df = _plot_single_shaded_line(
|
|
84
|
+
axis, xx, y_lower, y_middle, y_upper, **this_kwargs
|
|
85
|
+
)
|
|
86
|
+
results.append(result_df)
|
|
87
|
+
else:
|
|
88
|
+
for xx, y_lower, y_middle, y_upper in zip(xs, ys_lower, ys_middle, ys_upper):
|
|
89
|
+
_, result_df = _plot_single_shaded_line(
|
|
90
|
+
axis, xx, y_lower, y_middle, y_upper, **kwargs
|
|
91
|
+
)
|
|
92
|
+
results.append(result_df)
|
|
93
|
+
|
|
94
|
+
return axis, results
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def plot_shaded_line(
|
|
98
|
+
axis: Union[Axes, 'AxisWrapper'],
|
|
99
|
+
xs: Union[np.ndarray, List[np.ndarray]],
|
|
100
|
+
ys_lower: Union[np.ndarray, List[np.ndarray]],
|
|
101
|
+
ys_middle: Union[np.ndarray, List[np.ndarray]],
|
|
102
|
+
ys_upper: Union[np.ndarray, List[np.ndarray]],
|
|
103
|
+
color: Optional[Union[ColorLike, List[ColorLike]]] = None,
|
|
104
|
+
**kwargs
|
|
105
|
+
) -> Tuple[Union[Axes, 'AxisWrapper'], Union[pd.DataFrame, List[pd.DataFrame]]]:
|
|
106
|
+
"""
|
|
107
|
+
Plot a line with shaded area, automatically switching between single and multiple line versions.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
axis: matplotlib axis or scitex axis wrapper
|
|
111
|
+
xs: x values (single array or list of arrays)
|
|
112
|
+
ys_lower: lower bound y values (single array or list of arrays)
|
|
113
|
+
ys_middle: middle y values (single array or list of arrays)
|
|
114
|
+
ys_upper: upper bound y values (single array or list of arrays)
|
|
115
|
+
color: color or list of colors for the lines
|
|
116
|
+
**kwargs: additional plotting parameters
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
tuple: (axis, DataFrame or list of DataFrames with plot data)
|
|
120
|
+
"""
|
|
121
|
+
is_single = not (
|
|
122
|
+
isinstance(xs, list)
|
|
123
|
+
and isinstance(ys_lower, list)
|
|
124
|
+
and isinstance(ys_middle, list)
|
|
125
|
+
and isinstance(ys_upper, list)
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
if is_single:
|
|
129
|
+
assert (
|
|
130
|
+
len(xs) == len(ys_lower) == len(ys_middle) == len(ys_upper)
|
|
131
|
+
), "All arrays must have the same length for single line plot"
|
|
132
|
+
|
|
133
|
+
return _plot_single_shaded_line(
|
|
134
|
+
axis, xs, ys_lower, ys_middle, ys_upper, color=color, **kwargs
|
|
135
|
+
)
|
|
136
|
+
else:
|
|
137
|
+
return _plot_shaded_line(
|
|
138
|
+
axis, xs, ys_lower, ys_middle, ys_upper, color=color, **kwargs
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
# EOF
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-30 20:50:45 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot_statistical_shaded_line.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_plot_statistical_shaded_line.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pandas as pd
|
|
15
|
+
from ....plt.utils import assert_valid_axis
|
|
16
|
+
|
|
17
|
+
from ._plot_shaded_line import plot_shaded_line as scitex_plt_plot_shaded_line
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def plot_line(axis, data, xx=None, **kwargs):
|
|
21
|
+
"""
|
|
22
|
+
Plot a simple line.
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
axis : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
27
|
+
The axis to plot on
|
|
28
|
+
data : array-like
|
|
29
|
+
Data to plot
|
|
30
|
+
xx : array-like, optional
|
|
31
|
+
X coordinates for the data. If None, will use np.arange(len(data))
|
|
32
|
+
**kwargs
|
|
33
|
+
Additional keyword arguments passed to axis.plot()
|
|
34
|
+
|
|
35
|
+
Returns
|
|
36
|
+
-------
|
|
37
|
+
axis : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
38
|
+
The axis with the plot
|
|
39
|
+
df : pandas.DataFrame
|
|
40
|
+
DataFrame with x and y values
|
|
41
|
+
"""
|
|
42
|
+
assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
43
|
+
data = np.asarray(data)
|
|
44
|
+
assert data.ndim <= 2, f"Data must be 1D or 2D, got {data.ndim}D"
|
|
45
|
+
if xx is None:
|
|
46
|
+
xx = np.arange(len(data))
|
|
47
|
+
else:
|
|
48
|
+
xx = np.asarray(xx)
|
|
49
|
+
assert len(xx) == len(
|
|
50
|
+
data
|
|
51
|
+
), f"xx length ({len(xx)}) must match data length ({len(data)})"
|
|
52
|
+
axis.plot(xx, data, **kwargs)
|
|
53
|
+
return axis, pd.DataFrame({"x": xx, "y": data})
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def plot_mean_std(axis, data, xx=None, sd=1, **kwargs):
|
|
57
|
+
"""
|
|
58
|
+
Plot mean line with standard deviation shading.
|
|
59
|
+
|
|
60
|
+
Parameters
|
|
61
|
+
----------
|
|
62
|
+
axis : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
63
|
+
The axis to plot on
|
|
64
|
+
data : array-like
|
|
65
|
+
Data to plot, can be 1D or 2D. If 2D, mean and std are calculated across the first dimension
|
|
66
|
+
xx : array-like, optional
|
|
67
|
+
X coordinates for the data. If None, will use np.arange(len(data))
|
|
68
|
+
sd : float, optional
|
|
69
|
+
Number of standard deviations for the shaded region. Default is 1
|
|
70
|
+
**kwargs
|
|
71
|
+
Additional keyword arguments passed to plot_shaded_line()
|
|
72
|
+
|
|
73
|
+
Returns
|
|
74
|
+
-------
|
|
75
|
+
axis : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
76
|
+
The axis with the plot
|
|
77
|
+
"""
|
|
78
|
+
assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
79
|
+
assert isinstance(sd, (int, float)), f"sd must be a number, got {type(sd)}"
|
|
80
|
+
assert sd >= 0, f"sd must be non-negative, got {sd}"
|
|
81
|
+
data = np.asarray(data)
|
|
82
|
+
assert data.ndim <= 2, f"Data must be 1D or 2D, got {data.ndim}D"
|
|
83
|
+
if xx is None:
|
|
84
|
+
xx = np.arange(data.shape[1] if data.ndim > 1 else len(data))
|
|
85
|
+
else:
|
|
86
|
+
xx = np.asarray(xx)
|
|
87
|
+
expected_len = data.shape[1] if data.ndim > 1 else len(data)
|
|
88
|
+
assert (
|
|
89
|
+
len(xx) == expected_len
|
|
90
|
+
), f"xx length ({len(xx)}) must match data length ({expected_len})"
|
|
91
|
+
|
|
92
|
+
if data.ndim == 1:
|
|
93
|
+
central = data
|
|
94
|
+
error = np.zeros_like(central)
|
|
95
|
+
else:
|
|
96
|
+
central = np.nanmean(data, axis=0)
|
|
97
|
+
error = np.nanstd(data, axis=0) * sd
|
|
98
|
+
|
|
99
|
+
y_lower = central - error
|
|
100
|
+
y_upper = central + error
|
|
101
|
+
n_samples = data.shape[0] if data.ndim > 1 else 1
|
|
102
|
+
|
|
103
|
+
if "label" in kwargs and kwargs["label"]:
|
|
104
|
+
kwargs["label"] = f"{kwargs['label']} (n={n_samples})"
|
|
105
|
+
|
|
106
|
+
return scitex_plt_plot_shaded_line(axis, xx, y_lower, central, y_upper, **kwargs)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def plot_mean_ci(axis, data, xx=None, perc=95, **kwargs):
|
|
110
|
+
"""
|
|
111
|
+
Plot mean line with confidence interval shading.
|
|
112
|
+
|
|
113
|
+
Parameters
|
|
114
|
+
----------
|
|
115
|
+
axis : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
116
|
+
The axis to plot on
|
|
117
|
+
data : array-like
|
|
118
|
+
Data to plot, can be 1D or 2D. If 2D, mean and percentiles are calculated across the first dimension
|
|
119
|
+
xx : array-like, optional
|
|
120
|
+
X coordinates for the data. If None, will use np.arange(len(data))
|
|
121
|
+
perc : float, optional
|
|
122
|
+
Confidence interval percentage (0-100). Default is 95
|
|
123
|
+
**kwargs
|
|
124
|
+
Additional keyword arguments passed to plot_shaded_line()
|
|
125
|
+
|
|
126
|
+
Returns
|
|
127
|
+
-------
|
|
128
|
+
axis : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
129
|
+
The axis with the plot
|
|
130
|
+
"""
|
|
131
|
+
assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
132
|
+
assert isinstance(
|
|
133
|
+
perc, (int, float)
|
|
134
|
+
), f"perc must be a number, got {type(perc)}"
|
|
135
|
+
assert 0 <= perc <= 100, f"perc must be between 0 and 100, got {perc}"
|
|
136
|
+
data = np.asarray(data)
|
|
137
|
+
assert data.ndim <= 2, f"Data must be 1D or 2D, got {data.ndim}D"
|
|
138
|
+
|
|
139
|
+
if xx is None:
|
|
140
|
+
xx = np.arange(data.shape[1] if data.ndim > 1 else len(data))
|
|
141
|
+
else:
|
|
142
|
+
xx = np.asarray(xx)
|
|
143
|
+
|
|
144
|
+
expected_len = data.shape[1] if data.ndim > 1 else len(data)
|
|
145
|
+
assert (
|
|
146
|
+
len(xx) == expected_len
|
|
147
|
+
), f"xx length ({len(xx)}) must match data length ({expected_len})"
|
|
148
|
+
|
|
149
|
+
if data.ndim == 1:
|
|
150
|
+
central = data
|
|
151
|
+
y_lower = central
|
|
152
|
+
y_upper = central
|
|
153
|
+
else:
|
|
154
|
+
central = np.nanmean(data, axis=0)
|
|
155
|
+
# Calculate CI bounds
|
|
156
|
+
alpha = 1 - perc / 100
|
|
157
|
+
y_lower_perc = alpha / 2 * 100
|
|
158
|
+
y_upper_perc = (1 - alpha / 2) * 100
|
|
159
|
+
y_lower = np.nanpercentile(data, y_lower_perc, axis=0)
|
|
160
|
+
y_upper = np.nanpercentile(data, y_upper_perc, axis=0)
|
|
161
|
+
|
|
162
|
+
n_samples = data.shape[0] if data.ndim > 1 else 1
|
|
163
|
+
|
|
164
|
+
if "label" in kwargs and kwargs["label"]:
|
|
165
|
+
kwargs["label"] = f"{kwargs['label']} (n={n_samples}, CI={perc}%)"
|
|
166
|
+
|
|
167
|
+
return scitex_plt_plot_shaded_line(axis, xx, y_lower, central, y_upper, **kwargs)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def plot_median_iqr(axis, data, xx=None, **kwargs):
|
|
171
|
+
"""
|
|
172
|
+
Plot median line with interquartile range shading.
|
|
173
|
+
|
|
174
|
+
Parameters
|
|
175
|
+
----------
|
|
176
|
+
axis : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
177
|
+
The axis to plot on
|
|
178
|
+
data : array-like
|
|
179
|
+
Data to plot, can be 1D or 2D. If 2D, median and IQR are calculated across the first dimension
|
|
180
|
+
xx : array-like, optional
|
|
181
|
+
X coordinates for the data. If None, will use np.arange(len(data))
|
|
182
|
+
**kwargs
|
|
183
|
+
Additional keyword arguments passed to plot_shaded_line()
|
|
184
|
+
|
|
185
|
+
Returns
|
|
186
|
+
-------
|
|
187
|
+
axis : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
188
|
+
The axis with the plot
|
|
189
|
+
"""
|
|
190
|
+
assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
191
|
+
data = np.asarray(data)
|
|
192
|
+
assert data.ndim <= 2, f"Data must be 1D or 2D, got {data.ndim}D"
|
|
193
|
+
|
|
194
|
+
if xx is None:
|
|
195
|
+
xx = np.arange(data.shape[1] if data.ndim > 1 else len(data))
|
|
196
|
+
else:
|
|
197
|
+
xx = np.asarray(xx)
|
|
198
|
+
|
|
199
|
+
expected_len = data.shape[1] if data.ndim > 1 else len(data)
|
|
200
|
+
assert (
|
|
201
|
+
len(xx) == expected_len
|
|
202
|
+
), f"xx length ({len(xx)}) must match data length ({expected_len})"
|
|
203
|
+
|
|
204
|
+
if data.ndim == 1:
|
|
205
|
+
central = data
|
|
206
|
+
y_lower = central
|
|
207
|
+
y_upper = central
|
|
208
|
+
else:
|
|
209
|
+
central = np.nanmedian(data, axis=0)
|
|
210
|
+
y_lower = np.nanpercentile(data, 25, axis=0)
|
|
211
|
+
y_upper = np.nanpercentile(data, 75, axis=0)
|
|
212
|
+
|
|
213
|
+
n_samples = data.shape[0] if data.ndim > 1 else 1
|
|
214
|
+
|
|
215
|
+
if "label" in kwargs and kwargs["label"]:
|
|
216
|
+
kwargs["label"] = f"{kwargs['label']} (n={n_samples}, IQR)"
|
|
217
|
+
|
|
218
|
+
return scitex_plt_plot_shaded_line(axis, xx, y_lower, central, y_upper, **kwargs)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
# EOF
|