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,226 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-19 02:53:28 (ywatanabe)"
4
+ # File: /data/gpfs/projects/punim2354/ywatanabe/scitex_repo/src/scitex/plt/_subplots/_FigWrapper.py.new
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/_subplots/_FigWrapper.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ from functools import wraps
13
+ import warnings
14
+ import numpy as np
15
+ import pandas as pd
16
+
17
+
18
+ class FigWrapper:
19
+ def __init__(self, fig_mpl):
20
+ self._fig_mpl = fig_mpl
21
+ self._last_saved_info = None
22
+ self._not_saved_yet_flag = True
23
+ self._called_from_mng_io_save = False
24
+
25
+ @property
26
+ def figure(
27
+ self,
28
+ ):
29
+ return self._fig_mpl
30
+
31
+ def __getattr__(self, attr):
32
+ # print(f"Attribute of FigWrapper: {attr}")
33
+ attr_mpl = getattr(self._fig_mpl, attr)
34
+
35
+ if callable(attr_mpl):
36
+
37
+ @wraps(attr_mpl)
38
+ def wrapper(*args, track=None, id=None, **kwargs):
39
+ results = attr_mpl(*args, **kwargs)
40
+ # self._track(track, id, attr, args, kwargs)
41
+ return results
42
+
43
+ return wrapper
44
+
45
+ else:
46
+ return attr_mpl
47
+
48
+ def __dir__(self):
49
+ # Combine attributes from both self and the wrapped matplotlib figure
50
+ attrs = set(dir(self.__class__))
51
+ attrs.update(object.__dir__(self))
52
+ attrs.update(dir(self._fig_mpl))
53
+ return sorted(attrs)
54
+
55
+ # def savefig(self, fname, *args, **kwargs):
56
+ # if not self._called_from_mng_io_save:
57
+ # warnings.warn(
58
+ # f"Instead of `FigWrapper.savefig({fname})`, use `scitex.io.save(fig, {fname}, symlink_from_cwd=True)` to handle symlink and export as csv.",
59
+ # UserWarning,
60
+ # )
61
+ # self._called_from_mng_io_save = False
62
+ # self._fig_mpl.savefig(fname, *args, **kwargs)
63
+
64
+ def export_as_csv(self):
65
+ """Export plotted data from all axes.
66
+
67
+ This method collects data from all axes in the figure and combines
68
+ them into a single DataFrame with appropriate axis identifiers in
69
+ the column names.
70
+
71
+ Returns:
72
+ pd.DataFrame: Combined DataFrame with data from all axes,
73
+ with axis ID prefixes for each column.
74
+ """
75
+ dfs = []
76
+
77
+ # Use the _traverse_axes helper method to iterate through all axes
78
+ # regardless of their structure (single, array, list, etc.)
79
+ for ii, ax in enumerate(self._traverse_axes()):
80
+ # Try different ways to access the export_as_csv method
81
+ df = None
82
+ try:
83
+ if hasattr(ax, '_axis_mpl') and hasattr(ax._axis_mpl, 'export_as_csv'):
84
+ # If it's a nested structure with _axis_mpl having export_as_csv
85
+ df = ax._axis_mpl.export_as_csv()
86
+ elif hasattr(ax, 'export_as_csv'):
87
+ # Direct AxisWrapper object
88
+ df = ax.export_as_csv()
89
+ else:
90
+ # Skip if no export method available
91
+ continue
92
+ except Exception:
93
+ continue
94
+
95
+ # Process the DataFrame if it's not empty
96
+ if df is not None and not df.empty:
97
+ # Add axis ID prefix to column names if not already present
98
+ prefix = f"ax_{ii:02d}_"
99
+ df.columns = [
100
+ col if col.startswith(prefix) else f"{prefix}{col}"
101
+ for col in df.columns
102
+ ]
103
+ dfs.append(df)
104
+
105
+ # Return concatenated DataFrame or empty DataFrame if no data
106
+ return pd.concat(dfs, axis=1) if dfs else pd.DataFrame()
107
+
108
+ def _traverse_axes(self):
109
+ """Helper method to traverse all axis wrappers in the figure."""
110
+ if hasattr(self, 'axes'):
111
+ # Check if we're dealing with an AxesWrapper instance
112
+ if hasattr(self.axes, '_axes_scitex') and hasattr(self.axes._axes_scitex, 'flat'):
113
+ # This is an AxesWrapper, get the individual AxisWrapper objects
114
+ for ax in self.axes._axes_scitex.flat:
115
+ yield ax
116
+ elif not hasattr(self.axes, '__iter__'):
117
+ # Single axis case
118
+ yield self.axes
119
+ else:
120
+ # Multiple axes case
121
+ if hasattr(self.axes, 'flat'):
122
+ # 2D array of axes
123
+ for ax in self.axes.flat:
124
+ yield ax
125
+ elif hasattr(self.axes, 'ravel'):
126
+ # Numpy array
127
+ for ax in self.axes.ravel():
128
+ yield ax
129
+ elif isinstance(self.axes, (list, tuple)):
130
+ # List of axes
131
+ for ax in self.axes:
132
+ yield ax
133
+
134
+ def legend(self, *args, loc="upper left", **kwargs):
135
+ """Legend with upper left by default for all axes."""
136
+ for ax in self._traverse_axes():
137
+ try:
138
+ ax.legend(*args, loc=loc, **kwargs)
139
+ except Exception as e:
140
+ pass
141
+
142
+ def supxyt(self, x=False, y=False, t=False):
143
+ """Wrapper for supxlabel, supylabel, and suptitle"""
144
+ if x is not False:
145
+ self._fig_mpl.supxlabel(x)
146
+ if y is not False:
147
+ self._fig_mpl.supylabel(y)
148
+ if t is not False:
149
+ self._fig_mpl.suptitle(t)
150
+ return self._fig_mpl
151
+
152
+ def tight_layout(self, *, rect=[0, 0.03, 1, 0.95], **kwargs):
153
+ """Wrapper for tight_layout with rect=[0, 0.03, 1, 0.95] by default.
154
+
155
+ Handles cases where certain axes (like colorbars) are incompatible
156
+ with tight_layout. If the figure is using constrained_layout, this
157
+ method does nothing as constrained_layout handles spacing automatically.
158
+ """
159
+ import warnings
160
+
161
+ # Check if figure is already using constrained_layout
162
+ if hasattr(self._fig_mpl, 'get_constrained_layout') and self._fig_mpl.get_constrained_layout():
163
+ # Figure is using constrained_layout, which handles colorbars better
164
+ # No need to call tight_layout
165
+ return
166
+
167
+ try:
168
+ with warnings.catch_warnings():
169
+ # Suppress the specific warning about incompatible axes
170
+ warnings.filterwarnings("ignore",
171
+ message="This figure includes Axes that are not compatible with tight_layout")
172
+ self._fig_mpl.tight_layout(rect=rect, **kwargs)
173
+ except Exception:
174
+ # If tight_layout fails completely, try constrained_layout as fallback
175
+ try:
176
+ self._fig_mpl.set_constrained_layout(True)
177
+ self._fig_mpl.set_constrained_layout_pads(w_pad=0.04, h_pad=0.04)
178
+ except Exception:
179
+ # If both fail, do nothing - figure will use default layout
180
+ pass
181
+
182
+ def adjust_layout(self, **kwargs):
183
+ """Adjust the constrained layout parameters.
184
+
185
+ Parameters
186
+ ----------
187
+ w_pad : float, optional
188
+ Width padding around axes (default: 0.05)
189
+ h_pad : float, optional
190
+ Height padding around axes (default: 0.05)
191
+ wspace : float, optional
192
+ Width space between subplots (default: 0.02)
193
+ hspace : float, optional
194
+ Height space between subplots (default: 0.02)
195
+ rect : list of 4 floats, optional
196
+ Rectangle in normalized figure coordinates to fit the whole layout
197
+ [left, bottom, right, top] (default: [0, 0, 1, 1])
198
+ """
199
+ if hasattr(self._fig_mpl, 'get_constrained_layout') and self._fig_mpl.get_constrained_layout():
200
+ # Update constrained layout parameters
201
+ self._fig_mpl.set_constrained_layout_pads(**kwargs)
202
+ else:
203
+ # Fall back to tight_layout with rect parameter if provided
204
+ if 'rect' in kwargs:
205
+ self.tight_layout(rect=kwargs['rect'])
206
+
207
+ def close(self):
208
+ """Close the underlying matplotlib figure"""
209
+ import matplotlib.pyplot as plt
210
+ plt.close(self._fig_mpl)
211
+
212
+ @property
213
+ def number(self):
214
+ """Return the figure number for matplotlib.pyplot.close() compatibility"""
215
+ return self._fig_mpl.number
216
+
217
+ def __del__(self):
218
+ """Cleanup when FigWrapper is deleted"""
219
+ try:
220
+ import matplotlib.pyplot as plt
221
+ plt.close(self._fig_mpl)
222
+ except:
223
+ pass
224
+
225
+
226
+ # EOF
@@ -0,0 +1,171 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-29 03:46:53 (ywatanabe)"
4
+ # File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_SubplotsWrapper.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/_subplots/_SubplotsWrapper.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ from collections import OrderedDict
13
+
14
+ import matplotlib.pyplot as plt
15
+ import numpy as np
16
+
17
+ from ._AxesWrapper import AxesWrapper
18
+ from ._AxisWrapper import AxisWrapper
19
+ from ._FigWrapper import FigWrapper
20
+
21
+
22
+ class SubplotsWrapper:
23
+ """
24
+ A wrapper class monitors data plotted using the ax methods from matplotlib.pyplot.
25
+ This data can be converted into a CSV file formatted for SigmaPlot compatibility.
26
+ """
27
+
28
+ def __init__(self):
29
+ self._subplots_wrapper_history = OrderedDict()
30
+ self._fig_scitex = None
31
+ self._counter_part = plt.subplots
32
+
33
+ def __call__(self, *args, track=True, sharex=False, sharey=False, constrained_layout=None, **kwargs):
34
+
35
+ # If constrained_layout is not specified, use it by default for better colorbar handling
36
+ if constrained_layout is None and 'layout' not in kwargs:
37
+ # Use a dict to set padding parameters for better spacing
38
+ # Increased w_pad to prevent colorbar overlap
39
+ kwargs['constrained_layout'] = {'w_pad': 0.1, 'h_pad': 0.1, 'wspace': 0.05, 'hspace': 0.05}
40
+
41
+ # Start from the original matplotlib figure and axes
42
+ self._fig_mpl, self._axes_mpl = self._counter_part(
43
+ *args, sharex=sharex, sharey=sharey, **kwargs
44
+ )
45
+
46
+ # Wrap the figure
47
+ self._fig_scitex = FigWrapper(self._fig_mpl)
48
+
49
+ # Ensure axes_mpl is always an array
50
+ axes_array_mpl = np.atleast_1d(self._axes_mpl)
51
+ axes_shape_mpl = axes_array_mpl.shape
52
+
53
+ # Handle single axis case
54
+ if axes_array_mpl.size == 1:
55
+ # Use squeeze() to get the scalar Axes object if it's a 0-d array
56
+ ax_mpl_scalar = (
57
+ axes_array_mpl.item() if axes_array_mpl.ndim == 0 else axes_array_mpl[0]
58
+ )
59
+ self._axis_scitex = AxisWrapper(self._fig_scitex, ax_mpl_scalar, track)
60
+ self._fig_scitex.axes = np.atleast_1d([self._axis_scitex])
61
+ return self._fig_scitex, self._axis_scitex
62
+
63
+ # Handle multiple axes case
64
+ axes_flat_mpl = axes_array_mpl.ravel()
65
+ axes_flat_scitex_list = [
66
+ AxisWrapper(self._fig_scitex, ax_, track) for ax_ in axes_flat_mpl
67
+ ]
68
+
69
+ # Reshape the axes_flat_scitex_list axes to match the original layout
70
+ axes_array_scitex = np.array(axes_flat_scitex_list).reshape(axes_shape_mpl)
71
+
72
+ # Wrap the array of axes
73
+ self._axes_scitex = AxesWrapper(self._fig_scitex, axes_array_scitex)
74
+ self._fig_scitex.axes = self._axes_scitex
75
+ return self._fig_scitex, self._axes_scitex
76
+
77
+ # def __getattr__(self, name):
78
+ # """
79
+ # Fallback to fetch attributes from the original matplotlib.pyplot.subplots function
80
+ # if they are not defined directly in this wrapper instance.
81
+ # This allows accessing attributes like __name__, __doc__ etc. from the original function.
82
+ # """
83
+ # print(f"Attribute of SubplotsWrapper: {name}")
84
+ # # Check if the attribute exists in the counterpart function
85
+ # if hasattr(self._counter_part, name):
86
+ # return getattr(self._counter_part, name)
87
+ # # Raise the standard error if not found in the wrapper or the counterpart
88
+ # raise AttributeError(
89
+ # f"'{type(self).__name__}' object and its counterpart '{self._counter_part.__name__}' have no attribute '{name}'"
90
+ # )
91
+
92
+ def __dir__(
93
+ self,
94
+ ):
95
+ """
96
+ Provide combined directory for tab completion, including
97
+ attributes from this wrapper and the original matplotlib.pyplot.subplots function.
98
+ """
99
+ # Get attributes defined explicitly in this instance/class
100
+ local_attrs = set(super().__dir__())
101
+ # Get attributes from the counterpart function
102
+ try:
103
+ counterpart_attrs = set(dir(self._counter_part))
104
+ except Exception:
105
+ counterpart_attrs = set()
106
+ # Return the sorted union
107
+ return sorted(local_attrs.union(counterpart_attrs))
108
+
109
+
110
+ # Instantiate the wrapper. This instance will be imported and used.
111
+ subplots = SubplotsWrapper()
112
+
113
+ if __name__ == "__main__":
114
+ import matplotlib
115
+ import scitex
116
+
117
+ matplotlib.use("TkAgg") # "TkAgg"
118
+
119
+ fig, ax = subplots()
120
+ ax.plot([1, 2, 3], [4, 5, 6], id="plot1")
121
+ ax.plot([4, 5, 6], [1, 2, 3], id="plot2")
122
+ scitex.io.save(fig, "/tmp/subplots_demo/plots.png")
123
+
124
+ # Behaves like native matplotlib.pyplot.subplots without tracking
125
+ fig, ax = subplots(track=False)
126
+ ax.plot([1, 2, 3], [4, 5, 6], id="plot3")
127
+ ax.plot([4, 5, 6], [1, 2, 3], id="plot4")
128
+ scitex.io.save(fig, "/tmp/subplots_demo/plots.png")
129
+
130
+ fig, ax = subplots()
131
+ ax.scatter([1, 2, 3], [4, 5, 6], id="scatter1")
132
+ ax.scatter([4, 5, 6], [1, 2, 3], id="scatter2")
133
+ scitex.io.save(fig, "/tmp/subplots_demo/scatters.png")
134
+
135
+ fig, ax = subplots()
136
+ ax.boxplot([1, 2, 3], id="boxplot1")
137
+ scitex.io.save(fig, "/tmp/subplots_demo/boxplot1.png")
138
+
139
+ fig, ax = subplots()
140
+ ax.bar(["A", "B", "C"], [4, 5, 6], id="bar1")
141
+ scitex.io.save(fig, "/tmp/subplots_demo/bar1.png")
142
+
143
+ print(ax.export_as_csv())
144
+ # plot1_plot_x plot1_plot_y plot2_plot_x ... boxplot1_boxplot_x bar1_bar_x bar1_bar_y
145
+ # 0 1.0 4.0 4.0 ... 1.0 A 4.0
146
+ # 1 2.0 5.0 5.0 ... 2.0 B 5.0
147
+ # 2 3.0 6.0 6.0 ... 3.0 C 6.0
148
+
149
+ print(ax.export_as_csv().keys()) # plot3 and plot 4 are not tracked
150
+ # [3 rows x 11 columns]
151
+ # Index(['plot1_plot_x', 'plot1_plot_y', 'plot2_plot_x', 'plot2_plot_y',
152
+ # 'scatter1_scatter_x', 'scatter1_scatter_y', 'scatter2_scatter_x',
153
+ # 'scatter2_scatter_y', 'boxplot1_boxplot_x', 'bar1_bar_x', 'bar1_bar_y'],
154
+ # dtype='object')
155
+
156
+ # If a path is passed, the sigmaplot-friendly dataframe is saved as a csv file.
157
+ ax.export_as_csv("./tmp/subplots_demo/for_sigmaplot.csv")
158
+ # Saved to: ./tmp/subplots_demo/for_sigmaplot.csv
159
+
160
+ """
161
+ from matplotlib.pyplot import subplots as counter_part
162
+ from scitex.plt import subplots as msubplots
163
+ print(set(dir(msubplots)) - set(dir(counter_part)))
164
+ is_compatible = np.all([kk in set(dir(msubplots)) for kk in set(dir(counter_part))])
165
+ if is_compatible:
166
+ print(f"{msubplots.__name__} is compatible with {counter_part.__name__}")
167
+ else:
168
+ print(f"{msubplots.__name__} is incompatible with {counter_part.__name__}")
169
+ """
170
+
171
+ # EOF
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-18 05:22:40 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/_scitex_repo/src/scitex/plt/_subplots/__init__.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/_subplots/__init__.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ # Import export_as_csv module functions
13
+ from ._export_as_csv import export_as_csv, format_record
14
+
15
+ # Import formatters for backward compatibility
16
+ from ._export_as_csv_formatters import (
17
+ _format_plot_kde,
18
+ _format_plot_line,
19
+ _format_plot_conf_mat,
20
+ _format_plot_mean_std,
21
+ _format_plot_ecdf,
22
+ _format_plot_raster,
23
+ _format_plot_joyplot,
24
+ _format_plot,
25
+ _format_scatter,
26
+ _format_bar,
27
+ _format_hist,
28
+ _format_boxplot,
29
+ _format_errorbar,
30
+ _format_fill_between,
31
+ _format_imshow,
32
+ _format_violin,
33
+ _format_sns_boxplot,
34
+ )
35
+
36
+ # import importlib
37
+ # import inspect
38
+
39
+ # # Get the current directory
40
+ # current_dir = os.path.dirname(__file__)
41
+
42
+ # # Iterate through all Python files in the current directory
43
+ # for filename in os.listdir(current_dir):
44
+ # if filename.endswith(".py") and not filename.startswith("__"):
45
+ # module_name = filename[:-3] # Remove .py extension
46
+ # module = importlib.import_module(f".{module_name}", package=__name__)
47
+
48
+ # # Import only functions and classes from the module
49
+ # for name, obj in inspect.getmembers(module):
50
+ # if inspect.isfunction(obj) or inspect.isclass(obj):
51
+ # if not name.startswith("_"):
52
+ # globals()[name] = obj
53
+
54
+ # # Clean up temporary variables
55
+ # del (
56
+ # os,
57
+ # importlib,
58
+ # inspect,
59
+ # current_dir,
60
+ # filename,
61
+ # module_name,
62
+ # module,
63
+ # name,
64
+ # obj,
65
+ # )
66
+
67
+ # ################################################################################
68
+ # # For Matplotlib Compatibility
69
+ # ################################################################################
70
+ # import matplotlib.pyplot.subplots as counter_part
71
+
72
+ # _local_module_attributes = list(globals().keys())
73
+ # print(_local_module_attributes)
74
+
75
+
76
+ # def __getattr__(name):
77
+ # """
78
+ # Fallback to fetch attributes from matplotlib.pyplot
79
+ # if they are not defined directly in this module.
80
+ # """
81
+ # try:
82
+ # # Get the attribute from matplotlib.pyplot
83
+ # return getattr(counter_part, name)
84
+ # except AttributeError:
85
+ # # Raise the standard error if not found in pyplot either
86
+ # raise AttributeError(
87
+ # f"module '{__name__}' nor matplotlib.pyplot has attribute '{name}'"
88
+ # ) from None
89
+
90
+
91
+ # def __dir__():
92
+ # """
93
+ # Provide combined directory for tab completion, including
94
+ # attributes from this module and matplotlib.pyplot.
95
+ # """
96
+ # # Get attributes defined explicitly in this module
97
+ # local_attrs = set(_local_module_attributes)
98
+ # # Get attributes from matplotlib.pyplot
99
+ # pyplot_attrs = set(dir(counter_part))
100
+ # # Return the sorted union
101
+ # return sorted(local_attrs.union(pyplot_attrs))
102
+
103
+
104
+ """
105
+ import matplotlib.pyplot as plt
106
+ import scitex.plt as mplt
107
+
108
+ print(set(dir(mplt.subplots)) - set(dir(plt.subplots)))
109
+ """
110
+
111
+ # EOF