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,266 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-02 22:21:41 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_heatmap.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_plot/_plot_heatmap.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import matplotlib
13
+ import matplotlib.pyplot as plt
14
+ import numpy as np
15
+
16
+
17
+ def plot_heatmap(
18
+ ax,
19
+ data,
20
+ x_labels=None,
21
+ y_labels=None,
22
+ cmap="viridis",
23
+ cbar_label="ColorBar Label",
24
+ annot_format="{x:.1f}",
25
+ show_annot=True,
26
+ annot_color_lighter="black",
27
+ annot_color_darker="white",
28
+ **kwargs,
29
+ ):
30
+ """
31
+ Plot a heatmap on the given axes.
32
+
33
+ Parameters
34
+ ----------
35
+ ax : matplotlib.axes.Axes
36
+ The axes to plot on
37
+ data : array-like
38
+ The 2D data to display as heatmap
39
+ x_labels : list, optional
40
+ Labels for the x-axis
41
+ y_labels : list, optional
42
+ Labels for the y-axis
43
+ cmap : str or matplotlib colormap, optional
44
+ Colormap to use, default "viridis"
45
+ cbar_label : str, optional
46
+ Label for the colorbar, default "ColorBar Label"
47
+ show_annot : bool, optional
48
+ Whether to annotate the heatmap with values, default True
49
+ annot_format : str, optional
50
+ Format string for annotations, default "{x:.1f}"
51
+ annot_color_lighter : str, optional
52
+ Color for annotations on lighter background, default "black"
53
+ annot_color_darker : str, optional
54
+ Color for annotations on darker background, default "white"
55
+ **kwargs
56
+ Additional keyword arguments passed to matplotlib.axes.Axes.imshow()
57
+
58
+ Returns
59
+ -------
60
+ im : matplotlib.image.AxesImage
61
+ The image object created by imshow
62
+ cbar : matplotlib.colorbar.Colorbar
63
+ The colorbar object
64
+ """
65
+
66
+ im, cbar = _mpl_heatmap(
67
+ data,
68
+ x_labels,
69
+ y_labels,
70
+ ax=ax,
71
+ cmap=cmap,
72
+ cbarlabel=cbar_label,
73
+ )
74
+
75
+ if show_annot:
76
+ textcolors = _switch_annot_colors(cmap, annot_color_lighter, annot_color_darker)
77
+ texts = _mpl_annotate_heatmap(
78
+ im,
79
+ valfmt=annot_format,
80
+ textcolors=textcolors,
81
+ )
82
+
83
+ return ax, im, cbar
84
+
85
+
86
+ def _switch_annot_colors(cmap, annot_color_lighter, annot_color_darker):
87
+ # Get colormap
88
+ cmap_obj = plt.cm.get_cmap(cmap)
89
+
90
+ # Sample the colormap at its extremes
91
+ dark_color = cmap_obj(0.1) # Not using 0.0 to avoid edge effects
92
+ light_color = cmap_obj(0.9) # Not using 1.0 to avoid edge effects
93
+
94
+ # Calculate perceived brightness
95
+ dark_brightness = (
96
+ 0.2126 * dark_color[0] + 0.7152 * dark_color[1] + 0.0722 * dark_color[2]
97
+ )
98
+ light_brightness = (
99
+ 0.2126 * light_color[0] + 0.7152 * light_color[1] + 0.0722 * light_color[2]
100
+ )
101
+
102
+ # Choose text colors based on background brightness
103
+ if dark_brightness < 0.5:
104
+ return (annot_color_lighter, annot_color_darker)
105
+ else:
106
+ return (annot_color_darker, annot_color_lighter)
107
+
108
+
109
+ def _mpl_heatmap(
110
+ data, row_labels, col_labels, ax=None, cbar_kw=None, cbarlabel="", **kwargs
111
+ ):
112
+ """
113
+ A function to annotate a heatmap.
114
+
115
+ Parameters
116
+ ----------
117
+ im : matplotlib.image.AxesImage
118
+ The image to be annotated
119
+ data : array-like, optional
120
+ Data used to annotate. If None, the image's array is used
121
+ valfmt : str or matplotlib.ticker.Formatter, optional
122
+ Format of the annotations, default "{x:.2f}"
123
+ textcolors : tuple of str, optional
124
+ Colors for the annotations. The first is used for values below
125
+ threshold, the second for those above, default ("lightgray", "black")
126
+ threshold : float, optional
127
+ Value in normalized colormap space (0 to 1) above which the
128
+ second color is used. If None, 0.7*max(data) is used
129
+ **textkw
130
+ Additional keyword arguments passed to matplotlib.axes.Axes.text()
131
+
132
+ Returns
133
+ -------
134
+ texts : list of matplotlib.text.Text
135
+ The annotation text objects
136
+ """
137
+
138
+ if ax is None:
139
+ ax = plt.gca()
140
+
141
+ if cbar_kw is None:
142
+ cbar_kw = {}
143
+
144
+ # Plot the heatmap
145
+ im = ax.imshow(data, **kwargs)
146
+
147
+ # Create colorbar
148
+ cbar = ax.figure.colorbar(im, ax=ax, **cbar_kw)
149
+ cbar.ax.set_ylabel(cbarlabel, rotation=-90, va="bottom")
150
+
151
+ # Show all ticks and label them with the respective list entries.
152
+ ax.set_xticks(
153
+ range(data.shape[1]),
154
+ labels=col_labels,
155
+ # rotation=45,
156
+ # ha="right",
157
+ # rotation_mode="anchor",
158
+ )
159
+ ax.set_yticks(range(data.shape[0]), labels=row_labels)
160
+
161
+ # Let the horizontal axes labeling appear on top.
162
+ ax.tick_params(top=False, bottom=True, labeltop=False, labelbottom=True)
163
+
164
+ # Turn spines off
165
+ ax.spines[:].set_visible(False)
166
+
167
+ ax.set_xticks(np.arange(data.shape[1] + 1) - 0.5, minor=True)
168
+ ax.set_yticks(np.arange(data.shape[0] + 1) - 0.5, minor=True)
169
+ ax.tick_params(which="minor", bottom=False, left=False)
170
+
171
+ return im, cbar
172
+
173
+
174
+ def _mpl_annotate_heatmap(
175
+ im,
176
+ data=None,
177
+ valfmt="{x:.2f}",
178
+ textcolors=("lightgray", "black"),
179
+ threshold=None,
180
+ **textkw,
181
+ ):
182
+ """
183
+ A function to annotate a heatmap.
184
+
185
+ Parameters
186
+ ----------
187
+ im : matplotlib.image.AxesImage
188
+ The image to be annotated
189
+ data : array-like, optional
190
+ Data used to annotate. If None, the image's array is used
191
+ valfmt : str or matplotlib.ticker.Formatter, optional
192
+ Format of the annotations, default "{x:.2f}"
193
+ textcolors : tuple of str, optional
194
+ Colors for the annotations. The first is used for values below
195
+ threshold, the second for those above, default ("lightgray", "black")
196
+ threshold : float, optional
197
+ Value in normalized colormap space (0 to 1) above which the
198
+ second color is used. If None, 0.7*max(data) is used
199
+ **textkw
200
+ Additional keyword arguments passed to matplotlib.axes.Axes.text()
201
+
202
+ Returns
203
+ -------
204
+ texts : list of matplotlib.text.Text
205
+ The annotation text objects
206
+ """
207
+
208
+ if not isinstance(data, (list, np.ndarray)):
209
+ data = im.get_array()
210
+
211
+ # Normalize the threshold to the images color range.
212
+ if threshold is not None:
213
+ threshold = im.norm(threshold)
214
+ else:
215
+ # Use 0.7 instead of 0.5 for better visibility with most colormaps
216
+ threshold = im.norm(data.max()) * 0.7
217
+
218
+ # Set default alignment to center, but allow it to be
219
+ # overwritten by textkw.
220
+ kw = dict(horizontalalignment="center", verticalalignment="center")
221
+ kw.update(textkw)
222
+
223
+ # Get the formatter in case a string is supplied
224
+ if isinstance(valfmt, str):
225
+ valfmt = matplotlib.ticker.StrMethodFormatter(valfmt)
226
+
227
+ # Loop over the data and create a `Text` for each "pixel".
228
+ # Change the text's color depending on the data.
229
+ texts = []
230
+ for ii in range(data.shape[0]):
231
+ for jj in range(data.shape[1]):
232
+ kw.update(color=textcolors[int(im.norm(data[ii, jj]) > threshold)])
233
+ text = im.axes.text(jj, ii, valfmt(data[ii, jj], None), **kw)
234
+ texts.append(text)
235
+
236
+ return texts
237
+
238
+
239
+ if __name__ == "__main__":
240
+ import matplotlib
241
+ import matplotlib as mpl
242
+ import matplotlib.pyplot as plt
243
+ import numpy as np
244
+
245
+ data = np.random.rand(5, 10)
246
+ x_labels = [f"X{ii+1}" for ii in range(5)]
247
+ y_labels = [f"Y{ii+1}" for ii in range(10)]
248
+
249
+ fig, ax = plt.subplots()
250
+
251
+ im, cbar = plot_heatmap(
252
+ ax,
253
+ data,
254
+ x_labels=x_labels,
255
+ y_labels=y_labels,
256
+ show_annot=True,
257
+ annot_color_lighter="white",
258
+ annot_color_darker="black",
259
+ cmap="Blues",
260
+ )
261
+
262
+ fig.tight_layout()
263
+ plt.show()
264
+ # EOF
265
+
266
+ # EOF
@@ -0,0 +1,94 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-01 08:39:46 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_image2d.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_plot/_plot_image2d.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import matplotlib
13
+ from scitex.plt.utils import assert_valid_axis
14
+
15
+
16
+ def plot_image(
17
+ ax,
18
+ arr_2d,
19
+ cbar=True,
20
+ cbar_label=None,
21
+ cbar_shrink=1.0,
22
+ cbar_fraction=0.046,
23
+ cbar_pad=0.04,
24
+ cmap="viridis",
25
+ aspect="auto",
26
+ vmin=None,
27
+ vmax=None,
28
+ **kwargs,
29
+ ):
30
+ """
31
+ Imshows an two-dimensional array with theese two conditions:
32
+ 1) The first dimension represents the x dim, from left to right.
33
+ 2) The second dimension represents the y dim, from bottom to top
34
+
35
+ Parameters
36
+ ----------
37
+ ax : matplotlib.axes.Axes or scitex.plt._subplots._AxisWrapper.AxisWrapper
38
+ The axis to plot on
39
+ arr_2d : numpy.ndarray
40
+ The 2D array to display
41
+ cbar : bool, optional
42
+ Whether to show colorbar, by default True
43
+ cbar_label : str, optional
44
+ Label for the colorbar, by default None
45
+ cbar_shrink : float, optional
46
+ Shrink factor for the colorbar, by default 1.0
47
+ cbar_fraction : float, optional
48
+ Fraction of original axes to use for colorbar, by default 0.046
49
+ cbar_pad : float, optional
50
+ Padding between the image axes and colorbar axes, by default 0.04
51
+ cmap : str, optional
52
+ Colormap name, by default "viridis"
53
+ aspect : str, optional
54
+ Aspect ratio adjustment, by default "auto"
55
+ vmin : float, optional
56
+ Minimum data value for colormap scaling, by default None
57
+ vmax : float, optional
58
+ Maximum data value for colormap scaling, by default None
59
+ **kwargs
60
+ Additional keyword arguments passed to ax.imshow()
61
+
62
+ Returns
63
+ -------
64
+ matplotlib.axes.Axes or scitex.plt._subplots._AxisWrapper.AxisWrapper
65
+ The axis with the image plotted
66
+ """
67
+ assert_valid_axis(ax, "First argument must be a matplotlib axis or scitex axis wrapper")
68
+ assert arr_2d.ndim == 2, "Input array must be 2-dimensional"
69
+
70
+ if kwargs.get("xyz"):
71
+ kwargs.pop("xyz")
72
+
73
+ # Transposes arr_2d for correct orientation
74
+ arr_2d = arr_2d.T
75
+
76
+ # Cals the original ax.imshow() method on the transposed array
77
+ im = ax.imshow(arr_2d, cmap=cmap, vmin=vmin, vmax=vmax, aspect=aspect, **kwargs)
78
+
79
+ # Color bar
80
+ if cbar:
81
+ fig = ax.get_figure()
82
+ _cbar = fig.colorbar(
83
+ im, ax=ax, shrink=cbar_shrink, fraction=cbar_fraction, pad=cbar_pad
84
+ )
85
+ if cbar_label:
86
+ _cbar.set_label(cbar_label)
87
+
88
+ # Invert y-axis to match typical image orientation
89
+ ax.invert_yaxis()
90
+
91
+ return ax
92
+
93
+
94
+ # EOF
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-02 09:03:23 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_joyplot.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_plot/_plot_joyplot.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import warnings
13
+
14
+ import joypy
15
+
16
+ from .._style._set_xyt import set_xyt as scitex_plt_set_xyt
17
+
18
+
19
+ def plot_joyplot(ax, data, orientation="vertical", **kwargs):
20
+ """
21
+ Create a joyplot (ridgeline plot) with proper orientation handling.
22
+
23
+ Parameters
24
+ ----------
25
+ ax : matplotlib.axes.Axes
26
+ The axes to plot on
27
+ data : pandas.DataFrame or array-like
28
+ The data to plot
29
+ orientation : str, default "vertical"
30
+ Plot orientation. Either "vertical" or "horizontal"
31
+ **kwargs
32
+ Additional keyword arguments passed to joypy.joyplot()
33
+
34
+ Returns
35
+ -------
36
+ matplotlib.axes.Axes
37
+ The axes with the joyplot
38
+
39
+ Raises
40
+ ------
41
+ ValueError
42
+ If orientation is not "vertical" or "horizontal"
43
+ """
44
+ if orientation not in ["vertical", "horizontal"]:
45
+ raise ValueError("orientation must be either 'vertical' or 'horizontal'")
46
+
47
+ # Handle orientation by setting appropriate joypy parameters
48
+ if orientation == "horizontal":
49
+ # For horizontal orientation, we need to transpose the data display
50
+ # joypy doesn't have direct horizontal support, so we work with the result
51
+ kwargs.setdefault("kind", "kde") # Ensure we're using KDE plots
52
+
53
+ fig, axes = joypy.joyplot(
54
+ data=data,
55
+ **kwargs,
56
+ )
57
+
58
+ # Set appropriate labels based on orientation
59
+ if orientation == "vertical":
60
+ ax = scitex_plt_set_xyt(ax, None, "Density", "Joyplot")
61
+ elif orientation == "horizontal":
62
+ ax = scitex_plt_set_xyt(ax, "Density", None, "Joyplot")
63
+ # For horizontal plots, we might need additional transformations
64
+ # This is a limitation of joypy which primarily supports vertical plots
65
+
66
+ return ax
67
+
68
+
69
+ # def plot_vertical_joyplot(ax, data, **kwargs):
70
+ # return _plot_joyplot(ax, data, "vertical", **kwargs)
71
+
72
+
73
+ # def plot_horizontal_joyplot(ax, data, **kwargs):
74
+ # return _plot_joyplot(ax, data, "horizontal", **kwargs)
75
+
76
+ # EOF
@@ -0,0 +1,172 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-01 15:23:01 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/_scitex_repo/src/scitex/plt/ax/_plot/_plot_raster.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_plot/_plot_raster.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import matplotlib
13
+ from bisect import bisect_left
14
+
15
+ import matplotlib.pyplot as plt
16
+ import numpy as np
17
+ import pandas as pd
18
+ from ....plt.utils import assert_valid_axis
19
+
20
+
21
+ def plot_raster(
22
+ ax,
23
+ event_times,
24
+ time=None,
25
+ labels=None,
26
+ colors=None,
27
+ orientation="horizontal",
28
+ y_offset=None,
29
+ lineoffsets=None,
30
+ apply_set_n_ticks=True,
31
+ n_xticks=4,
32
+ n_yticks=None,
33
+ **kwargs
34
+ ):
35
+ """
36
+ Create a raster plot using eventplot with custom labels and colors.
37
+
38
+ Parameters
39
+ ----------
40
+ ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
41
+ The axes on which to draw the raster plot.
42
+ event_times : Array-like or list of lists
43
+ Time points of events by channels/trials
44
+ time : array-like, optional
45
+ The time indices for the events (default: np.linspace(0, max(event_times))).
46
+ labels : list, optional
47
+ Labels for each channel/trial.
48
+ colors : list, optional
49
+ Colors for each channel/trial.
50
+ orientation: str, optional
51
+ Orientation of raster plot (default: horizontal).
52
+ y_offset : float, optional
53
+ Vertical spacing between trials/channels.
54
+ lineoffsets : array-like, optional
55
+ Y-positions for each trial/channel (overrides automatic positioning).
56
+ apply_set_n_ticks : bool, optional
57
+ Whether to apply set_n_ticks for cleaner axis (default: True).
58
+ n_xticks : int, optional
59
+ Number of x-axis ticks (default: 4).
60
+ n_yticks : int or None, optional
61
+ Number of y-axis ticks (default: None, auto-determined).
62
+ **kwargs : dict
63
+ Additional keyword arguments for eventplot.
64
+
65
+ Returns
66
+ -------
67
+ ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
68
+ The axes with the raster plot.
69
+ df : pandas.DataFrame
70
+ DataFrame with time indices and channel events.
71
+ """
72
+ assert_valid_axis(ax, "First argument must be a matplotlib axis or scitex axis wrapper")
73
+
74
+ # Format event_times data
75
+ event_times_list = _ensure_list(event_times)
76
+
77
+ # Handle colors and labels
78
+ colors = _handle_colors(colors, event_times_list)
79
+
80
+ # Handle lineoffsets for positioning between trials/channels
81
+ if lineoffsets is None:
82
+ if y_offset is None:
83
+ y_offset = 1.0 # Default spacing
84
+ lineoffsets = np.arange(len(event_times_list)) * y_offset
85
+
86
+ # Ensure lineoffsets is iterable and matches event_times_list length
87
+ if np.isscalar(lineoffsets):
88
+ lineoffsets = [lineoffsets]
89
+ if len(lineoffsets) < len(event_times_list):
90
+ lineoffsets = list(lineoffsets) + list(range(len(lineoffsets), len(event_times_list)))
91
+
92
+ # Plotting as eventplot using event_times_list with proper positioning
93
+ for ii, (pos, color, offset) in enumerate(zip(event_times_list, colors, lineoffsets)):
94
+ label = _define_label(labels, ii)
95
+ ax.eventplot(pos, lineoffsets=offset, orientation=orientation,
96
+ colors=color, label=label, **kwargs)
97
+
98
+ # Apply set_n_ticks for cleaner axes if requested
99
+ if apply_set_n_ticks:
100
+ from scitex.plt.ax._style._set_n_ticks import set_n_ticks
101
+
102
+ # For categorical y-axis (trials/channels), use appropriate tick count
103
+ if n_yticks is None:
104
+ n_yticks = min(len(event_times_list), 8) # Max 8 ticks for readability
105
+
106
+ # Only apply if we have reasonable numeric ranges
107
+ try:
108
+ x_range = ax.get_xlim()
109
+ y_range = ax.get_ylim()
110
+
111
+ # Apply x-ticks if we have a reasonable numeric range
112
+ if x_range[1] - x_range[0] > 0:
113
+ set_n_ticks(ax, n_xticks=n_xticks, n_yticks=None)
114
+
115
+ # Apply y-ticks only if we don't have categorical labels
116
+ if labels is None and y_range[1] - y_range[0] > 0:
117
+ set_n_ticks(ax, n_xticks=None, n_yticks=n_yticks)
118
+
119
+ except Exception:
120
+ # Skip set_n_ticks if there are issues (e.g., categorical data)
121
+ pass
122
+
123
+ # Legend
124
+ if labels is not None:
125
+ ax.legend()
126
+
127
+ # Return event_times in a useful format
128
+ event_times_digital_df = _event_times_to_digital_df(event_times_list, time, lineoffsets)
129
+
130
+ return ax, event_times_digital_df
131
+
132
+
133
+ def _ensure_list(event_times):
134
+ return [[pos] if isinstance(pos, (int, float)) else pos for pos in event_times]
135
+
136
+
137
+ def _define_label(labels, ii):
138
+ if (labels is not None) and (ii < len(labels)):
139
+ return labels[ii]
140
+ else:
141
+ return None
142
+
143
+
144
+ def _handle_colors(colors, event_times_list):
145
+ if colors is None:
146
+ colors = plt.rcParams["axes.prop_cycle"].by_key()["color"]
147
+ if len(colors) < len(event_times_list):
148
+ colors = colors * (len(event_times_list) // len(colors) + 1)
149
+ return colors
150
+
151
+
152
+ def _event_times_to_digital_df(event_times_list, time, lineoffsets=None):
153
+ if time is None:
154
+ time = np.linspace(0, np.max([np.max(pos) for pos in event_times_list]), 1000)
155
+
156
+ digi = np.full((len(event_times_list), len(time)), np.nan, dtype=float)
157
+
158
+ for i_ch, posis_ch in enumerate(event_times_list):
159
+ for posi_ch in posis_ch:
160
+ i_insert = bisect_left(time, posi_ch)
161
+ if i_insert == len(time):
162
+ i_insert -= 1
163
+ # Use lineoffset position if available, otherwise use channel index
164
+ if lineoffsets is not None and i_ch < len(lineoffsets):
165
+ digi[i_ch, i_insert] = lineoffsets[i_ch]
166
+ else:
167
+ digi[i_ch, i_insert] = i_ch
168
+
169
+ return pd.DataFrame(digi.T, index=time)
170
+
171
+
172
+ # EOF
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-01 08:45:44 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_rectangle.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_plot/_plot_rectangle.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ from matplotlib.patches import Rectangle
13
+
14
+
15
+ def plot_rectangle(ax, xx, yy, ww, hh, **kwargs):
16
+ """Add a rectangle patch to an axes.
17
+
18
+ Convenience function for adding rectangular patches to plots, useful for
19
+ highlighting regions, creating box annotations, or drawing geometric shapes.
20
+
21
+ Parameters
22
+ ----------
23
+ ax : matplotlib.axes.Axes
24
+ The axes to add the rectangle to.
25
+ xx : float
26
+ X-coordinate of the rectangle's bottom-left corner.
27
+ yy : float
28
+ Y-coordinate of the rectangle's bottom-left corner.
29
+ ww : float
30
+ Width of the rectangle.
31
+ hh : float
32
+ Height of the rectangle.
33
+ **kwargs : dict
34
+ Additional keyword arguments passed to matplotlib.patches.Rectangle.
35
+ Common options include:
36
+ - facecolor/fc : fill color
37
+ - edgecolor/ec : edge color
38
+ - linewidth/lw : edge line width
39
+ - alpha : transparency (0-1)
40
+ - linestyle/ls : edge line style
41
+
42
+ Returns
43
+ -------
44
+ matplotlib.axes.Axes
45
+ The axes with the rectangle added.
46
+
47
+ Examples
48
+ --------
49
+ >>> fig, ax = plt.subplots()
50
+ >>> ax.plot([0, 10], [0, 10])
51
+ >>> # Highlight a region
52
+ >>> plot_rectangle(ax, 2, 3, 4, 3, facecolor='yellow', alpha=0.3)
53
+
54
+ >>> # Draw a box annotation
55
+ >>> plot_rectangle(ax, 5, 5, 2, 2, facecolor='none', edgecolor='red', linewidth=2)
56
+
57
+ >>> # Create a filled rectangle
58
+ >>> plot_rectangle(ax, 0, 0, 1, 1, facecolor='blue', edgecolor='black')
59
+
60
+ See Also
61
+ --------
62
+ matplotlib.patches.Rectangle : The underlying Rectangle class
63
+ matplotlib.axes.Axes.add_patch : Method used to add the patch
64
+ """
65
+ ax.add_patch(Rectangle((xx, yy), ww, hh, **kwargs))
66
+ return ax
67
+
68
+
69
+ # EOF