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,295 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-19 08:49:35 (ywatanabe)"
4
+ # File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/utils/_configure_mpl.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/utils/_configure_mpl.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ from typing import Any, Dict, Tuple, Union
13
+
14
+ import matplotlib.pyplot as plt
15
+ import scitex
16
+ import numpy as np
17
+
18
+
19
+ def configure_mpl(
20
+ plt,
21
+ fig_size_mm=(160, 100),
22
+ fig_scale=1.0,
23
+ dpi_display=100,
24
+ dpi_save=300,
25
+ fontsize="medium",
26
+ autolayout=True,
27
+ n_ticks=4,
28
+ hide_top_right_spines=True,
29
+ line_width=1.0, # Increased from 0.5 for better visibility
30
+ alpha=0.85, # Adjusted for better contrast
31
+ enable_latex=True, # Enable LaTeX rendering by default
32
+ latex_preamble=None, # Custom LaTeX preamble
33
+ verbose=False,
34
+ **kwargs,
35
+ ) -> Tuple[Any, Dict]:
36
+ """Configures Matplotlib settings for publication-quality plots.
37
+
38
+ Parameters
39
+ ----------
40
+ plt : matplotlib.pyplot
41
+ Matplotlib pyplot module
42
+ fig_size_mm : tuple of int, optional
43
+ Figure width and height in millimeters, by default (160, 100)
44
+ fig_scale : float, optional
45
+ Scaling factor for figure size, by default 1.0
46
+ dpi_display : int, optional
47
+ Display resolution in DPI, by default 100
48
+ dpi_save : int, optional
49
+ Saving resolution in DPI, by default 300
50
+ fontsize : Union[str, int, float], optional
51
+ Base font size ('xx-small' to 'xx-large' or points), by default 'medium'
52
+ Other sizes are derived from this:
53
+ - Title: 125% of base
54
+ - Labels: 100% of base
55
+ - Ticks/Legend: 85% of base
56
+ autolayout : bool, optional
57
+ Whether to enable automatic tight layout, by default True
58
+ hide_top_right_spines : bool, optional
59
+ Whether to hide top and right spines, by default True
60
+ line_width : float, optional
61
+ Default line width, by default 1.0
62
+ alpha : float, optional
63
+ Color transparency, by default 0.85
64
+ n_ticks : int, optional
65
+ Number of ticks on each axis, by default 4
66
+ verbose : bool, optional
67
+ Whether to print configuration details, by default False
68
+
69
+ Returns
70
+ -------
71
+ tuple
72
+ (plt, dict of RGBA colors)
73
+ """
74
+ # Convert base font size
75
+ base_size = _convert_font_size(fontsize)
76
+
77
+ # Ensure minimum sizes for different elements with better proportions
78
+ title_size = max(base_size * 1.25, 10.0) # Increased for better hierarchy
79
+ label_size = max(base_size * 1.0, 9.0) # Minimum 9pt for good readability
80
+ small_size = max(base_size * 0.85, 8.0) # Increased ratio for better legibility
81
+
82
+ # Colors
83
+ RGBA = {
84
+ k: scitex.plt.color.update_alpha(v, alpha)
85
+ for k, v in scitex.plt.color.PARAMS["RGBA"].items()
86
+ }
87
+
88
+ RGBA_NORM = {
89
+ k: tuple(scitex.plt.color.update_alpha(v, alpha))
90
+ for k, v in scitex.plt.color.PARAMS["RGBA_NORM"].items()
91
+ }
92
+
93
+ RGBA_NORM_FOR_CYCLE = {
94
+ k: tuple(scitex.plt.color.update_alpha(v, alpha))
95
+ for k, v in scitex.plt.color.PARAMS["RGBA_NORM_FOR_CYCLE"].items()
96
+ }
97
+
98
+ # Normalize figure size from mm to inches
99
+ figsize_inch = (
100
+ fig_size_mm[0] / 25.4 * fig_scale,
101
+ fig_size_mm[1] / 25.4 * fig_scale,
102
+ )
103
+
104
+ # Prepare matplotlib configuration
105
+ mpl_config = {
106
+ # Resolution
107
+ "figure.dpi": dpi_display,
108
+ "savefig.dpi": dpi_save,
109
+ # Figure Size
110
+ "figure.figsize": figsize_inch,
111
+ # Font Sizes
112
+ "font.size": base_size,
113
+ "axes.titlesize": title_size,
114
+ "axes.labelsize": label_size,
115
+ "xtick.labelsize": small_size,
116
+ "ytick.labelsize": small_size,
117
+ "legend.fontsize": small_size,
118
+ # Auto Layout
119
+ "figure.autolayout": autolayout,
120
+ # Top and Right Axes
121
+ "axes.spines.top": not hide_top_right_spines,
122
+ "axes.spines.right": not hide_top_right_spines,
123
+ # Spine width
124
+ "axes.linewidth": 0.8, # Slightly thicker axes lines
125
+ # Custom color cycle
126
+ "axes.prop_cycle": plt.cycler(color=list(RGBA_NORM_FOR_CYCLE.values())),
127
+ # Line
128
+ "lines.linewidth": line_width,
129
+ "lines.markersize": 6.0, # Better default marker size
130
+ # Grid (if used)
131
+ "grid.linewidth": 0.6,
132
+ "grid.alpha": 0.3,
133
+ }
134
+
135
+ # Configure LaTeX rendering if enabled with enhanced fallback
136
+ if enable_latex:
137
+ latex_success = False
138
+ try:
139
+ # Try to enable LaTeX rendering
140
+ test_config = {
141
+ "text.usetex": True,
142
+ "text.latex.preamble": latex_preamble or r"\usepackage{amsmath}\usepackage{amssymb}",
143
+ "font.family": "serif",
144
+ "font.serif": ["Computer Modern Roman"],
145
+ "mathtext.fontset": "cm",
146
+ }
147
+
148
+ # Test LaTeX capability before applying
149
+ with plt.rc_context(test_config):
150
+ try:
151
+ # Create a test figure to verify LaTeX works
152
+ fig, ax = plt.subplots(figsize=(1, 1))
153
+ ax.text(0.5, 0.5, r'$x^2 + y^2 = r^2$', usetex=True)
154
+ fig.canvas.draw() # Force rendering
155
+ plt.close(fig)
156
+ latex_success = True
157
+ except Exception as latex_error:
158
+ plt.close(fig)
159
+ if verbose:
160
+ print(f"⚠️ LaTeX test render failed: {latex_error}")
161
+ raise latex_error
162
+
163
+ if latex_success:
164
+ mpl_config.update(test_config)
165
+ if verbose:
166
+ print("✅ LaTeX rendering enabled and tested")
167
+
168
+ except Exception as e:
169
+ if verbose:
170
+ print(f"⚠️ LaTeX rendering failed, falling back to mathtext: {e}")
171
+ print(" This may be due to missing LaTeX fonts or Node.js conflicts")
172
+
173
+ # Enhanced fallback to mathtext with better configuration
174
+ mpl_config.update({
175
+ "text.usetex": False,
176
+ "mathtext.default": "regular",
177
+ "font.family": "serif",
178
+ "mathtext.fontset": "cm",
179
+ "mathtext.fallback": "cm", # Fallback font for missing symbols
180
+ })
181
+
182
+ # Enable LaTeX fallback mode in the str module
183
+ try:
184
+ from scitex.str._latex_fallback import set_fallback_mode
185
+ set_fallback_mode("force_mathtext")
186
+ if verbose:
187
+ print("📝 Enabled automatic LaTeX fallback mode")
188
+ except ImportError:
189
+ if verbose:
190
+ print("⚠️ LaTeX fallback module not available")
191
+
192
+ else:
193
+ # Use mathtext only with enhanced configuration
194
+ mpl_config.update({
195
+ "text.usetex": False,
196
+ "mathtext.default": "regular",
197
+ "mathtext.fontset": "cm",
198
+ "mathtext.fallback": "cm",
199
+ })
200
+
201
+ # Set fallback mode to mathtext
202
+ try:
203
+ from scitex.str._latex_fallback import set_fallback_mode
204
+ set_fallback_mode("force_mathtext")
205
+ except ImportError:
206
+ pass
207
+
208
+ # Update Matplotlib configuration
209
+ plt.rcParams.update(mpl_config)
210
+
211
+ if verbose:
212
+ print("\n" + "-" * 40)
213
+ print("Matplotlib has been configured as follows:\n")
214
+ print(f"Figure DPI (Display): {dpi_display} DPI")
215
+ print(f"Figure DPI (Save): {dpi_save} DPI")
216
+ print(
217
+ f"Figure Size (Not the Axis Size): "
218
+ f"{fig_size_mm[0] * fig_scale:.1f} x "
219
+ f"{fig_size_mm[1] * fig_scale:.1f} mm (width x height)"
220
+ )
221
+ print("\nFont Sizes:")
222
+ print(f" Base Size: {base_size:.1f}pt")
223
+ print(f" Title: {title_size:.1f}pt (125% of base, min 10pt)")
224
+ print(f" Axis Labels: {label_size:.1f}pt (100% of base, min 9pt)")
225
+ print(f" Tick Labels: {small_size:.1f}pt (85% of base, min 8pt)")
226
+ print(f" Legend: {small_size:.1f}pt (85% of base, min 8pt)")
227
+ print(f"\nHide Top and Right Axes: {hide_top_right_spines}")
228
+ print(f"Line Width: {line_width}")
229
+ # print(f"Number of Ticks: {n_ticks}")
230
+ print(f"\nCustom Colors (RGBA):")
231
+ for color_str, rgba in RGBA.items():
232
+ print(f" {color_str}: {rgba}")
233
+ print("-" * 40)
234
+
235
+ # Store n_ticks for later use
236
+ plt._n_ticks = n_ticks
237
+
238
+ # Add a utility function to plt
239
+ def set_n_ticks(ax, n=None):
240
+ if n is None:
241
+ n = plt._n_ticks
242
+ ax.xaxis.set_major_locator(plt.MaxNLocator(n))
243
+ ax.yaxis.set_major_locator(plt.MaxNLocator(n))
244
+
245
+ plt.set_n_ticks = set_n_ticks
246
+
247
+ return plt, RGBA_NORM
248
+
249
+
250
+ def _convert_font_size(size: Union[str, int, float]) -> float:
251
+ """Converts various font size specifications to numerical values.
252
+
253
+ Parameters
254
+ ----------
255
+ size : Union[str, int, float]
256
+ Font size specification. Can be:
257
+ - String: 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'
258
+ - Numeric: direct point size value
259
+
260
+ Returns
261
+ -------
262
+ float
263
+ Font size in points
264
+ """
265
+ if isinstance(size, str):
266
+ size_map = {
267
+ "xx-small": 9,
268
+ "x-small": 11,
269
+ "small": 13,
270
+ "medium": 15,
271
+ "large": 18,
272
+ "x-large": 22,
273
+ "xx-large": 26,
274
+ }
275
+ return size_map.get(size.lower(), 15)
276
+ elif isinstance(size, (int, float)):
277
+ return max(float(size), 9.0) # Ensure minimum size of 9
278
+ else:
279
+ raise ValueError(f"Unsupported font size type: {type(size)}")
280
+
281
+
282
+ if __name__ == "__main__":
283
+ plt, CC = configure_mpl(plt)
284
+ fig, axes = plt.subplots(nrows=2, sharex=True, sharey=True)
285
+ x = np.linspace(0, 10, 100)
286
+ for idx_cc, cc_str in enumerate(CC):
287
+ phase_shift = idx_cc * np.pi / len(CC)
288
+ y = np.sin(x + phase_shift)
289
+ axes[0].plot(x, y, label="Default color cycle")
290
+ axes[1].plot(x, y, color=CC[cc_str], label=f"{cc_str}")
291
+ axes[0].legend()
292
+ axes[1].legend()
293
+ plt.show()
294
+
295
+ # EOF
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-18 18:14:26 (ywatanabe)"
4
+ # File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/utils/_histogram_utils.py
5
+ # ----------------------------------------
6
+ import os
7
+ __FILE__ = (
8
+ "./src/scitex/plt/utils/_histogram_utils.py"
9
+ )
10
+ __DIR__ = os.path.dirname(__FILE__)
11
+ # ----------------------------------------
12
+
13
+ import numpy as np
14
+ from typing import List, Tuple, Union, Optional, Dict
15
+
16
+ class HistogramBinManager:
17
+ """
18
+ Utility class to manage histogram bin alignment across multiple histograms.
19
+
20
+ This class maintains a registry of histograms and their bin configurations
21
+ for each axis, allowing histograms on the same axis to use consistent binning.
22
+
23
+ Attributes:
24
+ _axis_registry (Dict): Registry of bin configurations by axis ID
25
+ """
26
+
27
+ def __init__(self):
28
+ self._axis_registry = {}
29
+
30
+ def register_histogram(self,
31
+ axis_id: str,
32
+ hist_id: str,
33
+ data: np.ndarray,
34
+ bins: Union[int, str, np.ndarray] = 10,
35
+ range: Optional[Tuple[float, float]] = None):
36
+ """
37
+ Register a histogram with the bin manager.
38
+
39
+ Args:
40
+ axis_id (str): Identifier for the axis
41
+ hist_id (str): Identifier for the histogram
42
+ data (np.ndarray): The data array for the histogram
43
+ bins (Union[int, str, np.ndarray]): Number of bins or bin edges
44
+ range (Optional[Tuple[float, float]]): Range of the histogram
45
+
46
+ Returns:
47
+ Tuple[int, Tuple[float, float]]: Consistent bins and range for the axis
48
+ """
49
+ # Initialize registry for this axis if needed
50
+ if axis_id not in self._axis_registry:
51
+ self._axis_registry[axis_id] = {
52
+ 'histograms': {},
53
+ 'common_config': None
54
+ }
55
+
56
+ # Calculate data range if not provided
57
+ if range is None:
58
+ range = (np.min(data), np.max(data))
59
+
60
+ # Store histogram info in registry
61
+ self._axis_registry[axis_id]['histograms'][hist_id] = {
62
+ 'data': data,
63
+ 'bins': bins,
64
+ 'range': range
65
+ }
66
+
67
+ # Calculate common configuration if needed
68
+ if self._axis_registry[axis_id]['common_config'] is None:
69
+ self._update_common_config(axis_id)
70
+
71
+ return self._axis_registry[axis_id]['common_config']
72
+
73
+ def _update_common_config(self, axis_id: str):
74
+ """
75
+ Update the common bin configuration for an axis.
76
+
77
+ Args:
78
+ axis_id (str): Identifier for the axis
79
+ """
80
+ histograms = self._axis_registry[axis_id]['histograms']
81
+
82
+ if not histograms:
83
+ return
84
+
85
+ # Find common range across all histograms on this axis
86
+ min_val = min(hist['range'][0] for hist in histograms.values())
87
+ max_val = max(hist['range'][1] for hist in histograms.values())
88
+
89
+ # Use maximum number of bins from all histograms
90
+ # (if any histogram uses a string or array for bins, this gets more complex)
91
+ bins_values = [hist['bins'] for hist in histograms.values()
92
+ if isinstance(hist['bins'], int)]
93
+
94
+ # Default to 10 bins if no integer bin counts
95
+ n_bins = max(bins_values) if bins_values else 10
96
+
97
+ # Set common configuration
98
+ self._axis_registry[axis_id]['common_config'] = (n_bins, (min_val, max_val))
99
+
100
+ def get_common_config(self, axis_id: str) -> Tuple[int, Tuple[float, float]]:
101
+ """
102
+ Get the common bin configuration for an axis.
103
+
104
+ Args:
105
+ axis_id (str): Identifier for the axis
106
+
107
+ Returns:
108
+ Tuple[int, Tuple[float, float]]: Common bins and range for the axis
109
+ """
110
+ if axis_id in self._axis_registry:
111
+ return self._axis_registry[axis_id]['common_config']
112
+
113
+ # Default if axis not registered
114
+ return (10, (0, 1))
115
+
116
+ def clear_axis(self, axis_id: str):
117
+ """
118
+ Clear registry for a specific axis.
119
+
120
+ Args:
121
+ axis_id (str): Identifier for the axis to clear
122
+ """
123
+ if axis_id in self._axis_registry:
124
+ del self._axis_registry[axis_id]
125
+
126
+ def clear_all(self):
127
+ """Clear the entire registry."""
128
+ self._axis_registry = {}
129
+
130
+
131
+ # Global instance
132
+ histogram_bin_manager = HistogramBinManager()
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-01 23:21:22 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_im2grid.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/_im2grid.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ from PIL import Image
13
+
14
+
15
+ def im2grid(image_paths, default_color=(255, 255, 255)):
16
+ """
17
+ Create a grid of images from a 2D NumPy array of image paths.
18
+ Skips positions where image_paths is None.
19
+
20
+ Args:
21
+ image_paths (2D numpy array of str or None): Array of image file paths or None for empty slots
22
+ default_color (tuple): RGB color tuple for empty spaces
23
+
24
+ Returns:
25
+ PIL.Image: A new image consisting of the grid of images
26
+ """
27
+ from scitex.io import load as scitex_io_load
28
+
29
+ nrows, ncols = image_paths.shape
30
+
31
+ # Load images, skip None paths
32
+ images = []
33
+ for row in image_paths:
34
+ row_images = []
35
+ for path in row:
36
+ if path is not None:
37
+ # img = Image.open(path)
38
+ img = scitex_io_load(path)
39
+ else:
40
+ img = None
41
+ row_images.append(img)
42
+ images.append(row_images)
43
+
44
+ # Assuming all images are the same size, use the first non-None image to determine size
45
+ for row in images:
46
+ for img in row:
47
+ if img is not None:
48
+ img_width, img_height = img.size
49
+ break
50
+ else:
51
+ continue
52
+ break
53
+ else:
54
+ raise ValueError("All image paths are None.")
55
+
56
+ # Create a new image with the total size
57
+ grid_width = img_width * ncols
58
+ grid_height = img_height * nrows
59
+ grid_image = Image.new("RGB", (grid_width, grid_height), default_color)
60
+
61
+ # Paste images into the grid
62
+ for y, row in enumerate(images):
63
+ for x, img in enumerate(row):
64
+ if img is not None:
65
+ grid_image.paste(img, (x * img_width, y * img_height))
66
+
67
+ return grid_image
68
+
69
+
70
+ # EOF
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-18 15:12:10 (ywatanabe)"
4
+ # File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/utils/_is_valid_axis.py
5
+ # ----------------------------------------
6
+ import os
7
+ __FILE__ = (
8
+ "./src/scitex/plt/utils/_is_valid_axis.py"
9
+ )
10
+ __DIR__ = os.path.dirname(__FILE__)
11
+ # ----------------------------------------
12
+
13
+ import inspect
14
+ import matplotlib
15
+
16
+ def is_valid_axis(axis):
17
+ """
18
+ Check if the provided object is a valid axis (matplotlib Axes or scitex AxisWrapper).
19
+
20
+ Parameters
21
+ ----------
22
+ axis : object
23
+ The object to check
24
+
25
+ Returns
26
+ -------
27
+ bool
28
+ True if the object is a valid axis, False otherwise
29
+
30
+ Examples
31
+ --------
32
+ >>> import matplotlib.pyplot as plt
33
+ >>> import scitex
34
+ >>> fig, ax = plt.subplots()
35
+ >>> is_valid_axis(ax)
36
+ True
37
+ >>> mfig, max = scitex.plt.subplots()
38
+ >>> is_valid_axis(max)
39
+ True
40
+ """
41
+ # Check if it's a matplotlib Axes directly
42
+ if isinstance(axis, matplotlib.axes._axes.Axes):
43
+ return True
44
+
45
+ # Check if it's an AxisWrapper from scitex
46
+ # This checks the class hierarchy to see if it has an AxisWrapper in its inheritance chain
47
+ for cls in inspect.getmro(type(axis)):
48
+ if cls.__name__ == 'AxisWrapper':
49
+ return True
50
+
51
+ # Check if it has common axis methods (fallback check)
52
+ axis_methods = ['plot', 'scatter', 'set_xlabel', 'set_ylabel', 'get_figure']
53
+ has_methods = all(hasattr(axis, method) for method in axis_methods)
54
+
55
+ return has_methods
56
+
57
+ def assert_valid_axis(axis, error_message=None):
58
+ """
59
+ Assert that the provided object is a valid axis (matplotlib Axes or scitex AxisWrapper).
60
+
61
+ Parameters
62
+ ----------
63
+ axis : object
64
+ The object to check
65
+ error_message : str, optional
66
+ Custom error message if assertion fails
67
+
68
+ Raises
69
+ ------
70
+ AssertionError
71
+ If the provided object is not a valid axis
72
+ """
73
+ if error_message is None:
74
+ error_message = "First argument must be a matplotlib axis or scitex axis wrapper"
75
+
76
+ assert is_valid_axis(axis), error_message
77
+
78
+ # EOF
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-03 01:09:23 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/utils/_mk_colorbar.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/utils/_mk_colorbar.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ # def mk_colorbar(start="white", end="blue"):
13
+ # xx = np.linspace(0, 1, 256)
14
+
15
+ # start = np.array(scitex.plt.colors.RGB[start])
16
+ # end = np.array(scitex.plt.colors.RGB[end])
17
+ # colors = (end - start)[:, np.newaxis] * xx
18
+
19
+ # colors -= colors.min()
20
+ # colors /= colors.max()
21
+
22
+ # fig, ax = plt.subplots()
23
+ # [ax.axvline(_xx, color=colors[:, i_xx]) for i_xx, _xx in enumerate(xx)]
24
+ # ax.xaxis.set_ticks_position("none")
25
+ # ax.yaxis.set_ticks_position("none")
26
+ # ax.set_aspect(0.2)
27
+ # return fig
28
+
29
+
30
+ def mk_colorbar(start="white", end="blue"):
31
+ """Create a colorbar gradient between two colors.
32
+
33
+ Args:
34
+ start (str): Starting color name
35
+ end (str): Ending color name
36
+
37
+ Returns:
38
+ matplotlib.figure.Figure: Figure with colorbar
39
+ """
40
+ import matplotlib.colors as mcolors
41
+ import matplotlib.pyplot as plt
42
+ import numpy as np
43
+
44
+ # import scitex
45
+ from scitex.plt.color._PARAMS import RGB
46
+
47
+ # Get RGB values for start and end colors
48
+ start_rgb = RGB[start]
49
+ end_rgb = RGB[end]
50
+
51
+ # Create a colormap
52
+ colors = [start_rgb, end_rgb]
53
+ cmap = mcolors.LinearSegmentedColormap.from_list("custom_cmap", colors, N=256)
54
+
55
+ # Create the figure and plot the colorbar
56
+ fig, ax = plt.subplots(figsize=(6, 1))
57
+ gradient = np.linspace(0, 1, 256).reshape(1, -1)
58
+ ax.imshow(gradient, aspect="auto", cmap=cmap)
59
+ ax.set_xticks([])
60
+ ax.set_yticks([])
61
+
62
+ return fig
63
+
64
+
65
+ # EOF
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-04-30 21:18:45 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/_mk_patches.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/_mk_patches.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import matplotlib.patches as mpatches
13
+
14
+
15
+ def mk_patches(colors, labels):
16
+ """
17
+ colors = ["red", "blue"]
18
+ labels = ["label_1", "label_2"]
19
+ ax.legend(handles=scitex.plt.mk_patches(colors, labels))
20
+ """
21
+
22
+ patches = [mpatches.Patch(color=c, label=l) for c, l in zip(colors, labels)]
23
+ return patches
24
+
25
+
26
+ # EOF