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.
Files changed (572) hide show
  1. scitex/__init__.py +73 -0
  2. scitex/__main__.py +89 -0
  3. scitex/__version__.py +14 -0
  4. scitex/_sh.py +59 -0
  5. scitex/ai/_LearningCurveLogger.py +583 -0
  6. scitex/ai/__Classifiers.py +101 -0
  7. scitex/ai/__init__.py +55 -0
  8. scitex/ai/_gen_ai/_Anthropic.py +173 -0
  9. scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
  10. scitex/ai/_gen_ai/_DeepSeek.py +175 -0
  11. scitex/ai/_gen_ai/_Google.py +161 -0
  12. scitex/ai/_gen_ai/_Groq.py +97 -0
  13. scitex/ai/_gen_ai/_Llama.py +142 -0
  14. scitex/ai/_gen_ai/_OpenAI.py +230 -0
  15. scitex/ai/_gen_ai/_PARAMS.py +565 -0
  16. scitex/ai/_gen_ai/_Perplexity.py +191 -0
  17. scitex/ai/_gen_ai/__init__.py +32 -0
  18. scitex/ai/_gen_ai/_calc_cost.py +78 -0
  19. scitex/ai/_gen_ai/_format_output_func.py +183 -0
  20. scitex/ai/_gen_ai/_genai_factory.py +71 -0
  21. scitex/ai/act/__init__.py +8 -0
  22. scitex/ai/act/_define.py +11 -0
  23. scitex/ai/classification/__init__.py +7 -0
  24. scitex/ai/classification/classification_reporter.py +1137 -0
  25. scitex/ai/classification/classifier_server.py +131 -0
  26. scitex/ai/classification/classifiers.py +101 -0
  27. scitex/ai/classification_reporter.py +1161 -0
  28. scitex/ai/classifier_server.py +131 -0
  29. scitex/ai/clustering/__init__.py +11 -0
  30. scitex/ai/clustering/_pca.py +115 -0
  31. scitex/ai/clustering/_umap.py +376 -0
  32. scitex/ai/early_stopping.py +149 -0
  33. scitex/ai/feature_extraction/__init__.py +56 -0
  34. scitex/ai/feature_extraction/vit.py +148 -0
  35. scitex/ai/genai/__init__.py +277 -0
  36. scitex/ai/genai/anthropic.py +177 -0
  37. scitex/ai/genai/anthropic_provider.py +320 -0
  38. scitex/ai/genai/anthropic_refactored.py +109 -0
  39. scitex/ai/genai/auth_manager.py +200 -0
  40. scitex/ai/genai/base_genai.py +336 -0
  41. scitex/ai/genai/base_provider.py +291 -0
  42. scitex/ai/genai/calc_cost.py +78 -0
  43. scitex/ai/genai/chat_history.py +307 -0
  44. scitex/ai/genai/cost_tracker.py +276 -0
  45. scitex/ai/genai/deepseek.py +188 -0
  46. scitex/ai/genai/deepseek_provider.py +251 -0
  47. scitex/ai/genai/format_output_func.py +183 -0
  48. scitex/ai/genai/genai_factory.py +71 -0
  49. scitex/ai/genai/google.py +169 -0
  50. scitex/ai/genai/google_provider.py +228 -0
  51. scitex/ai/genai/groq.py +104 -0
  52. scitex/ai/genai/groq_provider.py +248 -0
  53. scitex/ai/genai/image_processor.py +250 -0
  54. scitex/ai/genai/llama.py +155 -0
  55. scitex/ai/genai/llama_provider.py +214 -0
  56. scitex/ai/genai/mock_provider.py +127 -0
  57. scitex/ai/genai/model_registry.py +304 -0
  58. scitex/ai/genai/openai.py +230 -0
  59. scitex/ai/genai/openai_provider.py +293 -0
  60. scitex/ai/genai/params.py +565 -0
  61. scitex/ai/genai/perplexity.py +202 -0
  62. scitex/ai/genai/perplexity_provider.py +205 -0
  63. scitex/ai/genai/provider_base.py +302 -0
  64. scitex/ai/genai/provider_factory.py +370 -0
  65. scitex/ai/genai/response_handler.py +235 -0
  66. scitex/ai/layer/_Pass.py +21 -0
  67. scitex/ai/layer/__init__.py +10 -0
  68. scitex/ai/layer/_switch.py +8 -0
  69. scitex/ai/loss/_L1L2Losses.py +34 -0
  70. scitex/ai/loss/__init__.py +12 -0
  71. scitex/ai/loss/multi_task_loss.py +47 -0
  72. scitex/ai/metrics/__init__.py +9 -0
  73. scitex/ai/metrics/_bACC.py +51 -0
  74. scitex/ai/metrics/silhoute_score_block.py +496 -0
  75. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
  76. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
  77. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
  78. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
  79. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
  80. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
  81. scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
  82. scitex/ai/optim/__init__.py +13 -0
  83. scitex/ai/optim/_get_set.py +31 -0
  84. scitex/ai/optim/_optimizers.py +71 -0
  85. scitex/ai/plt/__init__.py +21 -0
  86. scitex/ai/plt/_conf_mat.py +592 -0
  87. scitex/ai/plt/_learning_curve.py +194 -0
  88. scitex/ai/plt/_optuna_study.py +111 -0
  89. scitex/ai/plt/aucs/__init__.py +2 -0
  90. scitex/ai/plt/aucs/example.py +60 -0
  91. scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
  92. scitex/ai/plt/aucs/roc_auc.py +246 -0
  93. scitex/ai/sampling/undersample.py +29 -0
  94. scitex/ai/sk/__init__.py +11 -0
  95. scitex/ai/sk/_clf.py +58 -0
  96. scitex/ai/sk/_to_sktime.py +100 -0
  97. scitex/ai/sklearn/__init__.py +26 -0
  98. scitex/ai/sklearn/clf.py +58 -0
  99. scitex/ai/sklearn/to_sktime.py +100 -0
  100. scitex/ai/training/__init__.py +7 -0
  101. scitex/ai/training/early_stopping.py +150 -0
  102. scitex/ai/training/learning_curve_logger.py +555 -0
  103. scitex/ai/utils/__init__.py +22 -0
  104. scitex/ai/utils/_check_params.py +50 -0
  105. scitex/ai/utils/_default_dataset.py +46 -0
  106. scitex/ai/utils/_format_samples_for_sktime.py +26 -0
  107. scitex/ai/utils/_label_encoder.py +134 -0
  108. scitex/ai/utils/_merge_labels.py +22 -0
  109. scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
  110. scitex/ai/utils/_under_sample.py +51 -0
  111. scitex/ai/utils/_verify_n_gpus.py +16 -0
  112. scitex/ai/utils/grid_search.py +148 -0
  113. scitex/context/__init__.py +9 -0
  114. scitex/context/_suppress_output.py +38 -0
  115. scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
  116. scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
  117. scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
  118. scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
  119. scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
  120. scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
  121. scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
  122. scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
  123. scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
  124. scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
  125. scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
  126. scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
  127. scitex/db/_BaseMixins/__init__.py +30 -0
  128. scitex/db/_PostgreSQL.py +126 -0
  129. scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
  130. scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
  131. scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
  132. scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
  133. scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
  134. scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
  135. scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
  136. scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
  137. scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
  138. scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
  139. scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
  140. scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
  141. scitex/db/_PostgreSQLMixins/__init__.py +34 -0
  142. scitex/db/_SQLite3.py +2136 -0
  143. scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
  144. scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
  145. scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
  146. scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
  147. scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
  148. scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
  149. scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
  150. scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
  151. scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
  152. scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
  153. scitex/db/_SQLite3Mixins/__init__.py +30 -0
  154. scitex/db/__init__.py +14 -0
  155. scitex/db/_delete_duplicates.py +397 -0
  156. scitex/db/_inspect.py +163 -0
  157. scitex/decorators/__init__.py +54 -0
  158. scitex/decorators/_auto_order.py +172 -0
  159. scitex/decorators/_batch_fn.py +127 -0
  160. scitex/decorators/_cache_disk.py +32 -0
  161. scitex/decorators/_cache_mem.py +12 -0
  162. scitex/decorators/_combined.py +98 -0
  163. scitex/decorators/_converters.py +282 -0
  164. scitex/decorators/_deprecated.py +26 -0
  165. scitex/decorators/_not_implemented.py +30 -0
  166. scitex/decorators/_numpy_fn.py +86 -0
  167. scitex/decorators/_pandas_fn.py +121 -0
  168. scitex/decorators/_preserve_doc.py +19 -0
  169. scitex/decorators/_signal_fn.py +95 -0
  170. scitex/decorators/_timeout.py +55 -0
  171. scitex/decorators/_torch_fn.py +136 -0
  172. scitex/decorators/_wrap.py +39 -0
  173. scitex/decorators/_xarray_fn.py +88 -0
  174. scitex/dev/__init__.py +15 -0
  175. scitex/dev/_analyze_code_flow.py +284 -0
  176. scitex/dev/_reload.py +59 -0
  177. scitex/dict/_DotDict.py +442 -0
  178. scitex/dict/__init__.py +18 -0
  179. scitex/dict/_listed_dict.py +42 -0
  180. scitex/dict/_pop_keys.py +36 -0
  181. scitex/dict/_replace.py +13 -0
  182. scitex/dict/_safe_merge.py +62 -0
  183. scitex/dict/_to_str.py +32 -0
  184. scitex/dsp/__init__.py +72 -0
  185. scitex/dsp/_crop.py +122 -0
  186. scitex/dsp/_demo_sig.py +331 -0
  187. scitex/dsp/_detect_ripples.py +212 -0
  188. scitex/dsp/_ensure_3d.py +18 -0
  189. scitex/dsp/_hilbert.py +78 -0
  190. scitex/dsp/_listen.py +702 -0
  191. scitex/dsp/_misc.py +30 -0
  192. scitex/dsp/_mne.py +32 -0
  193. scitex/dsp/_modulation_index.py +79 -0
  194. scitex/dsp/_pac.py +319 -0
  195. scitex/dsp/_psd.py +102 -0
  196. scitex/dsp/_resample.py +65 -0
  197. scitex/dsp/_time.py +36 -0
  198. scitex/dsp/_transform.py +68 -0
  199. scitex/dsp/_wavelet.py +212 -0
  200. scitex/dsp/add_noise.py +111 -0
  201. scitex/dsp/example.py +253 -0
  202. scitex/dsp/filt.py +155 -0
  203. scitex/dsp/norm.py +18 -0
  204. scitex/dsp/params.py +51 -0
  205. scitex/dsp/reference.py +43 -0
  206. scitex/dsp/template.py +25 -0
  207. scitex/dsp/utils/__init__.py +15 -0
  208. scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
  209. scitex/dsp/utils/_ensure_3d.py +18 -0
  210. scitex/dsp/utils/_ensure_even_len.py +10 -0
  211. scitex/dsp/utils/_zero_pad.py +48 -0
  212. scitex/dsp/utils/filter.py +408 -0
  213. scitex/dsp/utils/pac.py +177 -0
  214. scitex/dt/__init__.py +8 -0
  215. scitex/dt/_linspace.py +130 -0
  216. scitex/etc/__init__.py +15 -0
  217. scitex/etc/wait_key.py +34 -0
  218. scitex/gen/_DimHandler.py +196 -0
  219. scitex/gen/_TimeStamper.py +244 -0
  220. scitex/gen/__init__.py +95 -0
  221. scitex/gen/_alternate_kwarg.py +13 -0
  222. scitex/gen/_cache.py +11 -0
  223. scitex/gen/_check_host.py +34 -0
  224. scitex/gen/_ci.py +12 -0
  225. scitex/gen/_close.py +222 -0
  226. scitex/gen/_embed.py +78 -0
  227. scitex/gen/_inspect_module.py +257 -0
  228. scitex/gen/_is_ipython.py +12 -0
  229. scitex/gen/_less.py +48 -0
  230. scitex/gen/_list_packages.py +139 -0
  231. scitex/gen/_mat2py.py +88 -0
  232. scitex/gen/_norm.py +170 -0
  233. scitex/gen/_paste.py +18 -0
  234. scitex/gen/_print_config.py +84 -0
  235. scitex/gen/_shell.py +48 -0
  236. scitex/gen/_src.py +111 -0
  237. scitex/gen/_start.py +451 -0
  238. scitex/gen/_symlink.py +55 -0
  239. scitex/gen/_symlog.py +27 -0
  240. scitex/gen/_tee.py +238 -0
  241. scitex/gen/_title2path.py +60 -0
  242. scitex/gen/_title_case.py +88 -0
  243. scitex/gen/_to_even.py +84 -0
  244. scitex/gen/_to_odd.py +34 -0
  245. scitex/gen/_to_rank.py +39 -0
  246. scitex/gen/_transpose.py +37 -0
  247. scitex/gen/_type.py +78 -0
  248. scitex/gen/_var_info.py +73 -0
  249. scitex/gen/_wrap.py +17 -0
  250. scitex/gen/_xml2dict.py +76 -0
  251. scitex/gen/misc.py +730 -0
  252. scitex/gen/path.py +0 -0
  253. scitex/general/__init__.py +5 -0
  254. scitex/gists/_SigMacro_processFigure_S.py +128 -0
  255. scitex/gists/_SigMacro_toBlue.py +172 -0
  256. scitex/gists/__init__.py +12 -0
  257. scitex/io/_H5Explorer.py +292 -0
  258. scitex/io/__init__.py +82 -0
  259. scitex/io/_cache.py +101 -0
  260. scitex/io/_flush.py +24 -0
  261. scitex/io/_glob.py +103 -0
  262. scitex/io/_json2md.py +113 -0
  263. scitex/io/_load.py +168 -0
  264. scitex/io/_load_configs.py +146 -0
  265. scitex/io/_load_modules/__init__.py +38 -0
  266. scitex/io/_load_modules/_catboost.py +66 -0
  267. scitex/io/_load_modules/_con.py +20 -0
  268. scitex/io/_load_modules/_db.py +24 -0
  269. scitex/io/_load_modules/_docx.py +42 -0
  270. scitex/io/_load_modules/_eeg.py +110 -0
  271. scitex/io/_load_modules/_hdf5.py +196 -0
  272. scitex/io/_load_modules/_image.py +19 -0
  273. scitex/io/_load_modules/_joblib.py +19 -0
  274. scitex/io/_load_modules/_json.py +18 -0
  275. scitex/io/_load_modules/_markdown.py +103 -0
  276. scitex/io/_load_modules/_matlab.py +37 -0
  277. scitex/io/_load_modules/_numpy.py +39 -0
  278. scitex/io/_load_modules/_optuna.py +155 -0
  279. scitex/io/_load_modules/_pandas.py +69 -0
  280. scitex/io/_load_modules/_pdf.py +31 -0
  281. scitex/io/_load_modules/_pickle.py +24 -0
  282. scitex/io/_load_modules/_torch.py +16 -0
  283. scitex/io/_load_modules/_txt.py +126 -0
  284. scitex/io/_load_modules/_xml.py +49 -0
  285. scitex/io/_load_modules/_yaml.py +23 -0
  286. scitex/io/_mv_to_tmp.py +19 -0
  287. scitex/io/_path.py +286 -0
  288. scitex/io/_reload.py +78 -0
  289. scitex/io/_save.py +539 -0
  290. scitex/io/_save_modules/__init__.py +66 -0
  291. scitex/io/_save_modules/_catboost.py +22 -0
  292. scitex/io/_save_modules/_csv.py +89 -0
  293. scitex/io/_save_modules/_excel.py +49 -0
  294. scitex/io/_save_modules/_hdf5.py +249 -0
  295. scitex/io/_save_modules/_html.py +48 -0
  296. scitex/io/_save_modules/_image.py +140 -0
  297. scitex/io/_save_modules/_joblib.py +25 -0
  298. scitex/io/_save_modules/_json.py +25 -0
  299. scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
  300. scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
  301. scitex/io/_save_modules/_matlab.py +24 -0
  302. scitex/io/_save_modules/_mp4.py +29 -0
  303. scitex/io/_save_modules/_numpy.py +57 -0
  304. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
  305. scitex/io/_save_modules/_pickle.py +45 -0
  306. scitex/io/_save_modules/_plotly.py +27 -0
  307. scitex/io/_save_modules/_text.py +23 -0
  308. scitex/io/_save_modules/_torch.py +26 -0
  309. scitex/io/_save_modules/_yaml.py +29 -0
  310. scitex/life/__init__.py +10 -0
  311. scitex/life/_monitor_rain.py +49 -0
  312. scitex/linalg/__init__.py +17 -0
  313. scitex/linalg/_distance.py +63 -0
  314. scitex/linalg/_geometric_median.py +64 -0
  315. scitex/linalg/_misc.py +73 -0
  316. scitex/nn/_AxiswiseDropout.py +27 -0
  317. scitex/nn/_BNet.py +126 -0
  318. scitex/nn/_BNet_Res.py +164 -0
  319. scitex/nn/_ChannelGainChanger.py +44 -0
  320. scitex/nn/_DropoutChannels.py +50 -0
  321. scitex/nn/_Filters.py +489 -0
  322. scitex/nn/_FreqGainChanger.py +110 -0
  323. scitex/nn/_GaussianFilter.py +48 -0
  324. scitex/nn/_Hilbert.py +111 -0
  325. scitex/nn/_MNet_1000.py +157 -0
  326. scitex/nn/_ModulationIndex.py +221 -0
  327. scitex/nn/_PAC.py +414 -0
  328. scitex/nn/_PSD.py +40 -0
  329. scitex/nn/_ResNet1D.py +120 -0
  330. scitex/nn/_SpatialAttention.py +25 -0
  331. scitex/nn/_Spectrogram.py +161 -0
  332. scitex/nn/_SwapChannels.py +50 -0
  333. scitex/nn/_TransposeLayer.py +19 -0
  334. scitex/nn/_Wavelet.py +183 -0
  335. scitex/nn/__init__.py +63 -0
  336. scitex/os/__init__.py +8 -0
  337. scitex/os/_mv.py +50 -0
  338. scitex/parallel/__init__.py +8 -0
  339. scitex/parallel/_run.py +151 -0
  340. scitex/path/__init__.py +33 -0
  341. scitex/path/_clean.py +52 -0
  342. scitex/path/_find.py +108 -0
  343. scitex/path/_get_module_path.py +51 -0
  344. scitex/path/_get_spath.py +35 -0
  345. scitex/path/_getsize.py +18 -0
  346. scitex/path/_increment_version.py +87 -0
  347. scitex/path/_mk_spath.py +51 -0
  348. scitex/path/_path.py +19 -0
  349. scitex/path/_split.py +23 -0
  350. scitex/path/_this_path.py +19 -0
  351. scitex/path/_version.py +101 -0
  352. scitex/pd/__init__.py +41 -0
  353. scitex/pd/_find_indi.py +126 -0
  354. scitex/pd/_find_pval.py +113 -0
  355. scitex/pd/_force_df.py +154 -0
  356. scitex/pd/_from_xyz.py +71 -0
  357. scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
  358. scitex/pd/_melt_cols.py +81 -0
  359. scitex/pd/_merge_columns.py +221 -0
  360. scitex/pd/_mv.py +63 -0
  361. scitex/pd/_replace.py +62 -0
  362. scitex/pd/_round.py +93 -0
  363. scitex/pd/_slice.py +63 -0
  364. scitex/pd/_sort.py +91 -0
  365. scitex/pd/_to_numeric.py +53 -0
  366. scitex/pd/_to_xy.py +59 -0
  367. scitex/pd/_to_xyz.py +110 -0
  368. scitex/plt/__init__.py +36 -0
  369. scitex/plt/_subplots/_AxesWrapper.py +182 -0
  370. scitex/plt/_subplots/_AxisWrapper.py +249 -0
  371. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
  372. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
  373. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
  374. scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
  375. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
  376. scitex/plt/_subplots/_FigWrapper.py +226 -0
  377. scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
  378. scitex/plt/_subplots/__init__.py +111 -0
  379. scitex/plt/_subplots/_export_as_csv.py +232 -0
  380. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
  381. scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
  382. scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
  383. scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
  384. scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
  385. scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
  386. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
  387. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
  388. scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
  389. scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
  390. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
  391. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
  392. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
  393. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
  394. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
  395. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
  396. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
  397. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
  398. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
  399. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
  400. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
  401. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
  402. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
  403. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
  404. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
  405. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
  406. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
  407. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
  408. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
  409. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
  410. scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
  411. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
  412. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
  413. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
  414. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
  415. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
  416. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
  417. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
  418. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
  419. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
  420. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
  421. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
  422. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
  423. scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
  424. scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
  425. scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
  426. scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
  427. scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
  428. scitex/plt/_tpl.py +28 -0
  429. scitex/plt/ax/__init__.py +114 -0
  430. scitex/plt/ax/_plot/__init__.py +53 -0
  431. scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
  432. scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
  433. scitex/plt/ax/_plot/_plot_cube.py +57 -0
  434. scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
  435. scitex/plt/ax/_plot/_plot_fillv.py +55 -0
  436. scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
  437. scitex/plt/ax/_plot/_plot_image.py +94 -0
  438. scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
  439. scitex/plt/ax/_plot/_plot_raster.py +172 -0
  440. scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
  441. scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
  442. scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
  443. scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
  444. scitex/plt/ax/_plot/_plot_violin.py +343 -0
  445. scitex/plt/ax/_style/__init__.py +38 -0
  446. scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
  447. scitex/plt/ax/_style/_add_panel.py +92 -0
  448. scitex/plt/ax/_style/_extend.py +64 -0
  449. scitex/plt/ax/_style/_force_aspect.py +37 -0
  450. scitex/plt/ax/_style/_format_label.py +23 -0
  451. scitex/plt/ax/_style/_hide_spines.py +84 -0
  452. scitex/plt/ax/_style/_map_ticks.py +182 -0
  453. scitex/plt/ax/_style/_rotate_labels.py +215 -0
  454. scitex/plt/ax/_style/_sci_note.py +279 -0
  455. scitex/plt/ax/_style/_set_log_scale.py +299 -0
  456. scitex/plt/ax/_style/_set_meta.py +261 -0
  457. scitex/plt/ax/_style/_set_n_ticks.py +37 -0
  458. scitex/plt/ax/_style/_set_size.py +16 -0
  459. scitex/plt/ax/_style/_set_supxyt.py +116 -0
  460. scitex/plt/ax/_style/_set_ticks.py +276 -0
  461. scitex/plt/ax/_style/_set_xyt.py +121 -0
  462. scitex/plt/ax/_style/_share_axes.py +264 -0
  463. scitex/plt/ax/_style/_shift.py +139 -0
  464. scitex/plt/ax/_style/_show_spines.py +333 -0
  465. scitex/plt/color/_PARAMS.py +70 -0
  466. scitex/plt/color/__init__.py +52 -0
  467. scitex/plt/color/_add_hue_col.py +41 -0
  468. scitex/plt/color/_colors.py +205 -0
  469. scitex/plt/color/_get_colors_from_cmap.py +134 -0
  470. scitex/plt/color/_interpolate.py +29 -0
  471. scitex/plt/color/_vizualize_colors.py +54 -0
  472. scitex/plt/utils/__init__.py +44 -0
  473. scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
  474. scitex/plt/utils/_calc_nice_ticks.py +101 -0
  475. scitex/plt/utils/_close.py +68 -0
  476. scitex/plt/utils/_colorbar.py +96 -0
  477. scitex/plt/utils/_configure_mpl.py +295 -0
  478. scitex/plt/utils/_histogram_utils.py +132 -0
  479. scitex/plt/utils/_im2grid.py +70 -0
  480. scitex/plt/utils/_is_valid_axis.py +78 -0
  481. scitex/plt/utils/_mk_colorbar.py +65 -0
  482. scitex/plt/utils/_mk_patches.py +26 -0
  483. scitex/plt/utils/_scientific_captions.py +638 -0
  484. scitex/plt/utils/_scitex_config.py +223 -0
  485. scitex/reproduce/__init__.py +14 -0
  486. scitex/reproduce/_fix_seeds.py +45 -0
  487. scitex/reproduce/_gen_ID.py +55 -0
  488. scitex/reproduce/_gen_timestamp.py +35 -0
  489. scitex/res/__init__.py +5 -0
  490. scitex/resource/__init__.py +13 -0
  491. scitex/resource/_get_processor_usages.py +281 -0
  492. scitex/resource/_get_specs.py +280 -0
  493. scitex/resource/_log_processor_usages.py +190 -0
  494. scitex/resource/_utils/__init__.py +31 -0
  495. scitex/resource/_utils/_get_env_info.py +481 -0
  496. scitex/resource/limit_ram.py +33 -0
  497. scitex/scholar/__init__.py +24 -0
  498. scitex/scholar/_local_search.py +454 -0
  499. scitex/scholar/_paper.py +244 -0
  500. scitex/scholar/_pdf_downloader.py +325 -0
  501. scitex/scholar/_search.py +393 -0
  502. scitex/scholar/_vector_search.py +370 -0
  503. scitex/scholar/_web_sources.py +457 -0
  504. scitex/stats/__init__.py +31 -0
  505. scitex/stats/_calc_partial_corr.py +17 -0
  506. scitex/stats/_corr_test_multi.py +94 -0
  507. scitex/stats/_corr_test_wrapper.py +115 -0
  508. scitex/stats/_describe_wrapper.py +90 -0
  509. scitex/stats/_multiple_corrections.py +63 -0
  510. scitex/stats/_nan_stats.py +93 -0
  511. scitex/stats/_p2stars.py +116 -0
  512. scitex/stats/_p2stars_wrapper.py +56 -0
  513. scitex/stats/_statistical_tests.py +73 -0
  514. scitex/stats/desc/__init__.py +40 -0
  515. scitex/stats/desc/_describe.py +189 -0
  516. scitex/stats/desc/_nan.py +289 -0
  517. scitex/stats/desc/_real.py +94 -0
  518. scitex/stats/multiple/__init__.py +14 -0
  519. scitex/stats/multiple/_bonferroni_correction.py +72 -0
  520. scitex/stats/multiple/_fdr_correction.py +400 -0
  521. scitex/stats/multiple/_multicompair.py +28 -0
  522. scitex/stats/tests/__corr_test.py +277 -0
  523. scitex/stats/tests/__corr_test_multi.py +343 -0
  524. scitex/stats/tests/__corr_test_single.py +277 -0
  525. scitex/stats/tests/__init__.py +22 -0
  526. scitex/stats/tests/_brunner_munzel_test.py +192 -0
  527. scitex/stats/tests/_nocorrelation_test.py +28 -0
  528. scitex/stats/tests/_smirnov_grubbs.py +98 -0
  529. scitex/str/__init__.py +113 -0
  530. scitex/str/_clean_path.py +75 -0
  531. scitex/str/_color_text.py +52 -0
  532. scitex/str/_decapitalize.py +58 -0
  533. scitex/str/_factor_out_digits.py +281 -0
  534. scitex/str/_format_plot_text.py +498 -0
  535. scitex/str/_grep.py +48 -0
  536. scitex/str/_latex.py +155 -0
  537. scitex/str/_latex_fallback.py +471 -0
  538. scitex/str/_mask_api.py +39 -0
  539. scitex/str/_mask_api_key.py +8 -0
  540. scitex/str/_parse.py +158 -0
  541. scitex/str/_print_block.py +47 -0
  542. scitex/str/_print_debug.py +68 -0
  543. scitex/str/_printc.py +62 -0
  544. scitex/str/_readable_bytes.py +38 -0
  545. scitex/str/_remove_ansi.py +23 -0
  546. scitex/str/_replace.py +134 -0
  547. scitex/str/_search.py +125 -0
  548. scitex/str/_squeeze_space.py +36 -0
  549. scitex/tex/__init__.py +10 -0
  550. scitex/tex/_preview.py +103 -0
  551. scitex/tex/_to_vec.py +116 -0
  552. scitex/torch/__init__.py +18 -0
  553. scitex/torch/_apply_to.py +34 -0
  554. scitex/torch/_nan_funcs.py +77 -0
  555. scitex/types/_ArrayLike.py +44 -0
  556. scitex/types/_ColorLike.py +21 -0
  557. scitex/types/__init__.py +14 -0
  558. scitex/types/_is_listed_X.py +70 -0
  559. scitex/utils/__init__.py +22 -0
  560. scitex/utils/_compress_hdf5.py +116 -0
  561. scitex/utils/_email.py +120 -0
  562. scitex/utils/_grid.py +148 -0
  563. scitex/utils/_notify.py +247 -0
  564. scitex/utils/_search.py +121 -0
  565. scitex/web/__init__.py +38 -0
  566. scitex/web/_search_pubmed.py +438 -0
  567. scitex/web/_summarize_url.py +158 -0
  568. scitex-2.0.0.dist-info/METADATA +307 -0
  569. scitex-2.0.0.dist-info/RECORD +572 -0
  570. scitex-2.0.0.dist-info/WHEEL +6 -0
  571. scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
  572. scitex-2.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,279 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-03 11:58:58 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_style/_sci_note.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_style/_sci_note.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import matplotlib
