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,261 @@
|
|
|
1
|
+
#!./env/bin/python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2025-06-04 11:35:00 (ywatanabe)"
|
|
4
|
+
# Author: Yusuke Watanabe (ywata1989@gmail.com)
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Scientific metadata management for figures with YAML export.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# Imports
|
|
11
|
+
import yaml
|
|
12
|
+
from typing import Optional, List, Dict, Any
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Functions
|
|
16
|
+
def set_meta(ax, caption=None, methods=None, stats=None, keywords=None,
|
|
17
|
+
experimental_details=None, journal_style=None,
|
|
18
|
+
significance=None, **kwargs):
|
|
19
|
+
"""Set comprehensive scientific metadata for figures with YAML export
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
ax : matplotlib.axes.Axes or scitex AxisWrapper
|
|
24
|
+
The axes to modify
|
|
25
|
+
caption : str, optional
|
|
26
|
+
Figure caption text
|
|
27
|
+
methods : str, optional
|
|
28
|
+
Experimental methods description
|
|
29
|
+
stats : str, optional
|
|
30
|
+
Statistical analysis details
|
|
31
|
+
keywords : List[str], optional
|
|
32
|
+
Keywords for categorization and search
|
|
33
|
+
experimental_details : Dict[str, Any], optional
|
|
34
|
+
Structured experimental parameters (n_samples, temperature, etc.)
|
|
35
|
+
journal_style : str, optional
|
|
36
|
+
Target journal style ('nature', 'science', 'ieee', 'cell', etc.)
|
|
37
|
+
significance : str, optional
|
|
38
|
+
Significance statement or implications
|
|
39
|
+
**kwargs : additional metadata
|
|
40
|
+
Any additional metadata fields
|
|
41
|
+
|
|
42
|
+
Returns
|
|
43
|
+
-------
|
|
44
|
+
ax : matplotlib.axes.Axes or scitex AxisWrapper
|
|
45
|
+
The modified axes
|
|
46
|
+
|
|
47
|
+
Examples
|
|
48
|
+
--------
|
|
49
|
+
>>> fig, ax = scitex.plt.subplots()
|
|
50
|
+
>>> ax.plot(x, y, id='neural_data')
|
|
51
|
+
>>> ax.set_xyt(x='Time (ms)', y='Voltage (mV)', t='Neural Recording')
|
|
52
|
+
>>> ax.set_meta(
|
|
53
|
+
... caption='Intracellular recording showing action potentials.',
|
|
54
|
+
... methods='Whole-cell patch-clamp in acute brain slices.',
|
|
55
|
+
... stats='Statistical analysis using paired t-test (p<0.05).',
|
|
56
|
+
... keywords=['electrophysiology', 'neural_recording', 'patch_clamp'],
|
|
57
|
+
... experimental_details={
|
|
58
|
+
... 'n_samples': 15,
|
|
59
|
+
... 'temperature': 32,
|
|
60
|
+
... 'recording_duration': 600,
|
|
61
|
+
... 'electrode_resistance': '3-5 MΩ'
|
|
62
|
+
... },
|
|
63
|
+
... journal_style='nature',
|
|
64
|
+
... significance='Demonstrates novel neural dynamics in layer 2/3 pyramidal cells.'
|
|
65
|
+
... )
|
|
66
|
+
>>> scitex.io.save(fig, 'neural_recording.png') # YAML metadata auto-saved
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
# Build comprehensive metadata dictionary
|
|
70
|
+
metadata = {}
|
|
71
|
+
|
|
72
|
+
if caption is not None:
|
|
73
|
+
metadata['caption'] = caption
|
|
74
|
+
if methods is not None:
|
|
75
|
+
metadata['methods'] = methods
|
|
76
|
+
if stats is not None:
|
|
77
|
+
metadata['statistical_analysis'] = stats
|
|
78
|
+
if keywords is not None:
|
|
79
|
+
metadata['keywords'] = keywords if isinstance(keywords, list) else [keywords]
|
|
80
|
+
if experimental_details is not None:
|
|
81
|
+
metadata['experimental_details'] = experimental_details
|
|
82
|
+
if journal_style is not None:
|
|
83
|
+
metadata['journal_style'] = journal_style
|
|
84
|
+
if significance is not None:
|
|
85
|
+
metadata['significance'] = significance
|
|
86
|
+
|
|
87
|
+
# Add any additional metadata
|
|
88
|
+
for key, value in kwargs.items():
|
|
89
|
+
if value is not None:
|
|
90
|
+
metadata[key] = value
|
|
91
|
+
|
|
92
|
+
# Add automatic metadata
|
|
93
|
+
import datetime
|
|
94
|
+
metadata['created_timestamp'] = datetime.datetime.now().isoformat()
|
|
95
|
+
metadata['scitex_version'] = '1.11.0' # TODO: Get from __version__
|
|
96
|
+
|
|
97
|
+
# Store metadata in figure for automatic saving
|
|
98
|
+
fig = ax.get_figure()
|
|
99
|
+
if not hasattr(fig, '_scitex_metadata'):
|
|
100
|
+
fig._scitex_metadata = {}
|
|
101
|
+
|
|
102
|
+
# Use axis as key for panel-specific metadata
|
|
103
|
+
fig._scitex_metadata[ax] = metadata
|
|
104
|
+
|
|
105
|
+
# Also store as YAML-ready structure
|
|
106
|
+
if not hasattr(fig, '_scitex_yaml_metadata'):
|
|
107
|
+
fig._scitex_yaml_metadata = {}
|
|
108
|
+
fig._scitex_yaml_metadata[ax] = metadata
|
|
109
|
+
|
|
110
|
+
# Backward compatibility - store simple caption
|
|
111
|
+
if caption is not None:
|
|
112
|
+
if not hasattr(fig, '_scitex_captions'):
|
|
113
|
+
fig._scitex_captions = {}
|
|
114
|
+
fig._scitex_captions[ax] = caption
|
|
115
|
+
|
|
116
|
+
return ax
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def set_figure_meta(ax, caption=None, methods=None, stats=None, significance=None,
|
|
120
|
+
funding=None, conflicts=None, data_availability=None, **kwargs):
|
|
121
|
+
"""Set figure-level metadata for multi-panel figures
|
|
122
|
+
|
|
123
|
+
Parameters
|
|
124
|
+
----------
|
|
125
|
+
ax : matplotlib.axes.Axes or scitex AxisWrapper
|
|
126
|
+
Any axis in the figure (figure accessed via ax.get_figure())
|
|
127
|
+
caption : str, optional
|
|
128
|
+
Figure-level caption
|
|
129
|
+
methods : str, optional
|
|
130
|
+
Overall experimental methods
|
|
131
|
+
stats : str, optional
|
|
132
|
+
Overall statistical approach
|
|
133
|
+
significance : str, optional
|
|
134
|
+
Significance and implications
|
|
135
|
+
funding : str, optional
|
|
136
|
+
Funding acknowledgments
|
|
137
|
+
conflicts : str, optional
|
|
138
|
+
Conflict of interest statement
|
|
139
|
+
data_availability : str, optional
|
|
140
|
+
Data availability statement
|
|
141
|
+
**kwargs : additional metadata
|
|
142
|
+
Any additional figure-level metadata
|
|
143
|
+
|
|
144
|
+
Returns
|
|
145
|
+
-------
|
|
146
|
+
ax : matplotlib.axes.Axes or scitex AxisWrapper
|
|
147
|
+
The modified axes
|
|
148
|
+
|
|
149
|
+
Examples
|
|
150
|
+
--------
|
|
151
|
+
>>> fig, ((ax1, ax2), (ax3, ax4)) = scitex.plt.subplots(2, 2)
|
|
152
|
+
>>> # Set individual panel metadata...
|
|
153
|
+
>>> ax1.set_meta(caption='Panel A analysis...')
|
|
154
|
+
>>> ax2.set_meta(caption='Panel B comparison...')
|
|
155
|
+
>>>
|
|
156
|
+
>>> # Set figure-level metadata
|
|
157
|
+
>>> ax1.set_figure_meta(
|
|
158
|
+
... caption='Comprehensive analysis of neural dynamics...',
|
|
159
|
+
... significance='This work demonstrates novel therapeutic targets.',
|
|
160
|
+
... funding='Supported by NIH grant R01-NS123456.',
|
|
161
|
+
... data_availability='Data available at doi:10.5061/dryad.example'
|
|
162
|
+
... )
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
# Build figure-level metadata
|
|
166
|
+
figure_metadata = {}
|
|
167
|
+
|
|
168
|
+
if caption is not None:
|
|
169
|
+
figure_metadata['main_caption'] = caption
|
|
170
|
+
if methods is not None:
|
|
171
|
+
figure_metadata['overall_methods'] = methods
|
|
172
|
+
if stats is not None:
|
|
173
|
+
figure_metadata['overall_statistics'] = stats
|
|
174
|
+
if significance is not None:
|
|
175
|
+
figure_metadata['significance'] = significance
|
|
176
|
+
if funding is not None:
|
|
177
|
+
figure_metadata['funding'] = funding
|
|
178
|
+
if conflicts is not None:
|
|
179
|
+
figure_metadata['conflicts_of_interest'] = conflicts
|
|
180
|
+
if data_availability is not None:
|
|
181
|
+
figure_metadata['data_availability'] = data_availability
|
|
182
|
+
|
|
183
|
+
# Add any additional metadata
|
|
184
|
+
for key, value in kwargs.items():
|
|
185
|
+
if value is not None:
|
|
186
|
+
figure_metadata[key] = value
|
|
187
|
+
|
|
188
|
+
# Add automatic metadata
|
|
189
|
+
import datetime
|
|
190
|
+
figure_metadata['created_timestamp'] = datetime.datetime.now().isoformat()
|
|
191
|
+
|
|
192
|
+
# Store in figure
|
|
193
|
+
fig = ax.get_figure()
|
|
194
|
+
fig._scitex_figure_metadata = figure_metadata
|
|
195
|
+
|
|
196
|
+
# Backward compatibility
|
|
197
|
+
if caption is not None:
|
|
198
|
+
fig._scitex_main_caption = caption
|
|
199
|
+
|
|
200
|
+
return ax
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def export_metadata_yaml(fig, filepath):
|
|
204
|
+
"""Export all figure metadata to YAML file
|
|
205
|
+
|
|
206
|
+
Parameters
|
|
207
|
+
----------
|
|
208
|
+
fig : matplotlib.figure.Figure
|
|
209
|
+
Figure with metadata
|
|
210
|
+
filepath : str
|
|
211
|
+
Output YAML file path
|
|
212
|
+
"""
|
|
213
|
+
import datetime
|
|
214
|
+
|
|
215
|
+
# Collect all metadata
|
|
216
|
+
export_data = {
|
|
217
|
+
'figure_metadata': {},
|
|
218
|
+
'panel_metadata': {},
|
|
219
|
+
'export_info': {
|
|
220
|
+
'timestamp': datetime.datetime.now().isoformat(),
|
|
221
|
+
'scitex_version': '1.11.0'
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
# Figure-level metadata
|
|
226
|
+
if hasattr(fig, '_scitex_figure_metadata'):
|
|
227
|
+
export_data['figure_metadata'] = fig._scitex_figure_metadata
|
|
228
|
+
|
|
229
|
+
# Panel-level metadata
|
|
230
|
+
if hasattr(fig, '_scitex_yaml_metadata'):
|
|
231
|
+
for i, (ax, metadata) in enumerate(fig._scitex_yaml_metadata.items()):
|
|
232
|
+
panel_key = f'panel_{i+1}'
|
|
233
|
+
export_data['panel_metadata'][panel_key] = metadata
|
|
234
|
+
|
|
235
|
+
# Write YAML file
|
|
236
|
+
with open(filepath, 'w') as f:
|
|
237
|
+
yaml.dump(export_data, f, default_flow_style=False, sort_keys=False, indent=2)
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
if __name__ == "__main__":
|
|
241
|
+
# Start
|
|
242
|
+
import sys
|
|
243
|
+
import matplotlib.pyplot as plt
|
|
244
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(sys, plt)
|
|
245
|
+
|
|
246
|
+
# Example usage
|
|
247
|
+
fig, ax = plt.subplots()
|
|
248
|
+
ax.plot([1, 2, 3], [1, 4, 2])
|
|
249
|
+
|
|
250
|
+
set_meta(ax,
|
|
251
|
+
caption='Example figure showing data trends.',
|
|
252
|
+
methods='Synthetic data generated for demonstration.',
|
|
253
|
+
keywords=['example', 'demo', 'synthetic'],
|
|
254
|
+
experimental_details={'n_samples': 3, 'data_type': 'synthetic'})
|
|
255
|
+
|
|
256
|
+
export_metadata_yaml(fig, 'example_metadata.yaml')
|
|
257
|
+
|
|
258
|
+
# Close
|
|
259
|
+
scitex.gen.close(CONFIG)
|
|
260
|
+
|
|
261
|
+
# EOF
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-29 12:02:14 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_set_n_ticks.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_set_n_ticks.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def set_n_ticks(
|
|
16
|
+
ax,
|
|
17
|
+
n_xticks=4,
|
|
18
|
+
n_yticks=4,
|
|
19
|
+
):
|
|
20
|
+
"""
|
|
21
|
+
Example:
|
|
22
|
+
ax = set_n_ticks(ax)
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
if n_xticks is not None:
|
|
26
|
+
ax.xaxis.set_major_locator(matplotlib.ticker.MaxNLocator(n_xticks))
|
|
27
|
+
|
|
28
|
+
if n_yticks is not None:
|
|
29
|
+
ax.yaxis.set_major_locator(matplotlib.ticker.MaxNLocator(n_yticks))
|
|
30
|
+
|
|
31
|
+
# Force the figure to redraw to reflect changes
|
|
32
|
+
ax.figure.canvas.draw()
|
|
33
|
+
|
|
34
|
+
return ax
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# EOF
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2022-12-09 13:38:11 (ywatanabe)"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def set_size(ax, w, h):
|
|
7
|
+
"""w, h: width, height in inches"""
|
|
8
|
+
# if not ax: ax=plt.gca()
|
|
9
|
+
l = ax.figure.subplotpars.left
|
|
10
|
+
r = ax.figure.subplotpars.right
|
|
11
|
+
t = ax.figure.subplotpars.top
|
|
12
|
+
b = ax.figure.subplotpars.bottom
|
|
13
|
+
figw = float(w) / (r - l)
|
|
14
|
+
figh = float(h) / (t - b)
|
|
15
|
+
ax.figure.set_size_inches(figw, figh)
|
|
16
|
+
return ax
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!./env/bin/python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-07-13 07:56:46 (ywatanabe)"
|
|
4
|
+
# Author: Yusuke Watanabe (ywata1989@gmail.com)
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
This script does XYZ.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# Imports
|
|
11
|
+
import matplotlib.pyplot as plt
|
|
12
|
+
|
|
13
|
+
from ._format_label import format_label
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Functions
|
|
17
|
+
def set_supxyt(ax, xlabel=False, ylabel=False, title=False, format_labels=True):
|
|
18
|
+
"""Sets xlabel, ylabel and title"""
|
|
19
|
+
fig = ax.get_figure()
|
|
20
|
+
|
|
21
|
+
# if xlabel is not False:
|
|
22
|
+
# fig.supxlabel(xlabel)
|
|
23
|
+
|
|
24
|
+
# if ylabel is not False:
|
|
25
|
+
# fig.supylabel(ylabel)
|
|
26
|
+
|
|
27
|
+
# if title is not False:
|
|
28
|
+
# fig.suptitle(title)
|
|
29
|
+
if xlabel is not False:
|
|
30
|
+
xlabel = format_label(xlabel) if format_labels else xlabel
|
|
31
|
+
fig.supxlabel(xlabel)
|
|
32
|
+
|
|
33
|
+
if ylabel is not False:
|
|
34
|
+
ylabel = format_label(ylabel) if format_labels else ylabel
|
|
35
|
+
fig.supylabel(ylabel)
|
|
36
|
+
|
|
37
|
+
if title is not False:
|
|
38
|
+
title = format_label(title) if format_labels else title
|
|
39
|
+
fig.suptitle(title)
|
|
40
|
+
|
|
41
|
+
return ax
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def set_supxytc(ax, xlabel=False, ylabel=False, title=False, caption=False, methods=False, stats=False, significance=False, format_labels=True):
|
|
45
|
+
"""Sets figure-level xlabel, ylabel, title, and caption with SciTeX-Paper integration
|
|
46
|
+
|
|
47
|
+
Parameters
|
|
48
|
+
----------
|
|
49
|
+
ax : matplotlib.axes.Axes or scitex AxisWrapper
|
|
50
|
+
The axes to modify (figure accessed via ax.get_figure())
|
|
51
|
+
xlabel : str or False, optional
|
|
52
|
+
Figure-level X-axis label, by default False
|
|
53
|
+
ylabel : str or False, optional
|
|
54
|
+
Figure-level Y-axis label, by default False
|
|
55
|
+
title : str or False, optional
|
|
56
|
+
Figure-level title (suptitle), by default False
|
|
57
|
+
caption : str or False, optional
|
|
58
|
+
Figure-level caption to store for later use with scitex.io.save(), by default False
|
|
59
|
+
methods : str or False, optional
|
|
60
|
+
Overall methods description for SciTeX-Paper integration, by default False
|
|
61
|
+
stats : str or False, optional
|
|
62
|
+
Overall statistical analysis details for SciTeX-Paper integration, by default False
|
|
63
|
+
significance : str or False, optional
|
|
64
|
+
Significance statement for SciTeX-Paper integration, by default False
|
|
65
|
+
format_labels : bool, optional
|
|
66
|
+
Whether to apply automatic formatting, by default True
|
|
67
|
+
|
|
68
|
+
Returns
|
|
69
|
+
-------
|
|
70
|
+
ax : matplotlib.axes.Axes or scitex AxisWrapper
|
|
71
|
+
The modified axes
|
|
72
|
+
|
|
73
|
+
Examples
|
|
74
|
+
--------
|
|
75
|
+
>>> fig, ((ax1, ax2), (ax3, ax4)) = scitex.plt.subplots(2, 2)
|
|
76
|
+
>>> # Add plots to each panel...
|
|
77
|
+
>>> ax1.set_supxytc(xlabel='Time (s)', ylabel='Signal Amplitude',
|
|
78
|
+
... title='Multi-Panel Analysis',
|
|
79
|
+
... caption='Comprehensive analysis showing (A) raw data, (B) filtered signal, (C) power spectrum, and (D) phase analysis.',
|
|
80
|
+
... methods='All experiments performed using standardized protocols.',
|
|
81
|
+
... significance='This work demonstrates novel therapeutic targets.')
|
|
82
|
+
>>> scitex.io.save(fig, 'multi_panel.png') # Caption automatically saved
|
|
83
|
+
"""
|
|
84
|
+
# Set labels and title using existing function
|
|
85
|
+
set_supxyt(ax, xlabel=xlabel, ylabel=ylabel, title=title, format_labels=format_labels)
|
|
86
|
+
|
|
87
|
+
# Store figure-level caption and extended metadata
|
|
88
|
+
if caption is not False or methods is not False or stats is not False or significance is not False:
|
|
89
|
+
fig = ax.get_figure()
|
|
90
|
+
# Store comprehensive figure-level metadata
|
|
91
|
+
fig_metadata = {
|
|
92
|
+
'main_caption': caption if caption is not False else None,
|
|
93
|
+
'methods': methods if methods is not False else None,
|
|
94
|
+
'stats': stats if stats is not False else None,
|
|
95
|
+
'significance': significance if significance is not False else None
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
fig._scitex_figure_metadata = fig_metadata
|
|
99
|
+
|
|
100
|
+
# Backward compatibility - also store simple caption
|
|
101
|
+
if caption is not False:
|
|
102
|
+
fig._scitex_main_caption = caption
|
|
103
|
+
|
|
104
|
+
return ax
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
if __name__ == "__main__":
|
|
108
|
+
# Start
|
|
109
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(sys, plt)
|
|
110
|
+
|
|
111
|
+
# (YOUR AWESOME CODE)
|
|
112
|
+
|
|
113
|
+
# Close
|
|
114
|
+
scitex.gen.close(CONFIG)
|
|
115
|
+
|
|
116
|
+
# EOF
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-04-27 20:04:55 (ywatanabe)"
|
|
4
|
+
# File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_set_ticks.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/plt/ax/_style/_set_ticks.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import matplotlib.pyplot as plt
|
|
13
|
+
import numpy as np
|
|
14
|
+
|
|
15
|
+
from ....dict._to_str import to_str
|
|
16
|
+
from ....types import is_listed_X
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def set_ticks(ax, xvals=None, xticks=None, yvals=None, yticks=None):
|
|
20
|
+
"""Set custom tick labels on both x and y axes.
|
|
21
|
+
|
|
22
|
+
Convenience function to set tick positions and labels for both axes
|
|
23
|
+
at once. Automatically handles canvas updates for interactive backends.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
ax : matplotlib.axes.Axes
|
|
28
|
+
The axes object to modify.
|
|
29
|
+
xvals : array-like, optional
|
|
30
|
+
Values corresponding to x-axis data points.
|
|
31
|
+
xticks : list, optional
|
|
32
|
+
Desired tick labels for the x-axis.
|
|
33
|
+
yvals : array-like, optional
|
|
34
|
+
Values corresponding to y-axis data points.
|
|
35
|
+
yticks : list, optional
|
|
36
|
+
Desired tick labels for the y-axis.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
matplotlib.axes.Axes
|
|
41
|
+
The modified axes object.
|
|
42
|
+
|
|
43
|
+
Examples
|
|
44
|
+
--------
|
|
45
|
+
>>> fig, ax = plt.subplots()
|
|
46
|
+
>>> x = np.linspace(0, 10, 100)
|
|
47
|
+
>>> ax.plot(x, np.sin(x))
|
|
48
|
+
>>> ax = set_ticks(ax, xvals=x, xticks=[0, 5, 10],
|
|
49
|
+
... yvals=[-1, 0, 1], yticks=['-1', '0', '1'])
|
|
50
|
+
|
|
51
|
+
See Also
|
|
52
|
+
--------
|
|
53
|
+
set_x_ticks : Set ticks for x-axis only
|
|
54
|
+
set_y_ticks : Set ticks for y-axis only
|
|
55
|
+
"""
|
|
56
|
+
ax = set_x_ticks(ax, x_vals=xvals, x_ticks=xticks)
|
|
57
|
+
ax = set_y_ticks(ax, y_vals=yvals, y_ticks=yticks)
|
|
58
|
+
canvas_type = type(ax.figure.canvas).__name__
|
|
59
|
+
if "TkAgg" in canvas_type:
|
|
60
|
+
ax.get_figure().canvas.draw() # Redraw the canvas once after making all updates
|
|
61
|
+
return ax
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def set_x_ticks(ax, x_vals=None, x_ticks=None):
|
|
65
|
+
"""
|
|
66
|
+
Set custom tick labels on the x and y axes based on specified values and desired ticks.
|
|
67
|
+
|
|
68
|
+
Parameters:
|
|
69
|
+
- ax: The axis object to modify.
|
|
70
|
+
- x_vals: Array of x-axis values.
|
|
71
|
+
- x_ticks: List of desired tick labels on the x-axis.
|
|
72
|
+
- y_vals: Array of y-axis values.
|
|
73
|
+
- y_ticks: List of desired tick labels on the y-axis.
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
import matplotlib.pyplot as plt
|
|
77
|
+
import numpy as np
|
|
78
|
+
|
|
79
|
+
fig, axes = plt.subplots(nrows=4)
|
|
80
|
+
x = np.linspace(0, 10, 100)
|
|
81
|
+
y = np.sin(x)
|
|
82
|
+
for ax in axes:
|
|
83
|
+
ax.plot(x, y) # Plot a sine wave
|
|
84
|
+
|
|
85
|
+
set_ticks(axes[0]) # Do nothing # OK
|
|
86
|
+
set_ticks(axes[1], x_vals=x+3) # OK
|
|
87
|
+
set_ticks(axes[2], x_ticks=[1,2]) # OK
|
|
88
|
+
set_ticks(axes[3], x_vals=x+3, x_ticks=[4,5]) # Auto-generate ticks across the range
|
|
89
|
+
fig.tight_layout()
|
|
90
|
+
plt.show()
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
def _avoid_overlaps(values):
|
|
94
|
+
values = np.array(values)
|
|
95
|
+
if ("int" in str(values.dtype)) or ("float" in str(values.dtype)):
|
|
96
|
+
values = values.astype(float) + np.arange(len(values)) * 1e-5
|
|
97
|
+
return values
|
|
98
|
+
|
|
99
|
+
def _set_x_vals(ax, x_vals):
|
|
100
|
+
x_vals = _avoid_overlaps(x_vals)
|
|
101
|
+
new_x_axis = np.linspace(*ax.get_xlim(), len(x_vals))
|
|
102
|
+
ax.set_xticks(new_x_axis)
|
|
103
|
+
ax.set_xticklabels([f"{xv}" for xv in x_vals])
|
|
104
|
+
return ax
|
|
105
|
+
|
|
106
|
+
def _set_x_ticks(ax, x_ticks):
|
|
107
|
+
x_ticks = np.array(x_ticks)
|
|
108
|
+
if x_ticks.dtype.kind in ["U", "S", "O"]: # If x_ticks are strings
|
|
109
|
+
ax.set_xticks(range(len(x_ticks)))
|
|
110
|
+
ax.set_xticklabels(x_ticks)
|
|
111
|
+
else:
|
|
112
|
+
x_vals = np.array(
|
|
113
|
+
[label.get_text().replace("−", "-") for label in ax.get_xticklabels()]
|
|
114
|
+
)
|
|
115
|
+
x_vals = x_vals.astype(float)
|
|
116
|
+
x_indi = np.argmin(
|
|
117
|
+
np.array(np.abs(x_vals[:, np.newaxis] - x_ticks[np.newaxis, :])),
|
|
118
|
+
axis=0,
|
|
119
|
+
)
|
|
120
|
+
ax.set_xticks(ax.get_xticks()[x_indi])
|
|
121
|
+
ax.set_xticklabels([f"{xt}" for xt in x_ticks])
|
|
122
|
+
return ax
|
|
123
|
+
|
|
124
|
+
x_vals_passed = x_vals is not None
|
|
125
|
+
x_ticks_passed = x_ticks is not None
|
|
126
|
+
|
|
127
|
+
if is_listed_X(x_ticks, dict):
|
|
128
|
+
x_ticks = [to_str(xt, delimiter="\n") for xt in x_ticks]
|
|
129
|
+
|
|
130
|
+
if (not x_vals_passed) and (not x_ticks_passed):
|
|
131
|
+
# Do nothing
|
|
132
|
+
pass
|
|
133
|
+
|
|
134
|
+
elif x_vals_passed and (not x_ticks_passed):
|
|
135
|
+
# Replaces the x axis to x_vals
|
|
136
|
+
x_ticks = np.linspace(x_vals[0], x_vals[-1], 4)
|
|
137
|
+
ax = _set_x_vals(ax, x_ticks)
|
|
138
|
+
|
|
139
|
+
elif (not x_vals_passed) and x_ticks_passed:
|
|
140
|
+
# Locates 'x_ticks' on the original x axis
|
|
141
|
+
ax.set_xticks(x_ticks)
|
|
142
|
+
|
|
143
|
+
elif x_vals_passed and x_ticks_passed:
|
|
144
|
+
if isinstance(x_vals, str):
|
|
145
|
+
if x_vals == "auto":
|
|
146
|
+
x_vals = np.arange(len(x_ticks))
|
|
147
|
+
|
|
148
|
+
# Replaces the original x axis to 'x_vals' and locates the 'x_ticks' on the new axis
|
|
149
|
+
ax = _set_x_vals(ax, x_vals)
|
|
150
|
+
ax = _set_x_ticks(ax, x_ticks)
|
|
151
|
+
|
|
152
|
+
return ax
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def set_y_ticks(ax, y_vals=None, y_ticks=None):
|
|
156
|
+
"""
|
|
157
|
+
Set custom tick labels on the y-axis based on specified values and desired ticks.
|
|
158
|
+
|
|
159
|
+
Parameters:
|
|
160
|
+
- ax: The axis object to modify.
|
|
161
|
+
- y_vals: Array of y-axis values where ticks should be placed.
|
|
162
|
+
- y_ticks: List of labels for ticks on the y-axis.
|
|
163
|
+
|
|
164
|
+
Example:
|
|
165
|
+
import matplotlib.pyplot as plt
|
|
166
|
+
import numpy as np
|
|
167
|
+
|
|
168
|
+
fig, ax = plt.subplots()
|
|
169
|
+
x = np.linspace(0, 10, 100)
|
|
170
|
+
y = np.sin(x)
|
|
171
|
+
ax.plot(x, y) # Plot a sine wave
|
|
172
|
+
|
|
173
|
+
set_y_ticks(ax, y_vals=y, y_ticks=['Low', 'High']) # Set custom y-axis ticks
|
|
174
|
+
plt.show()
|
|
175
|
+
"""
|
|
176
|
+
|
|
177
|
+
def _avoid_overlaps(values):
|
|
178
|
+
values = np.array(values)
|
|
179
|
+
if ("int" in str(values.dtype)) or ("float" in str(values.dtype)):
|
|
180
|
+
values = values.astype(float) + np.arange(len(values)) * 1e-5
|
|
181
|
+
return values
|
|
182
|
+
|
|
183
|
+
def _set_y_vals(ax, y_vals):
|
|
184
|
+
y_vals = _avoid_overlaps(y_vals)
|
|
185
|
+
new_y_axis = np.linspace(*ax.get_ylim(), len(y_vals))
|
|
186
|
+
ax.set_yticks(new_y_axis)
|
|
187
|
+
ax.set_yticklabels([f"{yv:.2f}" for yv in y_vals])
|
|
188
|
+
return ax
|
|
189
|
+
|
|
190
|
+
# def _set_y_ticks(ax, y_ticks):
|
|
191
|
+
# y_ticks = np.array(y_ticks)
|
|
192
|
+
# y_vals = np.array(
|
|
193
|
+
# [
|
|
194
|
+
# label.get_text().replace("−", "-")
|
|
195
|
+
# for label in ax.get_yticklabels()
|
|
196
|
+
# ]
|
|
197
|
+
# )
|
|
198
|
+
# y_vals = y_vals.astype(float)
|
|
199
|
+
# y_indi = np.argmin(
|
|
200
|
+
# np.array(np.abs(y_vals[:, np.newaxis] - y_ticks[np.newaxis, :])),
|
|
201
|
+
# axis=0,
|
|
202
|
+
# )
|
|
203
|
+
|
|
204
|
+
# # y_indi = [np.argmin(np.abs(y_vals - yt)) for yt in y_ticks]
|
|
205
|
+
# ax.set_yticks(ax.get_yticks()[y_indi])
|
|
206
|
+
# ax.set_yticklabels([f"{yt}" for yt in y_ticks])
|
|
207
|
+
# return ax
|
|
208
|
+
def _set_y_ticks(ax, y_ticks):
|
|
209
|
+
y_ticks = np.array(y_ticks)
|
|
210
|
+
if y_ticks.dtype.kind in ["U", "S", "O"]: # If y_ticks are strings
|
|
211
|
+
ax.set_yticks(range(len(y_ticks)))
|
|
212
|
+
ax.set_yticklabels(y_ticks)
|
|
213
|
+
else:
|
|
214
|
+
y_vals = np.array(
|
|
215
|
+
[label.get_text().replace("−", "-") for label in ax.get_yticklabels()]
|
|
216
|
+
)
|
|
217
|
+
y_vals = y_vals.astype(float)
|
|
218
|
+
y_indi = np.argmin(
|
|
219
|
+
np.array(np.abs(y_vals[:, np.newaxis] - y_ticks[np.newaxis, :])),
|
|
220
|
+
axis=0,
|
|
221
|
+
)
|
|
222
|
+
ax.set_yticks(ax.get_yticks()[y_indi])
|
|
223
|
+
ax.set_yticklabels([f"{yt}" for yt in y_ticks])
|
|
224
|
+
return ax
|
|
225
|
+
|
|
226
|
+
y_vals_passed = y_vals is not None
|
|
227
|
+
y_ticks_passed = y_ticks is not None
|
|
228
|
+
|
|
229
|
+
if is_listed_X(y_ticks, dict):
|
|
230
|
+
y_ticks = [to_str(yt, delimiter="\n") for yt in y_ticks]
|
|
231
|
+
|
|
232
|
+
if (not y_vals_passed) and (not y_ticks_passed):
|
|
233
|
+
# Do nothing
|
|
234
|
+
pass
|
|
235
|
+
|
|
236
|
+
elif y_vals_passed and (not y_ticks_passed):
|
|
237
|
+
# Replaces the y axis to y_vals
|
|
238
|
+
ax = _set_y_vals(ax, y_vals)
|
|
239
|
+
|
|
240
|
+
elif (not y_vals_passed) and y_ticks_passed:
|
|
241
|
+
# Locates 'y_ticks' on the original y axis
|
|
242
|
+
ax.set_yticks(y_ticks)
|
|
243
|
+
|
|
244
|
+
elif y_vals_passed and y_ticks_passed:
|
|
245
|
+
# Replaces the original y axis to 'y_vals' and locates the 'y_ticks' on the new axis
|
|
246
|
+
if y_vals == "auto":
|
|
247
|
+
y_vals = np.arange(len(y_ticks))
|
|
248
|
+
|
|
249
|
+
ax = _set_y_vals(ax, y_vals)
|
|
250
|
+
ax = _set_y_ticks(ax, y_ticks)
|
|
251
|
+
return ax
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
if __name__ == "__main__":
|
|
255
|
+
import scitex
|
|
256
|
+
|
|
257
|
+
xx, tt, fs = scitex.dsp.demo_sig()
|
|
258
|
+
pha, amp, freqs = scitex.dsp.wavelet(xx, fs)
|
|
259
|
+
|
|
260
|
+
i_batch, i_ch = 0, 0
|
|
261
|
+
ff = freqs[i_batch, i_ch]
|
|
262
|
+
fig, ax = scitex.plt.subplots()
|
|
263
|
+
|
|
264
|
+
ax.image2d(amp[i_batch, i_ch])
|
|
265
|
+
|
|
266
|
+
ax = set_ticks(
|
|
267
|
+
ax,
|
|
268
|
+
x_vals=tt,
|
|
269
|
+
x_ticks=[0, 1, 2, 3, 4],
|
|
270
|
+
y_vals=ff,
|
|
271
|
+
y_ticks=[0, 128, 256],
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
plt.show()
|
|
275
|
+
|
|
276
|
+
# EOF
|