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,210 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 22:05:10 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
import unittest
|
|
14
|
+
import numpy as np
|
|
15
|
+
import pandas as pd
|
|
16
|
+
|
|
17
|
+
# Import formatters directly
|
|
18
|
+
from ._format_plot import _format_plot
|
|
19
|
+
from ._format_plot_kde import _format_plot_kde
|
|
20
|
+
from ._format_plot_ecdf import _format_plot_ecdf
|
|
21
|
+
from ._format_plot_heatmap import _format_plot_heatmap
|
|
22
|
+
from ._format_plot_violin import _format_plot_violin
|
|
23
|
+
from ._format_plot_shaded_line import _format_plot_shaded_line
|
|
24
|
+
from ._format_plot_scatter_hist import _format_plot_scatter_hist
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class FormattersTest(unittest.TestCase):
|
|
28
|
+
"""Test the formatter functions."""
|
|
29
|
+
|
|
30
|
+
def test_format_plot_kde(self):
|
|
31
|
+
"""Test _format_plot_kde function."""
|
|
32
|
+
# Test case 1: Normal input
|
|
33
|
+
tracked_dict = {
|
|
34
|
+
'x': np.linspace(-3, 3, 100),
|
|
35
|
+
'kde': np.exp(-np.linspace(-3, 3, 100)**2/2),
|
|
36
|
+
'n': 500
|
|
37
|
+
}
|
|
38
|
+
id = 'test_kde'
|
|
39
|
+
df = _format_plot_kde(id, tracked_dict, {})
|
|
40
|
+
|
|
41
|
+
# Verify columns
|
|
42
|
+
self.assertIn(f"{id}_kde_x", df.columns)
|
|
43
|
+
self.assertIn(f"{id}_kde_density", df.columns)
|
|
44
|
+
self.assertIn(f"{id}_kde_n", df.columns)
|
|
45
|
+
|
|
46
|
+
# Test case 2: Empty tracked_dict
|
|
47
|
+
df = _format_plot_kde(id, {}, {})
|
|
48
|
+
self.assertTrue(df.empty)
|
|
49
|
+
|
|
50
|
+
# Test case 3: Missing 'x' key
|
|
51
|
+
tracked_dict = {'kde': np.exp(-np.linspace(-3, 3, 100)**2/2)}
|
|
52
|
+
df = _format_plot_kde(id, tracked_dict, {})
|
|
53
|
+
self.assertTrue(df.empty)
|
|
54
|
+
|
|
55
|
+
def test_format_plot(self):
|
|
56
|
+
"""Test _format_plot function."""
|
|
57
|
+
# Test case 1: Normal input
|
|
58
|
+
tracked_dict = {
|
|
59
|
+
'plot_df': pd.DataFrame({
|
|
60
|
+
'x': np.linspace(0, 10, 100),
|
|
61
|
+
'y': np.sin(np.linspace(0, 10, 100))
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
id = 'test_plot'
|
|
65
|
+
df = _format_plot(id, tracked_dict, {})
|
|
66
|
+
|
|
67
|
+
# Verify it returned the DataFrame with added prefix
|
|
68
|
+
self.assertFalse(df.empty)
|
|
69
|
+
|
|
70
|
+
# Test case 2: Empty tracked_dict
|
|
71
|
+
df = _format_plot(id, {}, {})
|
|
72
|
+
self.assertTrue(df.empty)
|
|
73
|
+
|
|
74
|
+
def test_format_plot_ecdf(self):
|
|
75
|
+
"""Test _format_plot_ecdf function."""
|
|
76
|
+
# Test case 1: Normal input
|
|
77
|
+
tracked_dict = {
|
|
78
|
+
'ecdf_df': pd.DataFrame({
|
|
79
|
+
'x': np.linspace(-3, 3, 100),
|
|
80
|
+
'ecdf': np.linspace(0, 1, 100)
|
|
81
|
+
})
|
|
82
|
+
}
|
|
83
|
+
id = 'test_ecdf'
|
|
84
|
+
df = _format_plot_ecdf(id, tracked_dict, {})
|
|
85
|
+
|
|
86
|
+
# Verify it returned the DataFrame
|
|
87
|
+
self.assertFalse(df.empty)
|
|
88
|
+
|
|
89
|
+
# Test case 2: Empty tracked_dict
|
|
90
|
+
df = _format_plot_ecdf(id, {}, {})
|
|
91
|
+
self.assertTrue(df.empty)
|
|
92
|
+
|
|
93
|
+
def test_format_plot_heatmap(self):
|
|
94
|
+
"""Test _format_plot_heatmap function."""
|
|
95
|
+
# Test case 1: Normal input with labels
|
|
96
|
+
data = np.random.rand(3, 4)
|
|
97
|
+
x_labels = ['A', 'B', 'C']
|
|
98
|
+
y_labels = ['W', 'X', 'Y', 'Z']
|
|
99
|
+
|
|
100
|
+
tracked_dict = {
|
|
101
|
+
'data': data,
|
|
102
|
+
'x_labels': x_labels,
|
|
103
|
+
'y_labels': y_labels
|
|
104
|
+
}
|
|
105
|
+
id = 'test_heatmap'
|
|
106
|
+
df = _format_plot_heatmap(id, tracked_dict, {})
|
|
107
|
+
|
|
108
|
+
# Verify it returned the DataFrame with the expected shape
|
|
109
|
+
self.assertFalse(df.empty)
|
|
110
|
+
self.assertEqual(df.shape[0], 12) # 3 rows * 4 columns = 12 cells
|
|
111
|
+
# We should have 5 columns: row, col, value, row_label, col_label
|
|
112
|
+
self.assertEqual(df.shape[1], 5)
|
|
113
|
+
|
|
114
|
+
# Test case 2: No labels
|
|
115
|
+
tracked_dict = {'data': data}
|
|
116
|
+
df = _format_plot_heatmap(id, tracked_dict, {})
|
|
117
|
+
self.assertFalse(df.empty)
|
|
118
|
+
|
|
119
|
+
# Test case 3: Empty tracked_dict
|
|
120
|
+
df = _format_plot_heatmap(id, {}, {})
|
|
121
|
+
self.assertTrue(df.empty)
|
|
122
|
+
|
|
123
|
+
def test_format_plot_violin(self):
|
|
124
|
+
"""Test _format_plot_violin function."""
|
|
125
|
+
# Test case 1: List data
|
|
126
|
+
data = [np.random.normal(0, 1, 100), np.random.normal(2, 1, 100)]
|
|
127
|
+
labels = ['Group A', 'Group B']
|
|
128
|
+
|
|
129
|
+
tracked_dict = {
|
|
130
|
+
'data': data,
|
|
131
|
+
'labels': labels
|
|
132
|
+
}
|
|
133
|
+
id = 'test_violin'
|
|
134
|
+
df = _format_plot_violin(id, tracked_dict, {})
|
|
135
|
+
|
|
136
|
+
# Verify it returned the DataFrame
|
|
137
|
+
self.assertFalse(df.empty)
|
|
138
|
+
|
|
139
|
+
# Test case 2: DataFrame data
|
|
140
|
+
data_df = pd.DataFrame({
|
|
141
|
+
'values': np.concatenate([np.random.normal(0, 1, 100), np.random.normal(2, 1, 100)]),
|
|
142
|
+
'group': ['A'] * 100 + ['B'] * 100
|
|
143
|
+
})
|
|
144
|
+
tracked_dict = {
|
|
145
|
+
'data': data_df,
|
|
146
|
+
'x': 'group',
|
|
147
|
+
'y': 'values'
|
|
148
|
+
}
|
|
149
|
+
df = _format_plot_violin(id, tracked_dict, {})
|
|
150
|
+
self.assertFalse(df.empty)
|
|
151
|
+
|
|
152
|
+
# Test case 3: Empty tracked_dict
|
|
153
|
+
df = _format_plot_violin(id, {}, {})
|
|
154
|
+
self.assertTrue(df.empty)
|
|
155
|
+
|
|
156
|
+
def test_format_plot_shaded_line(self):
|
|
157
|
+
"""Test _format_plot_shaded_line function."""
|
|
158
|
+
# Test case 1: Normal input
|
|
159
|
+
tracked_dict = {
|
|
160
|
+
'plot_df': pd.DataFrame({
|
|
161
|
+
'x': np.linspace(0, 10, 100),
|
|
162
|
+
'y_lower': np.sin(np.linspace(0, 10, 100)) - 0.2,
|
|
163
|
+
'y_middle': np.sin(np.linspace(0, 10, 100)),
|
|
164
|
+
'y_upper': np.sin(np.linspace(0, 10, 100)) + 0.2
|
|
165
|
+
})
|
|
166
|
+
}
|
|
167
|
+
id = 'test_shaded'
|
|
168
|
+
df = _format_plot_shaded_line(id, tracked_dict, {})
|
|
169
|
+
|
|
170
|
+
# Verify it returned the DataFrame
|
|
171
|
+
self.assertFalse(df.empty)
|
|
172
|
+
|
|
173
|
+
# Test case 2: Empty tracked_dict
|
|
174
|
+
df = _format_plot_shaded_line(id, {}, {})
|
|
175
|
+
self.assertTrue(df.empty)
|
|
176
|
+
|
|
177
|
+
def test_format_plot_scatter_hist(self):
|
|
178
|
+
"""Test _format_plot_scatter_hist function."""
|
|
179
|
+
# Test case 1: Normal input
|
|
180
|
+
tracked_dict = {
|
|
181
|
+
'x': np.random.normal(0, 1, 100),
|
|
182
|
+
'y': np.random.normal(0, 1, 100),
|
|
183
|
+
'hist_x': np.random.rand(10),
|
|
184
|
+
'hist_y': np.random.rand(10),
|
|
185
|
+
'bin_edges_x': np.linspace(-3, 3, 11),
|
|
186
|
+
'bin_edges_y': np.linspace(-3, 3, 11)
|
|
187
|
+
}
|
|
188
|
+
id = 'test_scatter_hist'
|
|
189
|
+
df = _format_plot_scatter_hist(id, tracked_dict, {})
|
|
190
|
+
|
|
191
|
+
# Verify it returned the DataFrame with expected columns
|
|
192
|
+
self.assertFalse(df.empty)
|
|
193
|
+
self.assertTrue(any(col.startswith(f"{id}_scatter_hist_x") for col in df.columns))
|
|
194
|
+
self.assertTrue(any(col.startswith(f"{id}_scatter_hist_y") for col in df.columns))
|
|
195
|
+
|
|
196
|
+
# Test case 2: Missing keys
|
|
197
|
+
tracked_dict = {
|
|
198
|
+
'x': np.random.normal(0, 1, 100),
|
|
199
|
+
'y': np.random.normal(0, 1, 100)
|
|
200
|
+
}
|
|
201
|
+
df = _format_plot_scatter_hist(id, tracked_dict, {})
|
|
202
|
+
self.assertFalse(df.empty) # Should still work with just x,y
|
|
203
|
+
|
|
204
|
+
# Test case 3: Empty tracked_dict
|
|
205
|
+
df = _format_plot_scatter_hist(id, {}, {})
|
|
206
|
+
self.assertTrue(df.empty)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
if __name__ == '__main__':
|
|
210
|
+
unittest.main()
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 23:14:10 (ywatanabe)"
|
|
4
|
+
# File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
import numpy as np
|
|
9
|
+
import pandas as pd
|
|
10
|
+
import matplotlib
|
|
11
|
+
matplotlib.use('Agg') # Non-interactive backend
|
|
12
|
+
|
|
13
|
+
# Add src to path if needed
|
|
14
|
+
src_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../../../'))
|
|
15
|
+
if src_path not in sys.path:
|
|
16
|
+
sys.path.insert(0, src_path)
|
|
17
|
+
|
|
18
|
+
import scitex
|
|
19
|
+
|
|
20
|
+
# Create output directory
|
|
21
|
+
OUTPUT_DIR = os.path.join(os.path.dirname(__file__), 'formatter_test_output')
|
|
22
|
+
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
|
23
|
+
|
|
24
|
+
def test_all_formatters():
|
|
25
|
+
"""
|
|
26
|
+
Test all formatters by creating actual plots and saving both image and CSV files.
|
|
27
|
+
Each function will create a different type of plot, save it, and verify the CSV export.
|
|
28
|
+
"""
|
|
29
|
+
# Test each formatter with a real plot
|
|
30
|
+
test_plot_kde()
|
|
31
|
+
test_plot_image()
|
|
32
|
+
test_plot_shaded_line()
|
|
33
|
+
test_plot_scatter_hist()
|
|
34
|
+
test_plot_violin()
|
|
35
|
+
test_plot_heatmap()
|
|
36
|
+
test_plot_ecdf()
|
|
37
|
+
test_multiple_plots()
|
|
38
|
+
|
|
39
|
+
def test_plot_kde():
|
|
40
|
+
"""Test KDE plotting and CSV export."""
|
|
41
|
+
print("Testing plot_kde...")
|
|
42
|
+
|
|
43
|
+
# Create figure
|
|
44
|
+
fig, ax = scitex.plt.subplots()
|
|
45
|
+
|
|
46
|
+
# Generate data
|
|
47
|
+
np.random.seed(42) # For reproducibility
|
|
48
|
+
data = np.concatenate([np.random.normal(0, 1, 500), np.random.normal(5, 1, 300)])
|
|
49
|
+
|
|
50
|
+
# Plot with ID for tracking
|
|
51
|
+
ax.plot_kde(data, label="Bimodal Distribution", id="kde_test")
|
|
52
|
+
|
|
53
|
+
# Style the plot
|
|
54
|
+
ax.set_xyt("Value", "Density", "KDE Test")
|
|
55
|
+
ax.legend()
|
|
56
|
+
|
|
57
|
+
# Save both image and data
|
|
58
|
+
save_path = os.path.join(OUTPUT_DIR, "kde_test.png")
|
|
59
|
+
scitex.io.save(fig, save_path)
|
|
60
|
+
|
|
61
|
+
# Verify CSV was created
|
|
62
|
+
csv_path = save_path.replace(".png", ".csv")
|
|
63
|
+
assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
|
|
64
|
+
|
|
65
|
+
# Read CSV and verify contents
|
|
66
|
+
df = pd.read_csv(csv_path)
|
|
67
|
+
assert "kde_test_kde_x" in df.columns, "Expected column 'kde_test_kde_x' not found"
|
|
68
|
+
assert "kde_test_kde_density" in df.columns, "Expected column 'kde_test_kde_density' not found"
|
|
69
|
+
|
|
70
|
+
# Close figure
|
|
71
|
+
scitex.plt.close(fig)
|
|
72
|
+
print("✓ plot_kde test successful")
|
|
73
|
+
|
|
74
|
+
def test_plot_image():
|
|
75
|
+
"""Test image plotting and CSV export."""
|
|
76
|
+
print("Testing plot_image...")
|
|
77
|
+
|
|
78
|
+
# Create figure
|
|
79
|
+
fig, ax = scitex.plt.subplots()
|
|
80
|
+
|
|
81
|
+
# Generate data
|
|
82
|
+
np.random.seed(42) # For reproducibility
|
|
83
|
+
data = np.random.rand(20, 20)
|
|
84
|
+
|
|
85
|
+
# Plot with ID for tracking
|
|
86
|
+
ax.plot_image(data, cmap="viridis", id="image_test")
|
|
87
|
+
|
|
88
|
+
# Style the plot
|
|
89
|
+
ax.set_xyt("X", "Y", "Image Test")
|
|
90
|
+
|
|
91
|
+
# Save both image and data
|
|
92
|
+
save_path = os.path.join(OUTPUT_DIR, "image_test.png")
|
|
93
|
+
scitex.io.save(fig, save_path)
|
|
94
|
+
|
|
95
|
+
# Verify CSV was created
|
|
96
|
+
csv_path = save_path.replace(".png", ".csv")
|
|
97
|
+
assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
|
|
98
|
+
|
|
99
|
+
# Read CSV and verify contents
|
|
100
|
+
df = pd.read_csv(csv_path)
|
|
101
|
+
# The formatter should have converted the 2D array to a DataFrame
|
|
102
|
+
assert not df.empty, "CSV file is empty"
|
|
103
|
+
|
|
104
|
+
# Close figure
|
|
105
|
+
scitex.plt.close(fig)
|
|
106
|
+
print("✓ plot_image test successful")
|
|
107
|
+
|
|
108
|
+
def test_plot_shaded_line():
|
|
109
|
+
"""Test shaded line plotting and CSV export."""
|
|
110
|
+
print("Testing plot_shaded_line...")
|
|
111
|
+
|
|
112
|
+
# Create figure
|
|
113
|
+
fig, ax = scitex.plt.subplots()
|
|
114
|
+
|
|
115
|
+
# Generate data
|
|
116
|
+
np.random.seed(42) # For reproducibility
|
|
117
|
+
x = np.linspace(0, 10, 100)
|
|
118
|
+
y_middle = np.sin(x)
|
|
119
|
+
y_lower = y_middle - 0.2
|
|
120
|
+
y_upper = y_middle + 0.2
|
|
121
|
+
|
|
122
|
+
# Plot with ID for tracking
|
|
123
|
+
ax.plot_shaded_line(x, y_lower, y_middle, y_upper, label="Sine with error", id="shaded_line_test")
|
|
124
|
+
|
|
125
|
+
# Style the plot
|
|
126
|
+
ax.set_xyt("X", "Y", "Shaded Line Test")
|
|
127
|
+
ax.legend()
|
|
128
|
+
|
|
129
|
+
# Save both image and data
|
|
130
|
+
save_path = os.path.join(OUTPUT_DIR, "shaded_line_test.png")
|
|
131
|
+
scitex.io.save(fig, save_path)
|
|
132
|
+
|
|
133
|
+
# Verify CSV was created
|
|
134
|
+
csv_path = save_path.replace(".png", ".csv")
|
|
135
|
+
assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
|
|
136
|
+
|
|
137
|
+
# Read CSV and verify contents
|
|
138
|
+
df = pd.read_csv(csv_path)
|
|
139
|
+
assert not df.empty, "CSV file is empty"
|
|
140
|
+
|
|
141
|
+
# Close figure
|
|
142
|
+
scitex.plt.close(fig)
|
|
143
|
+
print("✓ plot_shaded_line test successful")
|
|
144
|
+
|
|
145
|
+
def test_plot_scatter_hist():
|
|
146
|
+
"""Test scatter histogram plotting and CSV export."""
|
|
147
|
+
print("Testing plot_scatter_hist...")
|
|
148
|
+
|
|
149
|
+
# Create figure
|
|
150
|
+
fig, ax = scitex.plt.subplots(figsize=(8, 8))
|
|
151
|
+
|
|
152
|
+
# Generate data
|
|
153
|
+
np.random.seed(42) # For reproducibility
|
|
154
|
+
x = np.random.normal(0, 1, 500)
|
|
155
|
+
y = x + np.random.normal(0, 0.5, 500)
|
|
156
|
+
|
|
157
|
+
# Plot with ID for tracking
|
|
158
|
+
ax.plot_scatter_hist(x, y, hist_bins=30, scatter_alpha=0.7, id="scatter_hist_test")
|
|
159
|
+
|
|
160
|
+
# Style the plot
|
|
161
|
+
ax.set_xyt("X Values", "Y Values", "Scatter Histogram Test")
|
|
162
|
+
|
|
163
|
+
# Save both image and data
|
|
164
|
+
save_path = os.path.join(OUTPUT_DIR, "scatter_hist_test.png")
|
|
165
|
+
scitex.io.save(fig, save_path)
|
|
166
|
+
|
|
167
|
+
# Verify CSV was created
|
|
168
|
+
csv_path = save_path.replace(".png", ".csv")
|
|
169
|
+
assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
|
|
170
|
+
|
|
171
|
+
# Read CSV and verify contents
|
|
172
|
+
df = pd.read_csv(csv_path)
|
|
173
|
+
assert not df.empty, "CSV file is empty"
|
|
174
|
+
|
|
175
|
+
# Close figure
|
|
176
|
+
scitex.plt.close(fig)
|
|
177
|
+
print("✓ plot_scatter_hist test successful")
|
|
178
|
+
|
|
179
|
+
def test_plot_violin():
|
|
180
|
+
"""Test violin plotting and CSV export."""
|
|
181
|
+
print("Testing plot_violin...")
|
|
182
|
+
|
|
183
|
+
# Create figure
|
|
184
|
+
fig, ax = scitex.plt.subplots()
|
|
185
|
+
|
|
186
|
+
# Generate data
|
|
187
|
+
np.random.seed(42) # For reproducibility
|
|
188
|
+
data = [
|
|
189
|
+
np.random.normal(0, 1, 100),
|
|
190
|
+
np.random.normal(2, 1.5, 100),
|
|
191
|
+
np.random.normal(5, 0.8, 100),
|
|
192
|
+
]
|
|
193
|
+
labels = ["Group A", "Group B", "Group C"]
|
|
194
|
+
|
|
195
|
+
# Plot with ID for tracking
|
|
196
|
+
ax.plot_violin(data, labels=labels, colors=["red", "blue", "green"], id="violin_test")
|
|
197
|
+
|
|
198
|
+
# Style the plot
|
|
199
|
+
ax.set_xyt("Groups", "Values", "Violin Plot Test")
|
|
200
|
+
|
|
201
|
+
# Save both image and data
|
|
202
|
+
save_path = os.path.join(OUTPUT_DIR, "violin_test.png")
|
|
203
|
+
scitex.io.save(fig, save_path)
|
|
204
|
+
|
|
205
|
+
# Verify CSV was created
|
|
206
|
+
csv_path = save_path.replace(".png", ".csv")
|
|
207
|
+
assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
|
|
208
|
+
|
|
209
|
+
# Read CSV and verify contents
|
|
210
|
+
df = pd.read_csv(csv_path)
|
|
211
|
+
assert not df.empty, "CSV file is empty"
|
|
212
|
+
|
|
213
|
+
# Close figure
|
|
214
|
+
scitex.plt.close(fig)
|
|
215
|
+
print("✓ plot_violin test successful")
|
|
216
|
+
|
|
217
|
+
def test_plot_heatmap():
|
|
218
|
+
"""Test heatmap plotting and CSV export."""
|
|
219
|
+
print("Testing plot_heatmap...")
|
|
220
|
+
|
|
221
|
+
# Create figure
|
|
222
|
+
fig, ax = scitex.plt.subplots()
|
|
223
|
+
|
|
224
|
+
# Generate data
|
|
225
|
+
np.random.seed(42) # For reproducibility
|
|
226
|
+
data = np.random.rand(5, 10)
|
|
227
|
+
x_labels = [f"X{ii+1}" for ii in range(5)]
|
|
228
|
+
y_labels = [f"Y{ii+1}" for ii in range(10)]
|
|
229
|
+
|
|
230
|
+
# Plot with ID for tracking
|
|
231
|
+
ax.plot_heatmap(
|
|
232
|
+
data,
|
|
233
|
+
x_labels=x_labels,
|
|
234
|
+
y_labels=y_labels,
|
|
235
|
+
cbar_label="Values",
|
|
236
|
+
show_annot=True,
|
|
237
|
+
value_format="{x:.2f}",
|
|
238
|
+
cmap="viridis",
|
|
239
|
+
id="heatmap_test",
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
# Style the plot
|
|
243
|
+
ax.set_title("Heatmap Test")
|
|
244
|
+
|
|
245
|
+
# Save both image and data
|
|
246
|
+
save_path = os.path.join(OUTPUT_DIR, "heatmap_test.png")
|
|
247
|
+
scitex.io.save(fig, save_path)
|
|
248
|
+
|
|
249
|
+
# Verify CSV was created
|
|
250
|
+
csv_path = save_path.replace(".png", ".csv")
|
|
251
|
+
assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
|
|
252
|
+
|
|
253
|
+
# Read CSV and verify contents
|
|
254
|
+
df = pd.read_csv(csv_path)
|
|
255
|
+
assert not df.empty, "CSV file is empty"
|
|
256
|
+
|
|
257
|
+
# Close figure
|
|
258
|
+
scitex.plt.close(fig)
|
|
259
|
+
print("✓ plot_heatmap test successful")
|
|
260
|
+
|
|
261
|
+
def test_plot_ecdf():
|
|
262
|
+
"""Test ECDF plotting and CSV export."""
|
|
263
|
+
print("Testing plot_ecdf...")
|
|
264
|
+
|
|
265
|
+
# Create figure
|
|
266
|
+
fig, ax = scitex.plt.subplots()
|
|
267
|
+
|
|
268
|
+
# Generate data
|
|
269
|
+
np.random.seed(42) # For reproducibility
|
|
270
|
+
data = np.random.normal(0, 1, 1000)
|
|
271
|
+
|
|
272
|
+
# Plot with ID for tracking
|
|
273
|
+
ax.plot_ecdf(data, label="Normal Distribution", id="ecdf_test")
|
|
274
|
+
|
|
275
|
+
# Style the plot
|
|
276
|
+
ax.set_xyt("Value", "Cumulative Probability", "ECDF Test")
|
|
277
|
+
ax.legend()
|
|
278
|
+
|
|
279
|
+
# Save both image and data
|
|
280
|
+
save_path = os.path.join(OUTPUT_DIR, "ecdf_test.png")
|
|
281
|
+
scitex.io.save(fig, save_path)
|
|
282
|
+
|
|
283
|
+
# Verify CSV was created
|
|
284
|
+
csv_path = save_path.replace(".png", ".csv")
|
|
285
|
+
assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
|
|
286
|
+
|
|
287
|
+
# Read CSV and verify contents
|
|
288
|
+
df = pd.read_csv(csv_path)
|
|
289
|
+
assert not df.empty, "CSV file is empty"
|
|
290
|
+
|
|
291
|
+
# Close figure
|
|
292
|
+
scitex.plt.close(fig)
|
|
293
|
+
print("✓ plot_ecdf test successful")
|
|
294
|
+
|
|
295
|
+
def test_multiple_plots():
|
|
296
|
+
"""Test multiple plots on the same axis."""
|
|
297
|
+
print("Testing multiple plots on the same axis...")
|
|
298
|
+
|
|
299
|
+
# Create figure
|
|
300
|
+
fig, ax = scitex.plt.subplots()
|
|
301
|
+
|
|
302
|
+
# Generate data
|
|
303
|
+
np.random.seed(42) # For reproducibility
|
|
304
|
+
x = np.linspace(0, 10, 100)
|
|
305
|
+
y1 = np.sin(x)
|
|
306
|
+
y2 = np.cos(x)
|
|
307
|
+
|
|
308
|
+
# Create multiple plots with different IDs
|
|
309
|
+
ax.plot_line(y1, label="Sine", id="multi_test_sine")
|
|
310
|
+
ax.plot_line(y2, label="Cosine", id="multi_test_cosine")
|
|
311
|
+
|
|
312
|
+
# Style the plot
|
|
313
|
+
ax.set_xyt("X", "Y", "Multiple Plots Test")
|
|
314
|
+
ax.legend()
|
|
315
|
+
|
|
316
|
+
# Save both image and data
|
|
317
|
+
save_path = os.path.join(OUTPUT_DIR, "multiple_plots_test.png")
|
|
318
|
+
scitex.io.save(fig, save_path)
|
|
319
|
+
|
|
320
|
+
# Verify CSV was created
|
|
321
|
+
csv_path = save_path.replace(".png", ".csv")
|
|
322
|
+
assert os.path.exists(csv_path), f"CSV file not created: {csv_path}"
|
|
323
|
+
|
|
324
|
+
# Read CSV and verify contents
|
|
325
|
+
df = pd.read_csv(csv_path)
|
|
326
|
+
assert not df.empty, "CSV file is empty"
|
|
327
|
+
|
|
328
|
+
# Check that both plots are in the CSV
|
|
329
|
+
sine_cols = [col for col in df.columns if col.startswith("multi_test_sine")]
|
|
330
|
+
cosine_cols = [col for col in df.columns if col.startswith("multi_test_cosine")]
|
|
331
|
+
assert len(sine_cols) > 0, "Sine plot data not found in CSV"
|
|
332
|
+
assert len(cosine_cols) > 0, "Cosine plot data not found in CSV"
|
|
333
|
+
|
|
334
|
+
# Close figure
|
|
335
|
+
scitex.plt.close(fig)
|
|
336
|
+
print("✓ Multiple plots test successful")
|
|
337
|
+
|
|
338
|
+
if __name__ == "__main__":
|
|
339
|
+
print("Starting formatter verification tests...")
|
|
340
|
+
test_all_formatters()
|
|
341
|
+
print("\nAll formatter tests completed successfully!")
|
|
342
|
+
print(f"Output files are in: {OUTPUT_DIR}")
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_export_as_csv_formatters.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
__FILE__ = (
|
|
8
|
+
"./src/scitex/plt/_subplots/_export_as_csv_formatters.py"
|
|
9
|
+
)
|
|
10
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
+
# ----------------------------------------
|
|
12
|
+
|
|
13
|
+
# Import formatters from the submodule
|
|
14
|
+
from scitex.plt._subplots._export_as_csv_formatters import (
|
|
15
|
+
# Standard matplotlib formatters
|
|
16
|
+
_format_plot,
|
|
17
|
+
_format_scatter,
|
|
18
|
+
_format_bar,
|
|
19
|
+
_format_barh,
|
|
20
|
+
_format_hist,
|
|
21
|
+
_format_boxplot,
|
|
22
|
+
_format_contour,
|
|
23
|
+
_format_errorbar,
|
|
24
|
+
_format_eventplot,
|
|
25
|
+
_format_fill,
|
|
26
|
+
_format_fill_between,
|
|
27
|
+
_format_imshow,
|
|
28
|
+
_format_imshow2d,
|
|
29
|
+
_format_violin,
|
|
30
|
+
_format_violinplot,
|
|
31
|
+
|
|
32
|
+
# Custom plotting formatters
|
|
33
|
+
_format_plot_box,
|
|
34
|
+
_format_plot_conf_mat,
|
|
35
|
+
_format_plot_ecdf,
|
|
36
|
+
_format_plot_fillv,
|
|
37
|
+
_format_plot_heatmap,
|
|
38
|
+
_format_plot_image,
|
|
39
|
+
_format_plot_joyplot,
|
|
40
|
+
_format_plot_kde,
|
|
41
|
+
_format_plot_line,
|
|
42
|
+
_format_plot_mean_ci,
|
|
43
|
+
_format_plot_mean_std,
|
|
44
|
+
_format_plot_median_iqr,
|
|
45
|
+
_format_plot_raster,
|
|
46
|
+
_format_plot_rectangle,
|
|
47
|
+
_format_plot_scatter_hist,
|
|
48
|
+
_format_plot_shaded_line,
|
|
49
|
+
_format_plot_violin,
|
|
50
|
+
|
|
51
|
+
# Seaborn formatters
|
|
52
|
+
_format_sns_barplot,
|
|
53
|
+
_format_sns_boxplot,
|
|
54
|
+
_format_sns_heatmap,
|
|
55
|
+
_format_sns_histplot,
|
|
56
|
+
_format_sns_jointplot,
|
|
57
|
+
_format_sns_kdeplot,
|
|
58
|
+
_format_sns_lineplot,
|
|
59
|
+
_format_sns_pairplot,
|
|
60
|
+
_format_sns_scatterplot,
|
|
61
|
+
_format_sns_stripplot,
|
|
62
|
+
_format_sns_swarmplot,
|
|
63
|
+
_format_sns_violinplot,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
def main():
|
|
67
|
+
# Line
|
|
68
|
+
import scitex
|
|
69
|
+
import matplotlib.pyplot as plt
|
|
70
|
+
|
|
71
|
+
fig, ax = scitex.plt.subplots()
|
|
72
|
+
ax.plot([1, 2, 3], [4, 5, 6], id="plot1")
|
|
73
|
+
ax.plot([4, 5, 6], [1, 2, 3], id="plot2")
|
|
74
|
+
scitex.io.save(fig, "./plots.png")
|
|
75
|
+
scitex.io.save(ax.export_as_csv(), "./plots.csv")
|
|
76
|
+
|
|
77
|
+
# No tracking
|
|
78
|
+
fig, ax = scitex.plt.subplots(track=False)
|
|
79
|
+
ax.plot([1, 2, 3], [4, 5, 6], id="plot3")
|
|
80
|
+
ax.plot([4, 5, 6], [1, 2, 3], id="plot4")
|
|
81
|
+
scitex.io.save(fig, "./plots_wo_tracking.png")
|
|
82
|
+
scitex.io.save(ax.export_as_csv(), "./plots_wo_tracking.csv")
|
|
83
|
+
|
|
84
|
+
# Scatter
|
|
85
|
+
fig, ax = scitex.plt.subplots()
|
|
86
|
+
ax.scatter([1, 2, 3], [4, 5, 6], id="scatter1")
|
|
87
|
+
ax.scatter([4, 5, 6], [1, 2, 3], id="scatter2")
|
|
88
|
+
scitex.io.save(fig, "./scatters.png")
|
|
89
|
+
scitex.io.save(ax.export_as_csv(), "./scatters.csv")
|
|
90
|
+
|
|
91
|
+
# Box
|
|
92
|
+
fig, ax = scitex.plt.subplots()
|
|
93
|
+
ax.boxplot([1, 2, 3], id="boxplot1")
|
|
94
|
+
scitex.io.save(fig, "./boxplot1.png")
|
|
95
|
+
scitex.io.save(ax.export_as_csv(), "./boxplot1.csv")
|
|
96
|
+
|
|
97
|
+
# Bar
|
|
98
|
+
fig, ax = scitex.plt.subplots()
|
|
99
|
+
ax.bar(["A", "B", "C"], [4, 5, 6], id="bar1")
|
|
100
|
+
scitex.io.save(fig, "./bar1.png")
|
|
101
|
+
scitex.io.save(ax.export_as_csv(), "./bar1.csv")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
if __name__ == "__main__":
|
|
105
|
+
# Main
|
|
106
|
+
import sys
|
|
107
|
+
import scitex
|
|
108
|
+
|
|
109
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(
|
|
110
|
+
sys, plt, verbose=False, agg=True
|
|
111
|
+
)
|
|
112
|
+
main()
|
|
113
|
+
scitex.gen.close(CONFIG, verbose=False, notify=False)
|
|
114
|
+
|
|
115
|
+
# EOF
|
scitex/plt/_tpl.py
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-03-31 11:58:28 (ywatanabe)"
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
import termplotlib as tpl
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def termplot(*args):
|
|
10
|
+
"""
|
|
11
|
+
Plots given y values against x using termplotlib, or plots a single y array against its indices if x is not provided.
|
|
12
|
+
|
|
13
|
+
Parameters:
|
|
14
|
+
- *args: Accepts either one argument (y values) or two arguments (x and y values).
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
None. Displays the plot in the terminal.
|
|
18
|
+
"""
|
|
19
|
+
if len(args) == 1:
|
|
20
|
+
y = args[0] # [REVISED]
|
|
21
|
+
x = np.arange(len(y))
|
|
22
|
+
|
|
23
|
+
if len(args) == 2:
|
|
24
|
+
x, y = args
|
|
25
|
+
|
|
26
|
+
fig = tpl.figure()
|
|
27
|
+
fig.plot(x, y)
|
|
28
|
+
fig.show()
|