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,343 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 22:01:54 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_violin.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_plot/_plot_violin.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib
|
|
13
|
+
import matplotlib.pyplot as plt
|
|
14
|
+
import numpy as np
|
|
15
|
+
import pandas as pd
|
|
16
|
+
import seaborn as sns
|
|
17
|
+
from ....plt.utils import assert_valid_axis
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def plot_violin(
|
|
21
|
+
ax,
|
|
22
|
+
data_list,
|
|
23
|
+
labels=None,
|
|
24
|
+
colors=None,
|
|
25
|
+
half=False,
|
|
26
|
+
**kwargs,
|
|
27
|
+
):
|
|
28
|
+
"""
|
|
29
|
+
Plot a violin plot using seaborn.
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
34
|
+
The axes to plot on
|
|
35
|
+
data_list : list
|
|
36
|
+
List of arrays to plot as violins
|
|
37
|
+
labels : list, optional
|
|
38
|
+
Labels for each array in data_list
|
|
39
|
+
colors : list, optional
|
|
40
|
+
Colors for each violin
|
|
41
|
+
half : bool, optional
|
|
42
|
+
If True, plots only the left half of the violins, default False
|
|
43
|
+
**kwargs
|
|
44
|
+
Additional keyword arguments passed to seaborn.violinplot
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
49
|
+
The axes object with the plot
|
|
50
|
+
"""
|
|
51
|
+
# Convert list-style data to DataFrame
|
|
52
|
+
all_values = []
|
|
53
|
+
all_groups = []
|
|
54
|
+
|
|
55
|
+
for idx, values in enumerate(data_list):
|
|
56
|
+
all_values.extend(values)
|
|
57
|
+
group_label = labels[idx] if labels and idx < len(labels) else f"x {idx}"
|
|
58
|
+
all_groups.extend([group_label] * len(values))
|
|
59
|
+
|
|
60
|
+
# Create DataFrame
|
|
61
|
+
df = pd.DataFrame({"x": all_groups, "y": all_values})
|
|
62
|
+
|
|
63
|
+
# Setup colors if provided
|
|
64
|
+
if colors:
|
|
65
|
+
if isinstance(colors, list):
|
|
66
|
+
kwargs["palette"] = {
|
|
67
|
+
group: color
|
|
68
|
+
for group, color in zip(set(all_groups), colors[: len(set(all_groups))])
|
|
69
|
+
}
|
|
70
|
+
else:
|
|
71
|
+
kwargs["palette"] = colors
|
|
72
|
+
|
|
73
|
+
# Call seaborn-based function
|
|
74
|
+
return sns_plot_violin(ax, data=df, x="x", y="y", hue="x", half=half, **kwargs)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def sns_plot_violin(ax, data=None, x=None, y=None, hue=None, half=False, **kwargs):
|
|
78
|
+
"""
|
|
79
|
+
Plot a violin plot with option for half violins.
|
|
80
|
+
Parameters
|
|
81
|
+
----------
|
|
82
|
+
ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
83
|
+
The axes to plot on
|
|
84
|
+
data : DataFrame
|
|
85
|
+
The dataframe containing the data
|
|
86
|
+
x : str
|
|
87
|
+
Column name for x-axis variable
|
|
88
|
+
y : str
|
|
89
|
+
Column name for y-axis variable
|
|
90
|
+
hue : str, optional
|
|
91
|
+
Column name for hue variable
|
|
92
|
+
half : bool, optional
|
|
93
|
+
If True, plots only the left half of the violins, default False
|
|
94
|
+
**kwargs
|
|
95
|
+
Additional keyword arguments passed to seaborn.violinplot
|
|
96
|
+
Returns
|
|
97
|
+
-------
|
|
98
|
+
ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
|
|
99
|
+
The axes object with the plot
|
|
100
|
+
"""
|
|
101
|
+
assert_valid_axis(ax, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
102
|
+
|
|
103
|
+
if not half:
|
|
104
|
+
# Standard violin plot
|
|
105
|
+
return sns.violinplot(data=data, x=x, y=y, hue=hue, ax=ax, **kwargs)
|
|
106
|
+
|
|
107
|
+
# Create a copy of the dataframe to avoid modifying the original
|
|
108
|
+
df = data.copy()
|
|
109
|
+
|
|
110
|
+
# If no hue provided, create default hue
|
|
111
|
+
if hue is None:
|
|
112
|
+
df["_hue"] = "default"
|
|
113
|
+
hue = "_hue"
|
|
114
|
+
|
|
115
|
+
# Add fake hue for the right side
|
|
116
|
+
df["_fake_hue"] = df[hue] + "_right"
|
|
117
|
+
|
|
118
|
+
# Adjust hue_order and palette if provided
|
|
119
|
+
if "hue_order" in kwargs:
|
|
120
|
+
kwargs["hue_order"] = kwargs["hue_order"] + [
|
|
121
|
+
h + "_right" for h in kwargs["hue_order"]
|
|
122
|
+
]
|
|
123
|
+
else:
|
|
124
|
+
kwargs["hue_order"] = []
|
|
125
|
+
for group in df[x].unique().tolist():
|
|
126
|
+
kwargs["hue_order"].append(group)
|
|
127
|
+
kwargs["hue_order"].append(group + "_right")
|
|
128
|
+
|
|
129
|
+
if "palette" in kwargs:
|
|
130
|
+
palette = kwargs["palette"]
|
|
131
|
+
if isinstance(palette, dict):
|
|
132
|
+
kwargs["palette"] = {
|
|
133
|
+
**palette,
|
|
134
|
+
**{k + "_right": v for k, v in palette.items()},
|
|
135
|
+
}
|
|
136
|
+
elif isinstance(palette, list):
|
|
137
|
+
kwargs["palette"] = palette + palette
|
|
138
|
+
|
|
139
|
+
# Conc left and right
|
|
140
|
+
df_left = df[[x, y]]
|
|
141
|
+
df_right = df[["_fake_hue", y]].rename(columns={"_fake_hue": x})
|
|
142
|
+
df_right[y] = [np.nan for _ in range(len(df_right))]
|
|
143
|
+
df_conc = pd.concat([df_left, df_right], axis=0, ignore_index=True)
|
|
144
|
+
df_conc = df_conc.sort_values(x)
|
|
145
|
+
|
|
146
|
+
# Plot
|
|
147
|
+
sns.violinplot(data=df_conc, x=x, y=y, hue="x", split=True, ax=ax, **kwargs)
|
|
148
|
+
|
|
149
|
+
# Remove right half of violins
|
|
150
|
+
for collection in ax.collections:
|
|
151
|
+
if isinstance(collection, plt.matplotlib.collections.PolyCollection):
|
|
152
|
+
collection.set_clip_path(None)
|
|
153
|
+
|
|
154
|
+
# Adjust legend
|
|
155
|
+
if ax.legend_ is not None:
|
|
156
|
+
handles, labels = ax.get_legend_handles_labels()
|
|
157
|
+
ax.legend(handles[: len(handles) // 2], labels[: len(labels) // 2])
|
|
158
|
+
|
|
159
|
+
return ax
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
# def _plot_half_violin(ax, data=None, x=None, y=None, hue=None, **kwargs):
|
|
163
|
+
|
|
164
|
+
# assert isinstance(
|
|
165
|
+
# ax, matplotlib.axes._axes.Axes
|
|
166
|
+
# ), "First argument must be a matplotlib axis"
|
|
167
|
+
|
|
168
|
+
# # Prepare data
|
|
169
|
+
# df = data.copy()
|
|
170
|
+
# if hue is None:
|
|
171
|
+
# df["_hue"] = "default"
|
|
172
|
+
# hue = "_hue"
|
|
173
|
+
|
|
174
|
+
# # Add fake hue for the right side
|
|
175
|
+
# df["_fake_hue"] = df[hue] + "_right"
|
|
176
|
+
|
|
177
|
+
# # Adjust hue_order and palette if provided
|
|
178
|
+
# if "hue_order" in kwargs:
|
|
179
|
+
# kwargs["hue_order"] = kwargs["hue_order"] + [
|
|
180
|
+
# h + "_right" for h in kwargs["hue_order"]
|
|
181
|
+
# ]
|
|
182
|
+
|
|
183
|
+
# if "palette" in kwargs:
|
|
184
|
+
# palette = kwargs["palette"]
|
|
185
|
+
# if isinstance(palette, dict):
|
|
186
|
+
# kwargs["palette"] = {
|
|
187
|
+
# **palette,
|
|
188
|
+
# **{k + "_right": v for k, v in palette.items()},
|
|
189
|
+
# }
|
|
190
|
+
# elif isinstance(palette, list):
|
|
191
|
+
# kwargs["palette"] = palette + palette
|
|
192
|
+
|
|
193
|
+
# # Plot
|
|
194
|
+
# sns.violinplot(
|
|
195
|
+
# data=df, x=x, y=y, hue="_fake_hue", split=True, ax=ax, **kwargs
|
|
196
|
+
# )
|
|
197
|
+
|
|
198
|
+
# # Remove right half of violins
|
|
199
|
+
# for collection in ax.collections:
|
|
200
|
+
# if isinstance(collection, plt.matplotlib.collections.PolyCollection):
|
|
201
|
+
# collection.set_clip_path(None)
|
|
202
|
+
|
|
203
|
+
# # Adjust legend
|
|
204
|
+
# if ax.legend_ is not None:
|
|
205
|
+
# handles, labels = ax.get_legend_handles_labels()
|
|
206
|
+
# ax.legend(handles[: len(handles) // 2], labels[: len(labels) // 2])
|
|
207
|
+
|
|
208
|
+
# return ax
|
|
209
|
+
|
|
210
|
+
# import matplotlib
|
|
211
|
+
# import matplotlib.pyplot as plt
|
|
212
|
+
# import seaborn as sns
|
|
213
|
+
|
|
214
|
+
# def plot_violin_half(ax, data=None, x=None, y=None, hue=None, **kwargs):
|
|
215
|
+
# """
|
|
216
|
+
# Plot a half violin plot (showing only the left side of violins).
|
|
217
|
+
|
|
218
|
+
# Parameters
|
|
219
|
+
# ----------
|
|
220
|
+
# ax : matplotlib.axes.Axes
|
|
221
|
+
# The axes to plot on
|
|
222
|
+
# data : DataFrame
|
|
223
|
+
# The dataframe containing the data
|
|
224
|
+
# x : str
|
|
225
|
+
# Column name for x-axis variable
|
|
226
|
+
# y : str
|
|
227
|
+
# Column name for y-axis variable
|
|
228
|
+
# hue : str, optional
|
|
229
|
+
# Column name for hue variable
|
|
230
|
+
# **kwargs
|
|
231
|
+
# Additional keyword arguments passed to seaborn.violinplot
|
|
232
|
+
|
|
233
|
+
# Returns
|
|
234
|
+
# -------
|
|
235
|
+
# ax : matplotlib.axes.Axes
|
|
236
|
+
# The axes object with the plot
|
|
237
|
+
# """
|
|
238
|
+
# assert isinstance(
|
|
239
|
+
# ax, matplotlib.axes._axes.Axes
|
|
240
|
+
# ), "First argument must be a matplotlib axis"
|
|
241
|
+
|
|
242
|
+
# # Prepare data
|
|
243
|
+
# df = data.copy()
|
|
244
|
+
# if hue is None:
|
|
245
|
+
# df["_hue"] = "default"
|
|
246
|
+
# hue = "_hue"
|
|
247
|
+
|
|
248
|
+
# # Add fake hue for the right side
|
|
249
|
+
# df["_fake_hue"] = df[hue] + "_right"
|
|
250
|
+
|
|
251
|
+
# # Adjust hue_order and palette if provided
|
|
252
|
+
# if "hue_order" in kwargs:
|
|
253
|
+
# kwargs["hue_order"] = kwargs["hue_order"] + [
|
|
254
|
+
# h + "_right" for h in kwargs["hue_order"]
|
|
255
|
+
# ]
|
|
256
|
+
# if "palette" in kwargs:
|
|
257
|
+
# palette = kwargs["palette"]
|
|
258
|
+
# if isinstance(palette, dict):
|
|
259
|
+
# kwargs["palette"] = {
|
|
260
|
+
# **palette,
|
|
261
|
+
# **{k + "_right": v for k, v in palette.items()},
|
|
262
|
+
# }
|
|
263
|
+
# elif isinstance(palette, list):
|
|
264
|
+
# kwargs["palette"] = palette + palette
|
|
265
|
+
|
|
266
|
+
# # Plot
|
|
267
|
+
# sns.violinplot(
|
|
268
|
+
# data=df, x=x, y=y, hue="_fake_hue", split=True, ax=ax, **kwargs
|
|
269
|
+
# )
|
|
270
|
+
|
|
271
|
+
# # Remove right half of violins
|
|
272
|
+
# for collection in ax.collections:
|
|
273
|
+
# if isinstance(collection, matplotlib.collections.PolyCollection):
|
|
274
|
+
# collection.set_clip_path(None)
|
|
275
|
+
|
|
276
|
+
# # Adjust legend
|
|
277
|
+
# if ax.legend_ is not None:
|
|
278
|
+
# handles, labels = ax.get_legend_handles_labels()
|
|
279
|
+
# ax.legend(handles[: len(handles) // 2], labels[: len(labels) // 2])
|
|
280
|
+
|
|
281
|
+
# return ax
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
## Probably working
|
|
285
|
+
def half_violin(ax, data=None, x=None, y=None, hue=None, **kwargs):
|
|
286
|
+
# Prepare data
|
|
287
|
+
df = data.copy()
|
|
288
|
+
if hue is None:
|
|
289
|
+
df["_hue"] = "default"
|
|
290
|
+
hue = "_hue"
|
|
291
|
+
|
|
292
|
+
# Add fake hue for the right side
|
|
293
|
+
df["_fake_hue"] = df[hue] + "_right"
|
|
294
|
+
|
|
295
|
+
# Adjust hue_order and palette if provided
|
|
296
|
+
if "hue_order" in kwargs:
|
|
297
|
+
kwargs["hue_order"] = kwargs["hue_order"] + [
|
|
298
|
+
h + "_right" for h in kwargs["hue_order"]
|
|
299
|
+
]
|
|
300
|
+
|
|
301
|
+
if "palette" in kwargs:
|
|
302
|
+
palette = kwargs["palette"]
|
|
303
|
+
if isinstance(palette, dict):
|
|
304
|
+
kwargs["palette"] = {
|
|
305
|
+
**palette,
|
|
306
|
+
**{k + "_right": v for k, v in palette.items()},
|
|
307
|
+
}
|
|
308
|
+
elif isinstance(palette, list):
|
|
309
|
+
kwargs["palette"] = palette + palette
|
|
310
|
+
|
|
311
|
+
# Plot
|
|
312
|
+
sns.violinplot(data=df, x=x, y=y, hue="_fake_hue", split=True, ax=ax, **kwargs)
|
|
313
|
+
|
|
314
|
+
# Remove right half of violins
|
|
315
|
+
for collection in ax.collections:
|
|
316
|
+
if isinstance(collection, plt.matplotlib.collections.PolyCollection):
|
|
317
|
+
collection.set_clip_path(None)
|
|
318
|
+
|
|
319
|
+
# Adjust legend
|
|
320
|
+
if ax.legend_ is not None:
|
|
321
|
+
handles, labels = ax.get_legend_handles_labels()
|
|
322
|
+
ax.legend(handles[: len(handles) // 2], labels[: len(labels) // 2])
|
|
323
|
+
|
|
324
|
+
return ax
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
# import scitex
|
|
328
|
+
# import numpy as np
|
|
329
|
+
# fig, ax = scitex.plt.subplots()
|
|
330
|
+
# # Test with list data
|
|
331
|
+
# data_list = [
|
|
332
|
+
# np.random.normal(0, 1, 100),
|
|
333
|
+
# np.random.normal(2, 1.5, 100),
|
|
334
|
+
# np.random.normal(5, 0.8, 100),
|
|
335
|
+
# ]
|
|
336
|
+
# labels = ["x A", "x B", "x C"]
|
|
337
|
+
# colors = ["red", "blue", "green"]
|
|
338
|
+
# half = True
|
|
339
|
+
# ax = half_violin(
|
|
340
|
+
# ax, data_list, x=""
|
|
341
|
+
# )
|
|
342
|
+
|
|
343
|
+
# EOF
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 09:00:59 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_style/__init__.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_style/__init__.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
from ._add_marginal_ax import add_marginal_ax
|
|
13
|
+
from ._add_panel import add_panel
|
|
14
|
+
from ._extend import extend
|
|
15
|
+
from ._force_aspect import force_aspect
|
|
16
|
+
from ._format_label import format_label
|
|
17
|
+
from ._hide_spines import hide_spines
|
|
18
|
+
from ._map_ticks import map_ticks
|
|
19
|
+
from ._rotate_labels import rotate_labels
|
|
20
|
+
from ._sci_note import sci_note, OOMFormatter
|
|
21
|
+
from ._set_n_ticks import set_n_ticks
|
|
22
|
+
from ._set_size import set_size
|
|
23
|
+
from ._set_supxyt import set_supxyt, set_supxytc
|
|
24
|
+
from ._set_ticks import set_ticks
|
|
25
|
+
from ._set_xyt import set_xyt, set_xytc
|
|
26
|
+
from ._set_meta import set_meta, set_figure_meta, export_metadata_yaml
|
|
27
|
+
from ._share_axes import (
|
|
28
|
+
sharexy,
|
|
29
|
+
sharex,
|
|
30
|
+
sharey,
|
|
31
|
+
get_global_xlim,
|
|
32
|
+
get_global_ylim,
|
|
33
|
+
set_xlims,
|
|
34
|
+
set_ylims,
|
|
35
|
+
)
|
|
36
|
+
from ._shift import shift
|
|
37
|
+
|
|
38
|
+
# EOF
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-30 20:18:52 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_add_marginal_ax.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_add_marginal_ax.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib
|
|
13
|
+
from mpl_toolkits.axes_grid1 import make_axes_locatable
|
|
14
|
+
from ....plt.utils import assert_valid_axis
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def add_marginal_ax(axis, place, size=0.2, pad=0.1):
|
|
18
|
+
"""
|
|
19
|
+
Add a marginal axis to the specified side of an existing axis.
|
|
20
|
+
|
|
21
|
+
Arguments:
|
|
22
|
+
axis (matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper): The axis to which a marginal axis will be added.
|
|
23
|
+
place (str): Where to place the marginal axis ('top', 'right', 'bottom', or 'left').
|
|
24
|
+
size (float, optional): Fractional size of the marginal axis relative to the main axis. Defaults to 0.2.
|
|
25
|
+
pad (float, optional): Padding between the axes. Defaults to 0.1.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
matplotlib.axes.Axes: The newly created marginal axis.
|
|
29
|
+
"""
|
|
30
|
+
assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
31
|
+
|
|
32
|
+
divider = make_axes_locatable(axis)
|
|
33
|
+
|
|
34
|
+
size_perc_str = f"{size*100}%"
|
|
35
|
+
if place in ["left", "right"]:
|
|
36
|
+
size = 1.0 / size
|
|
37
|
+
|
|
38
|
+
axis_marginal = divider.append_axes(place, size=size_perc_str, pad=pad)
|
|
39
|
+
axis_marginal.set_box_aspect(size)
|
|
40
|
+
|
|
41
|
+
return axis_marginal
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# EOF
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-30 21:24:49 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_panel.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_panel.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
# Time-stamp: "2024-02-03 15:34:08 (ywatanabe)"
|
|
13
|
+
|
|
14
|
+
import matplotlib.pyplot as plt
|
|
15
|
+
from scitex.decorators import deprecated
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def add_panel(tgt_width_mm=40, tgt_height_mm=None):
|
|
19
|
+
"""Creates a fixed-size ax figure for panels."""
|
|
20
|
+
|
|
21
|
+
H_TO_W_RATIO = 0.7
|
|
22
|
+
MM_TO_INCH_FACTOR = 1 / 25.4
|
|
23
|
+
|
|
24
|
+
if tgt_height_mm is None:
|
|
25
|
+
tgt_height_mm = H_TO_W_RATIO * tgt_width_mm
|
|
26
|
+
|
|
27
|
+
# Convert target dimensions from millimeters to inches
|
|
28
|
+
tgt_width_in = tgt_width_mm * MM_TO_INCH_FACTOR
|
|
29
|
+
tgt_height_in = tgt_height_mm * MM_TO_INCH_FACTOR
|
|
30
|
+
|
|
31
|
+
# Create a figure with the specified dimensions
|
|
32
|
+
fig = plt.figure(figsize=(tgt_width_in * 2, tgt_height_in * 2))
|
|
33
|
+
|
|
34
|
+
# Calculate the position and size of the axes in figure units (0 to 1)
|
|
35
|
+
left = (fig.get_figwidth() - tgt_width_in) / 2 / fig.get_figwidth()
|
|
36
|
+
bottom = (fig.get_figheight() - tgt_height_in) / 2 / fig.get_figheight()
|
|
37
|
+
ax = fig.add_axes(
|
|
38
|
+
[
|
|
39
|
+
left,
|
|
40
|
+
bottom,
|
|
41
|
+
tgt_width_in / fig.get_figwidth(),
|
|
42
|
+
tgt_height_in / fig.get_figheight(),
|
|
43
|
+
]
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
return fig, ax
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@deprecated("Use add_panel instead")
|
|
50
|
+
def panel(tgt_width_mm=40, tgt_height_mm=None):
|
|
51
|
+
"""Create a figure panel with specified dimensions (deprecated).
|
|
52
|
+
|
|
53
|
+
This function is deprecated and maintained only for backward compatibility.
|
|
54
|
+
Please use `add_panel` instead.
|
|
55
|
+
|
|
56
|
+
Parameters
|
|
57
|
+
----------
|
|
58
|
+
tgt_width_mm : float, optional
|
|
59
|
+
Target width in millimeters. Default is 40.
|
|
60
|
+
tgt_height_mm : float or None, optional
|
|
61
|
+
Target height in millimeters. If None, uses golden ratio.
|
|
62
|
+
Default is None.
|
|
63
|
+
|
|
64
|
+
Returns
|
|
65
|
+
-------
|
|
66
|
+
tuple
|
|
67
|
+
(fig, ax) - matplotlib figure and axes objects
|
|
68
|
+
|
|
69
|
+
See Also
|
|
70
|
+
--------
|
|
71
|
+
add_panel : The recommended function to use instead
|
|
72
|
+
|
|
73
|
+
Examples
|
|
74
|
+
--------
|
|
75
|
+
>>> # Deprecated usage
|
|
76
|
+
>>> fig, ax = panel(tgt_width_mm=40, tgt_height_mm=30)
|
|
77
|
+
|
|
78
|
+
>>> # Recommended alternative
|
|
79
|
+
>>> fig, ax = add_panel(tgt_width_mm=40, tgt_height_mm=30)
|
|
80
|
+
"""
|
|
81
|
+
return add_panel(tgt_width_mm=40, tgt_height_mm=None)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
if __name__ == "__main__":
|
|
85
|
+
# Example usage:
|
|
86
|
+
fig, ax = panel(tgt_width_mm=40, tgt_height_mm=40 * 0.7)
|
|
87
|
+
ax.plot([1, 2, 3], [4, 5, 6])
|
|
88
|
+
ax.scatter([1, 2, 3], [4, 5, 6])
|
|
89
|
+
# ... compatible with other ax plotting methods as well
|
|
90
|
+
plt.show()
|
|
91
|
+
|
|
92
|
+
# EOF
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 09:00:51 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_style/_extend.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_style/_extend.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib
|
|
13
|
+
from ....plt.utils import assert_valid_axis
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def extend(axis, x_ratio=1.0, y_ratio=1.0):
|
|
17
|
+
"""
|
|
18
|
+
Extend or shrink a matplotlib axis or scitex axis wrapper while maintaining its center position.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
axis (matplotlib.axes._axes.Axes or scitex.plt._subplots.AxisWrapper): The axis to be modified.
|
|
22
|
+
x_ratio (float, optional): The ratio to scale the width. Default is 1.0.
|
|
23
|
+
y_ratio (float, optional): The ratio to scale the height. Default is 1.0.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
matplotlib.axes._axes.Axes or scitex.plt._subplots.AxisWrapper: The modified axis.
|
|
27
|
+
|
|
28
|
+
Raises:
|
|
29
|
+
AssertionError: If the first argument is not a valid axis.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
33
|
+
|
|
34
|
+
assert x_ratio != 0, "x_ratio must not be 0."
|
|
35
|
+
assert y_ratio != 0, "y_ratio must not be 0."
|
|
36
|
+
|
|
37
|
+
## Original coordinates
|
|
38
|
+
bbox = axis.get_position()
|
|
39
|
+
left_orig = bbox.x0
|
|
40
|
+
bottom_orig = bbox.y0
|
|
41
|
+
width_orig = bbox.x1 - bbox.x0
|
|
42
|
+
height_orig = bbox.y1 - bbox.y0
|
|
43
|
+
g_orig = (left_orig + width_orig / 2.0, bottom_orig + height_orig / 2.0)
|
|
44
|
+
|
|
45
|
+
## Target coordinates
|
|
46
|
+
g_tgt = g_orig
|
|
47
|
+
width_tgt = width_orig * x_ratio
|
|
48
|
+
height_tgt = height_orig * y_ratio
|
|
49
|
+
left_tgt = g_tgt[0] - width_tgt / 2
|
|
50
|
+
bottom_tgt = g_tgt[1] - height_tgt / 2
|
|
51
|
+
|
|
52
|
+
# Extend the axis
|
|
53
|
+
axis.set_position(
|
|
54
|
+
[
|
|
55
|
+
left_tgt,
|
|
56
|
+
bottom_tgt,
|
|
57
|
+
width_tgt,
|
|
58
|
+
height_tgt,
|
|
59
|
+
]
|
|
60
|
+
)
|
|
61
|
+
return axis
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# EOF
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-02 09:00:52 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_style/_force_aspect.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_style/_force_aspect.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib
|
|
13
|
+
from ....plt.utils import assert_valid_axis
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def force_aspect(axis, aspect=1):
|
|
17
|
+
"""
|
|
18
|
+
Forces aspect ratio of an axis based on the extent of the image.
|
|
19
|
+
|
|
20
|
+
Arguments:
|
|
21
|
+
axis (matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper): The axis to adjust.
|
|
22
|
+
aspect (float, optional): The aspect ratio to apply. Defaults to 1.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper: The axis with adjusted aspect ratio.
|
|
26
|
+
"""
|
|
27
|
+
assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
|
|
28
|
+
|
|
29
|
+
im = axis.get_images()
|
|
30
|
+
|
|
31
|
+
extent = im[0].get_extent()
|
|
32
|
+
|
|
33
|
+
axis.set_aspect(abs((extent[1] - extent[0]) / (extent[3] - extent[2])) / aspect)
|
|
34
|
+
return axis
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# EOF
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-09-15 09:39:02 (ywatanabe)"
|
|
4
|
+
# /home/ywatanabe/proj/_scitex_repo_openhands/src/scitex/plt/ax/_format_label.py
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def format_label(label):
|
|
8
|
+
"""
|
|
9
|
+
Format label by capitalizing first letter and replacing underscores with spaces.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
# if isinstance(label, str):
|
|
13
|
+
# # Replace underscores with spaces
|
|
14
|
+
# label = label.replace("_", " ")
|
|
15
|
+
|
|
16
|
+
# # Capitalize first letter of each word
|
|
17
|
+
# label = " ".join(word.capitalize() for word in label.split())
|
|
18
|
+
|
|
19
|
+
# # Special case for abbreviations (all caps)
|
|
20
|
+
# if label.isupper():
|
|
21
|
+
# return label
|
|
22
|
+
|
|
23
|
+
return label
|