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,896 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-18 17:51:44 (ywatanabe)"
4
+ # File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ from functools import wraps
13
+ from typing import Any, Dict, List, Optional, Tuple, Union
14
+
15
+ import matplotlib
16
+ import numpy as np
17
+ import pandas as pd
18
+ from scipy.stats import gaussian_kde
19
+
20
+ from ....pd import to_xyz
21
+ from ....types import ArrayLike
22
+
23
+
24
+ class MatplotlibPlotMixin:
25
+ """Mixin class for basic plotting operations."""
26
+
27
+ def _get_ax_module(self):
28
+ """Lazy import ax module to avoid circular imports."""
29
+ from ....plt import ax as ax_module
30
+ return ax_module
31
+
32
+ def plot_image(
33
+ self,
34
+ arr_2d: ArrayLike,
35
+ track: bool = True,
36
+ id: Optional[str] = None,
37
+ **kwargs,
38
+ ) -> None:
39
+ # Method Name for downstream csv exporting
40
+ method_name = "plot_image"
41
+
42
+ # Plotting with pure matplotlib methods under non-tracking context
43
+ with self._no_tracking():
44
+ self._axis_mpl = self._get_ax_module().plot_image(self._axis_mpl, arr_2d, **kwargs)
45
+
46
+ # Tracking
47
+ tracked_dict = {"image_df": pd.DataFrame(arr_2d)}
48
+ if kwargs.get("xyz", False):
49
+ tracked_dict["image_df"] = to_xyz(tracked_dict["image_df"])
50
+ self._track(
51
+ track,
52
+ id,
53
+ method_name,
54
+ tracked_dict,
55
+ None,
56
+ )
57
+
58
+ return self._axis_mpl
59
+
60
+ def plot_kde(
61
+ self,
62
+ data: ArrayLike,
63
+ cumulative=False,
64
+ fill=False,
65
+ track: bool = True,
66
+ id: Optional[str] = None,
67
+ **kwargs,
68
+ ) -> None:
69
+ # Method Name for downstream csv exporting
70
+ method_name = "plot_kde"
71
+
72
+ # Sample count as label
73
+ n_samples = (~np.isnan(data)).sum()
74
+ if kwargs.get("label"):
75
+ kwargs["label"] = f"{kwargs['label']} (n={n_samples})"
76
+
77
+ # Xlim (kwargs["xlim"] is not accepted in downstream plotters)
78
+ xlim = kwargs.get("xlim")
79
+ if not xlim:
80
+ xlim = (np.nanmin(data), np.nanmax(data))
81
+
82
+ # X
83
+ xx = np.linspace(xlim[0], xlim[1], int(1e3))
84
+
85
+ # Y
86
+ density = gaussian_kde(data)(xx)
87
+ density /= density.sum()
88
+
89
+ # Cumulative
90
+ if cumulative:
91
+ density = np.cumsum(density)
92
+
93
+ # Plotting with pure matplotlib methods under non-tracking context
94
+ with self._no_tracking():
95
+ # Filled Line
96
+ if fill:
97
+ self._axis_mpl.fill_between(
98
+ xx,
99
+ density,
100
+ )
101
+ # Simple Line
102
+ else:
103
+ self._axis_mpl.plot(xx, density)
104
+
105
+ # Tracking
106
+ tracked_dict = {
107
+ "x": xx,
108
+ "kde": density,
109
+ "n": n_samples,
110
+ }
111
+ self._track(
112
+ track,
113
+ id,
114
+ method_name,
115
+ tracked_dict,
116
+ None,
117
+ )
118
+
119
+ return self._axis_mpl
120
+
121
+ def plot_conf_mat(
122
+ self,
123
+ data: ArrayLike,
124
+ x_labels: Optional[List[str]] = None,
125
+ y_labels: Optional[List[str]] = None,
126
+ title: str = "Confusion Matrix",
127
+ cmap: str = "Blues",
128
+ cbar: bool = True,
129
+ cbar_kw: Dict[str, Any] = {},
130
+ label_rotation_xy: Tuple[float, float] = (15, 15),
131
+ x_extend_ratio: float = 1.0,
132
+ y_extend_ratio: float = 1.0,
133
+ calc_bacc: bool = False,
134
+ track: bool = True,
135
+ id: Optional[str] = None,
136
+ **kwargs,
137
+ ) -> None:
138
+ # Method Name for downstream csv exporting
139
+ method_name = "plot_conf_mat"
140
+
141
+ # Plotting with pure matplotlib methods under non-tracking context
142
+ with self._no_tracking():
143
+ self._axis_mpl, bacc_val = self._get_ax_module().plot_conf_mat(
144
+ self._axis_mpl,
145
+ data,
146
+ x_labels=x_labels,
147
+ y_labels=y_labels,
148
+ title=title,
149
+ cmap=cmap,
150
+ cbar=cbar,
151
+ cbar_kw=cbar_kw,
152
+ label_rotation_xy=label_rotation_xy,
153
+ x_extend_ratio=x_extend_ratio,
154
+ y_extend_ratio=y_extend_ratio,
155
+ calc_bacc=calc_bacc,
156
+ **kwargs,
157
+ )
158
+
159
+ tracked_dict = {"balanced_accuracy": bacc_val}
160
+ # Tracking
161
+ self._track(track, id, method_name, tracked_dict, None)
162
+
163
+ return self._axis_mpl, bacc_val
164
+
165
+ # @wraps removed to avoid circular import
166
+ def plot_rectangle(
167
+ self,
168
+ xx: float,
169
+ yy: float,
170
+ width: float,
171
+ height: float,
172
+ track: bool = True,
173
+ id: Optional[str] = None,
174
+ **kwargs,
175
+ ) -> None:
176
+ # Method Name for downstream csv exporting
177
+ method_name = "plot_rectangle"
178
+
179
+ # Plotting with pure matplotlib methods under non-tracking context
180
+ with self._no_tracking():
181
+ self._axis_mpl = self._get_ax_module().plot_rectangle(
182
+ self._axis_mpl, xx, yy, width, height, **kwargs
183
+ )
184
+
185
+ # Tracking
186
+ tracked_dict = {"xx": xx, "yy": yy, "width": width, "height": height}
187
+ self._track(track, id, method_name, tracked_dict, None)
188
+
189
+ return self._axis_mpl
190
+
191
+ # @wraps removed to avoid circular import
192
+ def plot_fillv(
193
+ self,
194
+ starts: ArrayLike,
195
+ ends: ArrayLike,
196
+ color: str = "red",
197
+ alpha: float = 0.2,
198
+ track: bool = True,
199
+ id: Optional[str] = None,
200
+ **kwargs,
201
+ ) -> None:
202
+ # Method Name for downstream csv exporting
203
+ method_name = "plot_fillv"
204
+
205
+ # Plotting with pure matplotlib methods under non-tracking context
206
+ with self._no_tracking():
207
+ self._axis_mpl = self._get_ax_module().plot_fillv(
208
+ self._axis_mpl, starts, ends, color=color, alpha=alpha
209
+ )
210
+
211
+ # Tracking
212
+ tracked_dict = {"starts": starts, "ends": ends}
213
+ self._track(track, id, method_name, tracked_dict, None)
214
+
215
+ return self._axis_mpl
216
+
217
+ def plot_box(
218
+ self,
219
+ data: ArrayLike,
220
+ track: bool = True,
221
+ id: Optional[str] = None,
222
+ **kwargs,
223
+ ) -> None:
224
+ # Method Name for downstream csv exporting
225
+ method_name = "plot_box"
226
+
227
+ # Copy data
228
+ _data = data.copy()
229
+
230
+ # Sample count as label
231
+ n = len(data)
232
+ if kwargs.get("label"):
233
+ kwargs["label"] = kwargs["label"] + f" (n={n})"
234
+
235
+ # Plotting with pure matplotlib methods under non-tracking context
236
+ with self._no_tracking():
237
+ self._axis_mpl.boxplot(data, **kwargs)
238
+
239
+ # Tracking
240
+ tracked_dict = {
241
+ "data": _data,
242
+ "n": [n for ii in range(len(data))],
243
+ }
244
+ self._track(track, id, method_name, tracked_dict, None)
245
+
246
+ return self._axis_mpl
247
+
248
+ def hist(
249
+ self,
250
+ x: ArrayLike,
251
+ bins: Union[int, str, ArrayLike] = 10,
252
+ range: Optional[Tuple[float, float]] = None,
253
+ align_bins: bool = True,
254
+ track: bool = True,
255
+ id: Optional[str] = None,
256
+ **kwargs,
257
+ ) -> None:
258
+ """
259
+ Plot a histogram.
260
+
261
+ This is an override of the standard matplotlib hist function to ensure
262
+ that histogram bin data is properly tracked for CSV export and bins are
263
+ aligned for histograms on the same axis.
264
+
265
+ Args:
266
+ x: Input data
267
+ bins: Bin specification (count, edges, or algorithm)
268
+ range: Optional histogram range (min, max)
269
+ align_bins: Whether to align bins with other histograms on this axis
270
+ track: Whether to track this operation
271
+ id: Identifier for tracking
272
+ **kwargs: Additional keywords passed to matplotlib hist
273
+
274
+ Returns:
275
+ Histogram output
276
+ """
277
+ # Method Name for downstream csv exporting
278
+ method_name = "hist"
279
+
280
+ # Get the axis ID for bin alignment
281
+ axis_id = str(hash(self._axis_mpl))
282
+ hist_id = id if id is not None else str(self.id)
283
+
284
+ # Align bins if requested and not the first histogram on this axis
285
+ if align_bins:
286
+ from ....plt.utils import histogram_bin_manager
287
+ bins, range = histogram_bin_manager.register_histogram(
288
+ axis_id, hist_id, x, bins, range
289
+ )
290
+
291
+ # Plotting with pure matplotlib methods under non-tracking context
292
+ with self._no_tracking():
293
+ hist_data = self._axis_mpl.hist(x, bins=bins, range=range, **kwargs)
294
+
295
+ # Save histogram result for CSV export
296
+ # hist_data[0] = counts, hist_data[1] = bin_edges
297
+ tracked_dict = {
298
+ "args": (x,),
299
+ "hist_result": (hist_data[0], hist_data[1]),
300
+ "bins": bins,
301
+ "range": range,
302
+ }
303
+
304
+ self._track(track, id, method_name, tracked_dict, kwargs)
305
+
306
+ return hist_data
307
+
308
+ # @wraps removed to avoid circular import
309
+ def plot_raster(
310
+ self,
311
+ positions: List[ArrayLike],
312
+ time: Optional[ArrayLike] = None,
313
+ labels: Optional[List[str]] = None,
314
+ colors: Optional[List[str]] = None,
315
+ track: bool = True,
316
+ id: Optional[str] = None,
317
+ **kwargs,
318
+ ) -> None:
319
+ # Method Name for downstream csv exporting
320
+ method_name = "plot_raster"
321
+
322
+ # Plotting with pure matplotlib methods under non-tracking context
323
+ with self._no_tracking():
324
+ self._axis_mpl, raster_digit_df = self._get_ax_module().plot_raster(
325
+ self._axis_mpl, positions, time=time
326
+ )
327
+
328
+ # Tracking
329
+ tracked_dict = {"raster_digit_df": raster_digit_df}
330
+ self._track(track, id, method_name, tracked_dict, None)
331
+
332
+ return self._axis_mpl, raster_digit_df
333
+
334
+ # @wraps removed to avoid circular import
335
+ def plot_ecdf(
336
+ self,
337
+ data: ArrayLike,
338
+ track: bool = True,
339
+ id: Optional[str] = None,
340
+ **kwargs,
341
+ ) -> None:
342
+ # Method Name for downstream csv exporting
343
+ method_name = "plot_ecdf"
344
+
345
+ # Plotting with pure matplotlib methods under non-tracking context
346
+ with self._no_tracking():
347
+ self._axis_mpl, ecdf_df = self._get_ax_module().plot_ecdf(
348
+ self._axis_mpl, data, **kwargs
349
+ )
350
+
351
+ # Tracking
352
+ tracked_dict = {"ecdf_df": ecdf_df}
353
+ self._track(track, id, method_name, tracked_dict, None)
354
+
355
+ return self._axis_mpl, ecdf_df
356
+
357
+ # @wraps removed to avoid circular import
358
+ def plot_joyplot(
359
+ self,
360
+ data: ArrayLike,
361
+ orientation: str = "vertical",
362
+ track: bool = True,
363
+ id: Optional[str] = None,
364
+ **kwargs,
365
+ ) -> None:
366
+ # Method Name for downstream csv exporting
367
+ method_name = "plot_joyplot"
368
+
369
+ # Plotting with pure matplotlib methods under non-tracking context
370
+ with self._no_tracking():
371
+ self._axis_mpl = self._get_ax_module().plot_joyplot(
372
+ self._axis_mpl, data, orientation=orientation, **kwargs
373
+ )
374
+
375
+ # Tracking
376
+ tracked_dict = {"joyplot_data": data}
377
+ self._track(track, id, method_name, tracked_dict, None)
378
+
379
+ return self._axis_mpl
380
+
381
+ # @wraps removed to avoid circular import
382
+ def plot_joyplot(
383
+ self,
384
+ data: ArrayLike,
385
+ track: bool = True,
386
+ id: Optional[str] = None,
387
+ **kwargs,
388
+ ) -> None:
389
+ # Method Name for downstream csv exporting
390
+ method_name = "plot_joyplot"
391
+
392
+ # Plotting with pure matplotlib methods under non-tracking context
393
+ with self._no_tracking():
394
+ self._axis_mpl = self._get_ax_module().plot_joyplot(self._axis_mpl, data, **kwargs)
395
+
396
+ # Tracking
397
+ tracked_dict = {"joyplot_data": data}
398
+ self._track(track, id, method_name, tracked_dict, None)
399
+
400
+ return self._axis_mpl
401
+
402
+ # @wraps removed to avoid circular import
403
+ def plot_scatter_hist(
404
+ self,
405
+ x: ArrayLike,
406
+ y: ArrayLike,
407
+ hist_bins: int = 20,
408
+ scatter_alpha: float = 0.6,
409
+ scatter_size: float = 20,
410
+ scatter_color: str = "blue",
411
+ hist_color_x: str = "blue",
412
+ hist_color_y: str = "red",
413
+ hist_alpha: float = 0.5,
414
+ scatter_ratio: float = 0.8,
415
+ track: bool = True,
416
+ id: Optional[str] = None,
417
+ **kwargs,
418
+ ) -> None:
419
+ """Plot a scatter plot with marginal histograms."""
420
+ # Method Name for downstream csv exporting
421
+ method_name = "plot_scatter_hist"
422
+
423
+ # Plotting with pure matplotlib methods under non-tracking context
424
+ with self._no_tracking():
425
+ self._axis_mpl, ax_histx, ax_histy, hist_data = self._get_ax_module().plot_scatter_hist(
426
+ self._axis_mpl,
427
+ x,
428
+ y,
429
+ hist_bins=hist_bins,
430
+ scatter_alpha=scatter_alpha,
431
+ scatter_size=scatter_size,
432
+ scatter_color=scatter_color,
433
+ hist_color_x=hist_color_x,
434
+ hist_color_y=hist_color_y,
435
+ hist_alpha=hist_alpha,
436
+ scatter_ratio=scatter_ratio,
437
+ **kwargs,
438
+ )
439
+
440
+ # Tracking
441
+ tracked_dict = {
442
+ "x": x,
443
+ "y": y,
444
+ "hist_x": hist_data["hist_x"],
445
+ "hist_y": hist_data["hist_y"],
446
+ "bin_edges_x": hist_data["bin_edges_x"],
447
+ "bin_edges_y": hist_data["bin_edges_y"],
448
+ }
449
+ self._track(track, id, method_name, tracked_dict, None)
450
+
451
+ return self._axis_mpl, ax_histx, ax_histy, hist_data
452
+
453
+ # @wraps removed to avoid circular import
454
+ def plot_heatmap(
455
+ self,
456
+ data: ArrayLike,
457
+ x_labels: Optional[List[str]] = None,
458
+ y_labels: Optional[List[str]] = None,
459
+ cmap: str = "viridis",
460
+ cbar_label: str = "ColorBar Label",
461
+ value_format: str = "{x:.1f}",
462
+ show_annot: bool = True,
463
+ annot_color_lighter: str = "white",
464
+ annot_color_darker: str = "black",
465
+ track: bool = True,
466
+ id: Optional[str] = None,
467
+ **kwargs,
468
+ ) -> Tuple[matplotlib.image.AxesImage, matplotlib.colorbar.Colorbar]:
469
+ """Plot a heatmap on the axes."""
470
+ # Method Name for downstream csv exporting
471
+ method_name = "plot_heatmap"
472
+
473
+ # Plotting with pure matplotlib methods under non-tracking context
474
+ with self._no_tracking():
475
+ ax, im, cbar = self._get_ax_module().plot_heatmap(
476
+ self._axis_mpl,
477
+ data,
478
+ x_labels=x_labels,
479
+ y_labels=y_labels,
480
+ cmap=cmap,
481
+ cbar_label=cbar_label,
482
+ value_format=value_format,
483
+ show_annot=show_annot,
484
+ annot_color_lighter=annot_color_lighter,
485
+ annot_color_darker=annot_color_darker,
486
+ **kwargs,
487
+ )
488
+
489
+ # Tracking
490
+ tracked_dict = {
491
+ "data": data,
492
+ "x_labels": x_labels,
493
+ "y_labels": y_labels,
494
+ }
495
+ self._track(track, id, method_name, tracked_dict, None)
496
+
497
+ return ax, im, cbar
498
+
499
+ # @wraps removed to avoid circular import
500
+ def plot_violin(
501
+ self,
502
+ data: Union[pd.DataFrame, List, ArrayLike],
503
+ x=None,
504
+ y=None,
505
+ hue=None,
506
+ labels=None,
507
+ colors=None,
508
+ half=False,
509
+ track: bool = True,
510
+ id: Optional[str] = None,
511
+ **kwargs,
512
+ ) -> None:
513
+ """Plot a violin plot."""
514
+ # Method Name for downstream csv exporting
515
+ method_name = "plot_violin"
516
+
517
+ # Plotting with pure matplotlib methods under non-tracking context
518
+ with self._no_tracking():
519
+ # Handle the list-style input case
520
+ if isinstance(data, list) and all(
521
+ isinstance(item, (list, np.ndarray)) for item in data
522
+ ):
523
+ self._axis_mpl = self._get_ax_module().plot_violin(
524
+ self._axis_mpl,
525
+ data_list=data,
526
+ labels=labels,
527
+ colors=colors,
528
+ half=half,
529
+ **kwargs,
530
+ )
531
+ # Handle DataFrame or other inputs
532
+ else:
533
+ self._axis_mpl = self._get_ax_module().plot_violin(
534
+ self._axis_mpl,
535
+ data=data,
536
+ x=x,
537
+ y=y,
538
+ hue=hue,
539
+ half=half,
540
+ **kwargs,
541
+ )
542
+
543
+ # Tracking
544
+ tracked_dict = {
545
+ "data": data,
546
+ "x": x,
547
+ "y": y,
548
+ "hue": hue,
549
+ "half": half,
550
+ "labels": labels,
551
+ "colors": colors,
552
+ }
553
+ self._track(track, id, method_name, tracked_dict, None)
554
+ return self._axis_mpl
555
+
556
+ # def plot_area(
557
+ # self,
558
+ # x: ArrayLike,
559
+ # y: ArrayLike,
560
+ # stacked: bool = False,
561
+ # fill: bool = True,
562
+ # alpha: float = 0.5,
563
+ # track: bool = True,
564
+ # id: Optional[str] = None,
565
+ # **kwargs,
566
+ # ) -> None:
567
+ # """Plot an area plot."""
568
+ # # Method Name for downstream csv exporting
569
+ # method_name = "plot_area"
570
+
571
+ # # Plotting with pure matplotlib methods under non-tracking context
572
+ # with self._no_tracking():
573
+ # self._axis_mpl = self._get_ax_module().plot_area(
574
+ # self._axis_mpl,
575
+ # x,
576
+ # y,
577
+ # stacked=stacked,
578
+ # fill=fill,
579
+ # alpha=alpha,
580
+ # **kwargs,
581
+ # )
582
+
583
+ # # Tracking
584
+ # tracked_dict = {"x": x, "y": y}
585
+ # self._track(track, id, method_name, tracked_dict, None)
586
+
587
+ # return self._axis_mpl
588
+
589
+ # def plot_radar(
590
+ # self,
591
+ # data: ArrayLike,
592
+ # categories: List[str],
593
+ # groups: Optional[List[str]] = None,
594
+ # fill: bool = True,
595
+ # alpha: float = 0.2,
596
+ # grid_step: int = 5,
597
+ # track: bool = True,
598
+ # id: Optional[str] = None,
599
+ # **kwargs,
600
+ # ) -> None:
601
+ # """Plot a radar/spider chart."""
602
+ # # Method Name for downstream csv exporting
603
+ # method_name = "plot_radar"
604
+
605
+ # # Convert data to DataFrame if not already
606
+ # if not isinstance(data, pd.DataFrame):
607
+ # if groups is not None:
608
+ # data = pd.DataFrame(data, columns=categories, index=groups)
609
+ # else:
610
+ # data = pd.DataFrame(data, columns=categories)
611
+
612
+ # # Plotting with pure matplotlib methods under non-tracking context
613
+ # with self._no_tracking():
614
+ # self._axis_mpl = self._get_ax_module().plot_radar(
615
+ # self._axis_mpl,
616
+ # data,
617
+ # categories=categories,
618
+ # fill=fill,
619
+ # alpha=alpha,
620
+ # grid_step=grid_step,
621
+ # **kwargs,
622
+ # )
623
+
624
+ # # Tracking
625
+ # tracked_dict = {"radar_data": data}
626
+ # self._track(track, id, method_name, tracked_dict, None)
627
+
628
+ # return self._axis_mpl
629
+
630
+ # def plot_bubble(
631
+ # self,
632
+ # x: ArrayLike,
633
+ # y: ArrayLike,
634
+ # size: ArrayLike,
635
+ # color: Optional[ArrayLike] = None,
636
+ # size_scale: float = 1000.0,
637
+ # alpha: float = 0.6,
638
+ # colormap: str = "viridis",
639
+ # show_colorbar: bool = True,
640
+ # colorbar_label: str = "",
641
+ # track: bool = True,
642
+ # id: Optional[str] = None,
643
+ # **kwargs,
644
+ # ) -> None:
645
+ # """Plot a bubble chart."""
646
+ # # Method Name for downstream csv exporting
647
+ # method_name = "plot_bubble"
648
+
649
+ # # Plotting with pure matplotlib methods under non-tracking context
650
+ # with self._no_tracking():
651
+ # self._axis_mpl = self._get_ax_module().plot_bubble(
652
+ # self._axis_mpl,
653
+ # x,
654
+ # y,
655
+ # size,
656
+ # color=color,
657
+ # size_scale=size_scale,
658
+ # alpha=alpha,
659
+ # colormap=colormap,
660
+ # show_colorbar=show_colorbar,
661
+ # colorbar_label=colorbar_label,
662
+ # **kwargs,
663
+ # )
664
+
665
+ # # Tracking
666
+ # tracked_dict = {"x": x, "y": y, "size": size}
667
+ # if color is not None:
668
+ # tracked_dict["color"] = color
669
+
670
+ # self._track(track, id, method_name, tracked_dict, None)
671
+
672
+ # return self._axis_mpl
673
+
674
+ # def plot_ridgeline(
675
+ # self,
676
+ # data: ArrayLike,
677
+ # labels: Optional[List[str]] = None,
678
+ # overlap: float = 0.8,
679
+ # fill: bool = True,
680
+ # alpha: float = 0.6,
681
+ # colormap: str = "viridis",
682
+ # bandwidth: Optional[float] = None,
683
+ # track: bool = True,
684
+ # id: Optional[str] = None,
685
+ # **kwargs,
686
+ # ) -> None:
687
+ # """Plot a ridgeline plot (similar to joyplot but with KDE)."""
688
+ # # Method Name for downstream csv exporting
689
+ # method_name = "plot_ridgeline"
690
+
691
+ # # Ensure data is in correct format
692
+ # if isinstance(data, pd.DataFrame):
693
+ # _data = [data[col].dropna().values for col in data.columns]
694
+ # if labels is None:
695
+ # labels = list(data.columns)
696
+ # elif isinstance(data, list):
697
+ # _data = data
698
+ # else:
699
+ # _data = [data]
700
+
701
+ # # Plotting with pure matplotlib methods under non-tracking context
702
+ # with self._no_tracking():
703
+ # self._axis_mpl, ridge_data = self._get_ax_module().plot_ridgeline(
704
+ # self._axis_mpl,
705
+ # _data,
706
+ # labels=labels,
707
+ # overlap=overlap,
708
+ # fill=fill,
709
+ # alpha=alpha,
710
+ # colormap=colormap,
711
+ # bandwidth=bandwidth,
712
+ # **kwargs,
713
+ # )
714
+
715
+ # # Tracking
716
+ # tracked_dict = {
717
+ # "ridgeline_data": _data,
718
+ # "kde_x": ridge_data["kde_x"],
719
+ # "kde_y": ridge_data["kde_y"],
720
+ # }
721
+ # if labels is not None:
722
+ # tracked_dict["labels"] = labels
723
+ # self._track(track, id, method_name, tracked_dict, None)
724
+
725
+ # return self._axis_mpl, ridge_data
726
+
727
+ # def plot_parallel_coordinates(
728
+ # self,
729
+ # data: pd.DataFrame,
730
+ # class_column: Optional[str] = None,
731
+ # colormap: str = "viridis",
732
+ # alpha: float = 0.5,
733
+ # track: bool = True,
734
+ # id: Optional[str] = None,
735
+ # **kwargs,
736
+ # ) -> None:
737
+ # """Plot parallel coordinates."""
738
+ # # Method Name for downstream csv exporting
739
+ # method_name = "plot_parallel_coordinates"
740
+
741
+ # # Plotting with pure matplotlib methods under non-tracking context
742
+ # with self._no_tracking():
743
+ # self._axis_mpl = self._get_ax_module().plot_parallel_coordinates(
744
+ # self._axis_mpl,
745
+ # data,
746
+ # class_column=class_column,
747
+ # colormap=colormap,
748
+ # alpha=alpha,
749
+ # **kwargs,
750
+ # )
751
+
752
+ # # Tracking
753
+ # tracked_dict = {"parallel_data": data}
754
+ # self._track(track, id, method_name, tracked_dict, None)
755
+
756
+ # return self._axis_mpl
757
+
758
+ # @wraps removed to avoid circular import
759
+ def plot_line(
760
+ self,
761
+ data: ArrayLike,
762
+ xx: Optional[ArrayLike] = None,
763
+ track: bool = True,
764
+ id: Optional[str] = None,
765
+ **kwargs,
766
+ ) -> None:
767
+ """Plot a simple line."""
768
+ # Method Name for downstream csv exporting
769
+ method_name = "plot_line"
770
+
771
+ # Plotting with pure matplotlib methods under non-tracking context
772
+ with self._no_tracking():
773
+ self._axis_mpl, plot_df = self._get_ax_module().plot_line(
774
+ self._axis_mpl, data, xx=xx, **kwargs
775
+ )
776
+
777
+ # Tracking
778
+ tracked_dict = {"plot_df": plot_df}
779
+ self._track(track, id, method_name, tracked_dict, None)
780
+
781
+ return self._axis_mpl, plot_df
782
+
783
+ # @wraps removed to avoid circular import
784
+ def plot_mean_std(
785
+ self,
786
+ data: ArrayLike,
787
+ xx: Optional[ArrayLike] = None,
788
+ sd: float = 1,
789
+ track: bool = True,
790
+ id: Optional[str] = None,
791
+ **kwargs,
792
+ ) -> None:
793
+ """Plot mean line with standard deviation shading."""
794
+ # Method Name for downstream csv exporting
795
+ method_name = "plot_mean_std"
796
+
797
+ # Plotting with pure matplotlib methods under non-tracking context
798
+ with self._no_tracking():
799
+ self._axis_mpl, plot_df = self._get_ax_module().plot_mean_std(
800
+ self._axis_mpl, data, xx=xx, sd=sd, **kwargs
801
+ )
802
+
803
+ # Tracking
804
+ tracked_dict = {"plot_df": plot_df}
805
+ self._track(track, id, method_name, tracked_dict, None)
806
+
807
+ return self._axis_mpl, plot_df
808
+
809
+ # @wraps removed to avoid circular import
810
+ def plot_mean_ci(
811
+ self,
812
+ data: ArrayLike,
813
+ xx: Optional[ArrayLike] = None,
814
+ perc: float = 95,
815
+ track: bool = True,
816
+ id: Optional[str] = None,
817
+ **kwargs,
818
+ ) -> None:
819
+ """Plot mean line with confidence interval shading."""
820
+ # Method Name for downstream csv exporting
821
+ method_name = "plot_mean_ci"
822
+
823
+ # Plotting with pure matplotlib methods under non-tracking context
824
+ with self._no_tracking():
825
+ self._axis_mpl, plot_df = self._get_ax_module().plot_mean_ci(
826
+ self._axis_mpl, data, xx=xx, perc=perc, **kwargs
827
+ )
828
+
829
+ # Tracking
830
+ tracked_dict = {"plot_df": plot_df}
831
+ self._track(track, id, method_name, tracked_dict, None)
832
+
833
+ return self._axis_mpl, plot_df
834
+
835
+ # @wraps removed to avoid circular import
836
+ def plot_median_iqr(
837
+ self,
838
+ data: ArrayLike,
839
+ xx: Optional[ArrayLike] = None,
840
+ track: bool = True,
841
+ id: Optional[str] = None,
842
+ **kwargs,
843
+ ) -> None:
844
+ """Plot median line with interquartile range shading."""
845
+ # Method Name for downstream csv exporting
846
+ method_name = "plot_median_iqr"
847
+
848
+ # Plotting with pure matplotlib methods under non-tracking context
849
+ with self._no_tracking():
850
+ self._axis_mpl, plot_df = self._get_ax_module().plot_median_iqr(
851
+ self._axis_mpl, data, xx=xx, **kwargs
852
+ )
853
+
854
+ # Tracking
855
+ tracked_dict = {"plot_df": plot_df}
856
+ self._track(track, id, method_name, tracked_dict, None)
857
+
858
+ return self._axis_mpl, plot_df
859
+
860
+ # @wraps removed to avoid circular import
861
+ def plot_shaded_line(
862
+ self,
863
+ xs: ArrayLike,
864
+ ys_lower: ArrayLike,
865
+ ys_middle: ArrayLike,
866
+ ys_upper: ArrayLike,
867
+ color: str or Optional[Union[str, List[str]]] = None,
868
+ label: str or Optional[Union[str, List[str]]] = None,
869
+ track: bool = True,
870
+ id: Optional[str] = None,
871
+ **kwargs,
872
+ ) -> None:
873
+ """Plot a line with shaded area between lower and upper bounds."""
874
+ # Method Name for downstream csv exporting
875
+ method_name = "plot_shaded_line"
876
+
877
+ # Plotting with pure matplotlib methods under non-tracking context
878
+ with self._no_tracking():
879
+ self._axis_mpl, plot_df = self._get_ax_module().plot_shaded_line(
880
+ self._axis_mpl,
881
+ xs,
882
+ ys_lower,
883
+ ys_middle,
884
+ ys_upper,
885
+ color=color,
886
+ label=label,
887
+ **kwargs,
888
+ )
889
+
890
+ # Tracking
891
+ tracked_dict = {"plot_df": plot_df}
892
+ self._track(track, id, method_name, tracked_dict, None)
893
+
894
+ return self._axis_mpl, plot_df
895
+
896
+ # EOF