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