13
+ import numpy as np
14
+
15
+
16
+ class OOMFormatter(matplotlib.ticker.ScalarFormatter):
17
+ """Custom formatter for scientific notation with fixed order of magnitude.
18
+
19
+ A matplotlib formatter that allows you to specify a fixed exponent for
20
+ scientific notation, rather than letting matplotlib choose it automatically.
21
+ Useful when you want consistent notation across multiple plots or specific
22
+ exponent values.
23
+
24
+ Parameters
25
+ ----------
26
+ order : int or None, optional
27
+ Fixed order of magnitude (exponent) to use. If None, calculated
28
+ automatically. Default is None.
29
+ fformat : str, optional
30
+ Format string for the mantissa. Default is "%1.1f".
31
+ offset : bool, optional
32
+ Whether to use offset notation. Default is True.
33
+ mathText : bool, optional
34
+ Whether to use mathtext rendering. Default is True.
35
+
36
+ Attributes
37
+ ----------
38
+ order : int or None
39
+ The fixed order of magnitude to use.
40
+ fformat : str
41
+ Format string for displaying numbers.
42
+
43
+ Examples
44
+ --------
45
+ >>> # Force all labels to use 10^3 notation
46
+ >>> formatter = OOMFormatter(order=3, fformat="%1.2f")
47
+ >>> ax.xaxis.set_major_formatter(formatter)
48
+
49
+ >>> # Use 10^-6 for microvolts
50
+ >>> formatter = OOMFormatter(order=-6, fformat="%1.1f")
51
+ >>> ax.yaxis.set_major_formatter(formatter)
52
+
53
+ See Also
54
+ --------
55
+ matplotlib.ticker.ScalarFormatter : Base formatter class
56
+ sci_note : Convenience function using this formatter
57
+ """
58
+
59
+ def __init__(self, order=None, fformat="%1.1f", offset=True, mathText=True):
60
+ self.order = order
61
+ self.fformat = fformat
62
+ matplotlib.ticker.ScalarFormatter.__init__(
63
+ self, useOffset=offset, useMathText=mathText
64
+ )
65
+
66
+ def _set_order_of_magnitude(self):
67
+ if self.order is not None:
68
+ self.orderOfMagnitude = self.order
69
+ else:
70
+ super()._set_order_of_magnitude()
71
+
72
+ def _set_format(self, vmin=None, vmax=None):
73
+ self.format = self.fformat
74
+ if self._useMathText:
75
+ self.format = r"$\mathdefault{%s}$" % self.format
76
+
77
+
78
+ def sci_note(
79
+ ax,
80
+ fformat="%1.1f",
81
+ x=False,
82
+ y=False,
83
+ scilimits=(-3, 3),
84
+ order_x=None,
85
+ order_y=None,
86
+ pad_x=-22,
87
+ pad_y=-20,
88
+ ):
89
+ """
90
+ Apply scientific notation to axis with optional manual order of magnitude.
91
+
92
+ Parameters:
93
+ -----------
94
+ ax : matplotlib Axes
95
+ The axes to apply scientific notation to
96
+ fformat : str
97
+ Format string for tick labels
98
+ x, y : bool
99
+ Whether to apply to x or y axis
100
+ scilimits : tuple
101
+ Scientific notation limits
102
+ order_x, order_y : int or None
103
+ Manual order of magnitude (exponent). If None, calculated automatically
104
+ pad_x, pad_y : int
105
+ Padding for the axis labels
106
+ """
107
+ if x:
108
+ # Calculate order if not specified
109
+ if order_x is None:
110
+ order_x = np.floor(np.log10(np.max(np.abs(ax.get_xlim())) + 1e-5))
111
+
112
+ ax.xaxis.set_major_formatter(OOMFormatter(order=int(order_x), fformat=fformat))
113
+ ax.ticklabel_format(axis="x", style="sci", scilimits=scilimits)
114
+ ax.xaxis.labelpad = pad_x
115
+ shift_x = (ax.get_xlim()[0] - ax.get_xlim()[1]) * 0.01
116
+ ax.xaxis.get_offset_text().set_position((shift_x, 0))
117
+
118
+ if y:
119
+ # Calculate order if not specified
120
+ if order_y is None:
121
+ order_y = np.floor(np.log10(np.max(np.abs(ax.get_ylim())) + 1e-5))
122
+
123
+ ax.yaxis.set_major_formatter(OOMFormatter(order=int(order_y), fformat=fformat))
124
+ ax.ticklabel_format(axis="y", style="sci", scilimits=scilimits)
125
+ ax.yaxis.labelpad = pad_y
126
+ shift_y = (ax.get_ylim()[0] - ax.get_ylim()[1]) * 0.01
127
+ ax.yaxis.get_offset_text().set_position((0, shift_y))
128
+
129
+ return ax
130
+
131
+
132
+ # import matplotlib
133
+ # import numpy as np
134
+
135
+
136
+ # class OOMFormatter(matplotlib.ticker.ScalarFormatter):
137
+ # def __init__(self, order=0, fformat="%1.1f", offset=True, mathText=True):
138
+ # self.order = order
139
+ # self.fformat = fformat
140
+ # matplotlib.ticker.ScalarFormatter.__init__(
141
+ # self, useOffset=offset, useMathText=mathText
142
+ # )
143
+
144
+ # def _set_order_of_magnitude(self):
145
+ # self.orderOfMagnitude = self.order
146
+
147
+ # def _set_format(self, vmin=None, vmax=None):
148
+ # self.format = self.fformat
149
+ # if self._useMathText:
150
+ # self.format = r"$\mathdefault{%s}$" % self.format
151
+
152
+
153
+ # def sci_note(ax, fformat="%1.1f", x=False, y=False, scilimits=(-3, 3)):
154
+ # order_x = 0
155
+ # order_y = 0
156
+
157
+ # if x:
158
+ # order_x = np.floor(np.log10(np.max(np.abs(ax.get_xlim())) + 1e-5))
159
+ # ax.xaxis.set_major_formatter(
160
+ # OOMFormatter(order=int(order_x), fformat=fformat)
161
+ # )
162
+ # ax.ticklabel_format(axis="x", style="sci", scilimits=scilimits)
163
+ # ax.xaxis.labelpad = -22
164
+ # shift_x = (ax.get_xlim()[0] - ax.get_xlim()[1]) * 0.01
165
+ # ax.xaxis.get_offset_text().set_position((shift_x, 0))
166
+
167
+ # if y:
168
+ # order_y = np.floor(np.log10(np.max(np.abs(ax.get_ylim())) + 1e-5))
169
+ # ax.yaxis.set_major_formatter(
170
+ # OOMFormatter(order=int(order_y), fformat=fformat)
171
+ # )
172
+ # ax.ticklabel_format(axis="y", style="sci", scilimits=scilimits)
173
+ # ax.yaxis.labelpad = -20
174
+ # shift_y = (ax.get_ylim()[0] - ax.get_ylim()[1]) * 0.01
175
+ # ax.yaxis.get_offset_text().set_position((0, shift_y))
176
+
177
+ # return ax
178
+
179
+
180
+ # # class OOMFormatter(matplotlib.ticker.ScalarFormatter):
181
+ # # def __init__(self, order=0, fformat="%1.1f", offset=True, mathText=True):
182
+ # # self.order = order
183
+ # # self.fformat = fformat
184
+ # # matplotlib.ticker.ScalarFormatter.__init__(
185
+ # # self, useOffset=offset, useMathText=mathText
186
+ # # )
187
+
188
+ # # def _set_order_of_magnitude(self):
189
+ # # self.orderOfMagnitude = self.order
190
+
191
+ # # def _set_format(self, vmin=None, vmax=None):
192
+ # # self.format = self.fformat
193
+ # # if self._useMathText:
194
+ # # self.format = r"$\mathdefault{%s}$" % self.format
195
+
196
+
197
+ # # def sci_note(ax, fformat="%1.1f", x=False, y=False, scilimits=(-3, 3)):
198
+ # # order_x = 0
199
+ # # order_y = 0
200
+
201
+ # # if x:
202
+ # # order_x = np.floor(np.log10(np.max(np.abs(ax.get_xlim())) + 1e-5))
203
+ # # ax.xaxis.set_major_formatter(
204
+ # # OOMFormatter(order=int(order_x), fformat=fformat)
205
+ # # )
206
+ # # ax.ticklabel_format(axis="x", style="sci", scilimits=scilimits)
207
+
208
+ # # if y:
209
+ # # order_y = np.floor(np.log10(np.max(np.abs(ax.get_ylim()) + 1e-5)))
210
+ # # ax.yaxis.set_major_formatter(
211
+ # # OOMFormatter(order=int(order_y), fformat=fformat)
212
+ # # )
213
+ # # ax.ticklabel_format(axis="y", style="sci", scilimits=scilimits)
214
+
215
+ # # return ax
216
+
217
+
218
+ # # #!/usr/bin/env python3
219
+
220
+
221
+ # # import matplotlib
222
+
223
+
224
+ # # class OOMFormatter(matplotlib.ticker.ScalarFormatter):
225
+ # # # https://stackoverflow.com/questions/42656139/set-scientific-notation-with-fixed-exponent-and-significant-digits-for-multiple
226
+ # # # def __init__(self, order=0, fformat="%1.1f", offset=True, mathText=True):
227
+ # # def __init__(self, order=0, fformat="%1.0d", offset=True, mathText=True):
228
+ # # self.oom = order
229
+ # # self.fformat = fformat
230
+ # # matplotlib.ticker.ScalarFormatter.__init__(
231
+ # # self, useOffset=offset, useMathText=mathText
232
+ # # )
233
+
234
+ # # def _set_order_of_magnitude(self):
235
+ # # self.orderOfMagnitude = self.oom
236
+
237
+ # # def _set_format(self, vmin=None, vmax=None):
238
+ # # self.format = self.fformat
239
+ # # if self._useMathText:
240
+ # # self.format = r"$\mathdefault{%s}$" % self.format
241
+
242
+
243
+ # # def sci_note(
244
+ # # ax,
245
+ # # order,
246
+ # # fformat="%1.0d",
247
+ # # x=False,
248
+ # # y=False,
249
+ # # scilimits=(-3, 3),
250
+ # # ):
251
+ # # """
252
+ # # Change the expression of the x- or y-axis to the scientific notation like *10^3
253
+ # # , where 3 is the first argument, order.
254
+
255
+ # # Example:
256
+ # # order = 4 # 10^4
257
+ # # ax = sci_note(
258
+ # # ax,
259
+ # # order,
260
+ # # fformat="%1.0d",
261
+ # # x=True,
262
+ # # y=False,
263
+ # # scilimits=(-3, 3),
264
+ # # """
265
+
266
+ # # if x == True:
267
+ # # ax.xaxis.set_major_formatter(
268
+ # # OOMFormatter(order=order, fformat=fformat)
269
+ # # )
270
+ # # ax.ticklabel_format(axis="x", style="sci", scilimits=scilimits)
271
+ # # if y == True:
272
+ # # ax.yaxis.set_major_formatter(
273
+ # # OOMFormatter(order=order, fformat=fformat)
274
+ # # )
275
+ # # ax.ticklabel_format(axis="y", style="sci", scilimits=scilimits)
276
+
277
+ # # return ax
278
+
279
+ # EOF
@@ -0,0 +1,299 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2025-06-04 11:10:00 (ywatanabe)"
4
+ # File: ./src/scitex/plt/ax/_style/_set_log_scale.py
5
+
6
+ """
7
+ Functionality:
8
+ Set logarithmic scale with proper minor ticks for scientific plots
9
+ Input:
10
+ Matplotlib axes object and scale parameters
11
+ Output:
12
+ Axes with properly configured logarithmic scale
13
+ Prerequisites:
14
+ matplotlib, numpy
15
+ """
16
+
17
+ import numpy as np
18
+ import matplotlib.pyplot as plt
19
+ from matplotlib.ticker import LogLocator, LogFormatter, NullFormatter
20
+ from typing import Union, Optional, List
21
+
22
+
23
+ def set_log_scale(
24
+ ax,
25
+ axis: str = 'both',
26
+ base: Union[int, float] = 10,
27
+ show_minor_ticks: bool = True,
28
+ minor_tick_length: float = 2.0,
29
+ major_tick_length: float = 4.0,
30
+ minor_tick_width: float = 0.5,
31
+ major_tick_width: float = 0.8,
32
+ grid: bool = False,
33
+ minor_grid: bool = False,
34
+ grid_alpha: float = 0.3,
35
+ minor_grid_alpha: float = 0.15,
36
+ format_minor_labels: bool = False,
37
+ scientific_notation: bool = True
38
+ ) -> object:
39
+ """
40
+ Set logarithmic scale with comprehensive minor tick support.
41
+
42
+ Parameters
43
+ ----------
44
+ ax : matplotlib.axes.Axes
45
+ The axes object to modify
46
+ axis : str, optional
47
+ Which axis to set: 'x', 'y', or 'both', by default 'both'
48
+ base : Union[int, float], optional
49
+ Logarithmic base, by default 10
50
+ show_minor_ticks : bool, optional
51
+ Whether to show minor ticks, by default True
52
+ minor_tick_length : float, optional
53
+ Length of minor ticks in points, by default 2.0
54
+ major_tick_length : float, optional
55
+ Length of major ticks in points, by default 4.0
56
+ minor_tick_width : float, optional
57
+ Width of minor ticks in points, by default 0.5
58
+ major_tick_width : float, optional
59
+ Width of major ticks in points, by default 0.8
60
+ grid : bool, optional
61
+ Whether to show major grid lines, by default False
62
+ minor_grid : bool, optional
63
+ Whether to show minor grid lines, by default False
64
+ grid_alpha : float, optional
65
+ Alpha for major grid lines, by default 0.3
66
+ minor_grid_alpha : float, optional
67
+ Alpha for minor grid lines, by default 0.15
68
+ format_minor_labels : bool, optional
69
+ Whether to show labels on minor ticks, by default False
70
+ scientific_notation : bool, optional
71
+ Whether to use scientific notation for labels, by default True
72
+
73
+ Returns
74
+ -------
75
+ matplotlib.axes.Axes
76
+ The modified axes object
77
+
78
+ Examples
79
+ --------
80
+ >>> fig, ax = plt.subplots()
81
+ >>> ax.semilogy([1, 10, 100, 1000], [1, 2, 3, 4])
82
+ >>> set_log_scale(ax, axis='y', show_minor_ticks=True, grid=True)
83
+ """
84
+
85
+ if axis in ['x', 'both']:
86
+ _configure_log_axis(ax, 'x', base, show_minor_ticks,
87
+ minor_tick_length, major_tick_length,
88
+ minor_tick_width, major_tick_width,
89
+ grid, minor_grid, grid_alpha, minor_grid_alpha,
90
+ format_minor_labels, scientific_notation)
91
+
92
+ if axis in ['y', 'both']:
93
+ _configure_log_axis(ax, 'y', base, show_minor_ticks,
94
+ minor_tick_length, major_tick_length,
95
+ minor_tick_width, major_tick_width,
96
+ grid, minor_grid, grid_alpha, minor_grid_alpha,
97
+ format_minor_labels, scientific_notation)
98
+
99
+ return ax
100
+
101
+
102
+ def _configure_log_axis(
103
+ ax, axis_name: str, base: Union[int, float], show_minor_ticks: bool,
104
+ minor_tick_length: float, major_tick_length: float,
105
+ minor_tick_width: float, major_tick_width: float,
106
+ grid: bool, minor_grid: bool, grid_alpha: float, minor_grid_alpha: float,
107
+ format_minor_labels: bool, scientific_notation: bool
108
+ ) -> None:
109
+ """Configure a single axis for logarithmic scale."""
110
+
111
+ # Set the logarithmic scale
112
+ if axis_name == 'x':
113
+ ax.set_xscale('log', base=base)
114
+ axis_obj = ax.xaxis
115
+ tick_params_kwargs = {'axis': 'x'}
116
+ else: # y-axis
117
+ ax.set_yscale('log', base=base)
118
+ axis_obj = ax.yaxis
119
+ tick_params_kwargs = {'axis': 'y'}
120
+
121
+ # Configure major ticks
122
+ major_locator = LogLocator(base=base, numticks=12)
123
+ axis_obj.set_major_locator(major_locator)
124
+
125
+ # Configure major tick formatting
126
+ if scientific_notation:
127
+ major_formatter = LogFormatter(base=base, labelOnlyBase=False)
128
+ else:
129
+ major_formatter = LogFormatter(base=base, labelOnlyBase=True)
130
+ axis_obj.set_major_formatter(major_formatter)
131
+
132
+ # Configure minor ticks
133
+ if show_minor_ticks:
134
+ # Create minor tick positions
135
+ minor_locator = LogLocator(base=base, subs='all', numticks=100)
136
+ axis_obj.set_minor_locator(minor_locator)
137
+
138
+ # Format minor tick labels
139
+ if format_minor_labels:
140
+ minor_formatter = LogFormatter(base=base, labelOnlyBase=False)
141
+ else:
142
+ minor_formatter = NullFormatter() # No labels on minor ticks
143
+ axis_obj.set_minor_formatter(minor_formatter)
144
+
145
+ # Set minor tick appearance
146
+ ax.tick_params(
147
+ which='minor',
148
+ length=minor_tick_length,
149
+ width=minor_tick_width,
150
+ **tick_params_kwargs
151
+ )
152
+
153
+ # Set major tick appearance
154
+ ax.tick_params(
155
+ which='major',
156
+ length=major_tick_length,
157
+ width=major_tick_width,
158
+ **tick_params_kwargs
159
+ )
160
+
161
+ # Configure grid
162
+ if grid or minor_grid:
163
+ ax.grid(True, which='major', alpha=grid_alpha if grid else 0)
164
+ if minor_grid and show_minor_ticks:
165
+ ax.grid(True, which='minor', alpha=minor_grid_alpha)
166
+
167
+
168
+ def smart_log_limits(
169
+ data: Union[List, np.ndarray],
170
+ axis: str = 'y',
171
+ base: Union[int, float] = 10,
172
+ padding_factor: float = 0.1,
173
+ min_decades: int = 1
174
+ ) -> tuple:
175
+ """
176
+ Calculate smart logarithmic axis limits based on data.
177
+
178
+ Parameters
179
+ ----------
180
+ data : Union[List, np.ndarray]
181
+ Data values to calculate limits from
182
+ axis : str, optional
183
+ Axis name for reference, by default 'y'
184
+ base : Union[int, float], optional
185
+ Logarithmic base, by default 10
186
+ padding_factor : float, optional
187
+ Padding as fraction of data range, by default 0.1
188
+ min_decades : int, optional
189
+ Minimum number of decades to show, by default 1
190
+
191
+ Returns
192
+ -------
193
+ tuple
194
+ (lower_limit, upper_limit)
195
+
196
+ Examples
197
+ --------
198
+ >>> smart_log_limits([1, 10, 100, 1000])
199
+ (0.1, 10000.0)
200
+ """
201
+ data_array = np.array(data)
202
+ positive_data = data_array[data_array > 0]
203
+
204
+ if len(positive_data) == 0:
205
+ return 1, base**min_decades
206
+
207
+ data_min = np.min(positive_data)
208
+ data_max = np.max(positive_data)
209
+
210
+ # Calculate log range
211
+ log_min = np.log(data_min) / np.log(base)
212
+ log_max = np.log(data_max) / np.log(base)
213
+ log_range = log_max - log_min
214
+
215
+ # Ensure minimum range
216
+ if log_range < min_decades:
217
+ log_center = (log_min + log_max) / 2
218
+ log_min = log_center - min_decades / 2
219
+ log_max = log_center + min_decades / 2
220
+ log_range = min_decades
221
+
222
+ # Add padding
223
+ padding = log_range * padding_factor
224
+ log_min_padded = log_min - padding
225
+ log_max_padded = log_max + padding
226
+
227
+ # Convert back to linear scale
228
+ lower_limit = base ** log_min_padded
229
+ upper_limit = base ** log_max_padded
230
+
231
+ return lower_limit, upper_limit
232
+
233
+
234
+ def add_log_scale_indicator(
235
+ ax,
236
+ axis: str = 'y',
237
+ base: Union[int, float] = 10,
238
+ position: str = 'auto',
239
+ fontsize: Union[str, int] = 'small',
240
+ color: str = 'gray',
241
+ alpha: float = 0.7
242
+ ) -> None:
243
+ """
244
+ Add a log scale indicator to the plot.
245
+
246
+ Parameters
247
+ ----------
248
+ ax : matplotlib.axes.Axes
249
+ The axes object
250
+ axis : str, optional
251
+ Which axis has log scale, by default 'y'
252
+ base : Union[int, float], optional
253
+ Logarithmic base, by default 10
254
+ position : str, optional
255
+ Position of indicator: 'auto', 'top-left', 'top-right', 'bottom-left', 'bottom-right', by default 'auto'
256
+ fontsize : Union[str, int], optional
257
+ Font size for indicator, by default 'small'
258
+ color : str, optional
259
+ Color of indicator text, by default 'gray'
260
+ alpha : float, optional
261
+ Alpha transparency, by default 0.7
262
+
263
+ Examples
264
+ --------
265
+ >>> add_log_scale_indicator(ax, axis='y', base=10)
266
+ """
267
+ # Determine position
268
+ if position == 'auto':
269
+ if axis == 'y':
270
+ position = 'top-left'
271
+ else:
272
+ position = 'bottom-right'
273
+
274
+ # Position mapping
275
+ positions = {
276
+ 'top-left': (0.05, 0.95),
277
+ 'top-right': (0.95, 0.95),
278
+ 'bottom-left': (0.05, 0.05),
279
+ 'bottom-right': (0.95, 0.05)
280
+ }
281
+
282
+ x_pos, y_pos = positions.get(position, (0.05, 0.95))
283
+
284
+ # Create indicator text
285
+ if base == 10:
286
+ indicator_text = f"Log₁₀ scale ({axis}-axis)"
287
+ else:
288
+ indicator_text = f"Log_{{{base}}} scale ({axis}-axis)"
289
+
290
+ # Add text
291
+ ax.text(x_pos, y_pos, indicator_text,
292
+ transform=ax.transAxes,
293
+ fontsize=fontsize,
294
+ color=color,
295
+ alpha=alpha,
296
+ bbox=dict(boxstyle="round,pad=0.3", facecolor='white', alpha=0.8))
297
+
298
+
299
+ # EOF