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,343 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-02 22:01:54 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_plot/_plot_violin.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_plot/_plot_violin.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import matplotlib
13
+ import matplotlib.pyplot as plt
14
+ import numpy as np
15
+ import pandas as pd
16
+ import seaborn as sns
17
+ from ....plt.utils import assert_valid_axis
18
+
19
+
20
+ def plot_violin(
21
+ ax,
22
+ data_list,
23
+ labels=None,
24
+ colors=None,
25
+ half=False,
26
+ **kwargs,
27
+ ):
28
+ """
29
+ Plot a violin plot using seaborn.
30
+
31
+ Parameters
32
+ ----------
33
+ ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
34
+ The axes to plot on
35
+ data_list : list
36
+ List of arrays to plot as violins
37
+ labels : list, optional
38
+ Labels for each array in data_list
39
+ colors : list, optional
40
+ Colors for each violin
41
+ half : bool, optional
42
+ If True, plots only the left half of the violins, default False
43
+ **kwargs
44
+ Additional keyword arguments passed to seaborn.violinplot
45
+
46
+ Returns
47
+ -------
48
+ ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
49
+ The axes object with the plot
50
+ """
51
+ # Convert list-style data to DataFrame
52
+ all_values = []
53
+ all_groups = []
54
+
55
+ for idx, values in enumerate(data_list):
56
+ all_values.extend(values)
57
+ group_label = labels[idx] if labels and idx < len(labels) else f"x {idx}"
58
+ all_groups.extend([group_label] * len(values))
59
+
60
+ # Create DataFrame
61
+ df = pd.DataFrame({"x": all_groups, "y": all_values})
62
+
63
+ # Setup colors if provided
64
+ if colors:
65
+ if isinstance(colors, list):
66
+ kwargs["palette"] = {
67
+ group: color
68
+ for group, color in zip(set(all_groups), colors[: len(set(all_groups))])
69
+ }
70
+ else:
71
+ kwargs["palette"] = colors
72
+
73
+ # Call seaborn-based function
74
+ return sns_plot_violin(ax, data=df, x="x", y="y", hue="x", half=half, **kwargs)
75
+
76
+
77
+ def sns_plot_violin(ax, data=None, x=None, y=None, hue=None, half=False, **kwargs):
78
+ """
79
+ Plot a violin plot with option for half violins.
80
+ Parameters
81
+ ----------
82
+ ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
83
+ The axes to plot on
84
+ data : DataFrame
85
+ The dataframe containing the data
86
+ x : str
87
+ Column name for x-axis variable
88
+ y : str
89
+ Column name for y-axis variable
90
+ hue : str, optional
91
+ Column name for hue variable
92
+ half : bool, optional
93
+ If True, plots only the left half of the violins, default False
94
+ **kwargs
95
+ Additional keyword arguments passed to seaborn.violinplot
96
+ Returns
97
+ -------
98
+ ax : matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper
99
+ The axes object with the plot
100
+ """
101
+ assert_valid_axis(ax, "First argument must be a matplotlib axis or scitex axis wrapper")
102
+
103
+ if not half:
104
+ # Standard violin plot
105
+ return sns.violinplot(data=data, x=x, y=y, hue=hue, ax=ax, **kwargs)
106
+
107
+ # Create a copy of the dataframe to avoid modifying the original
108
+ df = data.copy()
109
+
110
+ # If no hue provided, create default hue
111
+ if hue is None:
112
+ df["_hue"] = "default"
113
+ hue = "_hue"
114
+
115
+ # Add fake hue for the right side
116
+ df["_fake_hue"] = df[hue] + "_right"
117
+
118
+ # Adjust hue_order and palette if provided
119
+ if "hue_order" in kwargs:
120
+ kwargs["hue_order"] = kwargs["hue_order"] + [
121
+ h + "_right" for h in kwargs["hue_order"]
122
+ ]
123
+ else:
124
+ kwargs["hue_order"] = []
125
+ for group in df[x].unique().tolist():
126
+ kwargs["hue_order"].append(group)
127
+ kwargs["hue_order"].append(group + "_right")
128
+
129
+ if "palette" in kwargs:
130
+ palette = kwargs["palette"]
131
+ if isinstance(palette, dict):
132
+ kwargs["palette"] = {
133
+ **palette,
134
+ **{k + "_right": v for k, v in palette.items()},
135
+ }
136
+ elif isinstance(palette, list):
137
+ kwargs["palette"] = palette + palette
138
+
139
+ # Conc left and right
140
+ df_left = df[[x, y]]
141
+ df_right = df[["_fake_hue", y]].rename(columns={"_fake_hue": x})
142
+ df_right[y] = [np.nan for _ in range(len(df_right))]
143
+ df_conc = pd.concat([df_left, df_right], axis=0, ignore_index=True)
144
+ df_conc = df_conc.sort_values(x)
145
+
146
+ # Plot
147
+ sns.violinplot(data=df_conc, x=x, y=y, hue="x", split=True, ax=ax, **kwargs)
148
+
149
+ # Remove right half of violins
150
+ for collection in ax.collections:
151
+ if isinstance(collection, plt.matplotlib.collections.PolyCollection):
152
+ collection.set_clip_path(None)
153
+
154
+ # Adjust legend
155
+ if ax.legend_ is not None:
156
+ handles, labels = ax.get_legend_handles_labels()
157
+ ax.legend(handles[: len(handles) // 2], labels[: len(labels) // 2])
158
+
159
+ return ax
160
+
161
+
162
+ # def _plot_half_violin(ax, data=None, x=None, y=None, hue=None, **kwargs):
163
+
164
+ # assert isinstance(
165
+ # ax, matplotlib.axes._axes.Axes
166
+ # ), "First argument must be a matplotlib axis"
167
+
168
+ # # Prepare data
169
+ # df = data.copy()
170
+ # if hue is None:
171
+ # df["_hue"] = "default"
172
+ # hue = "_hue"
173
+
174
+ # # Add fake hue for the right side
175
+ # df["_fake_hue"] = df[hue] + "_right"
176
+
177
+ # # Adjust hue_order and palette if provided
178
+ # if "hue_order" in kwargs:
179
+ # kwargs["hue_order"] = kwargs["hue_order"] + [
180
+ # h + "_right" for h in kwargs["hue_order"]
181
+ # ]
182
+
183
+ # if "palette" in kwargs:
184
+ # palette = kwargs["palette"]
185
+ # if isinstance(palette, dict):
186
+ # kwargs["palette"] = {
187
+ # **palette,
188
+ # **{k + "_right": v for k, v in palette.items()},
189
+ # }
190
+ # elif isinstance(palette, list):
191
+ # kwargs["palette"] = palette + palette
192
+
193
+ # # Plot
194
+ # sns.violinplot(
195
+ # data=df, x=x, y=y, hue="_fake_hue", split=True, ax=ax, **kwargs
196
+ # )
197
+
198
+ # # Remove right half of violins
199
+ # for collection in ax.collections:
200
+ # if isinstance(collection, plt.matplotlib.collections.PolyCollection):
201
+ # collection.set_clip_path(None)
202
+
203
+ # # Adjust legend
204
+ # if ax.legend_ is not None:
205
+ # handles, labels = ax.get_legend_handles_labels()
206
+ # ax.legend(handles[: len(handles) // 2], labels[: len(labels) // 2])
207
+
208
+ # return ax
209
+
210
+ # import matplotlib
211
+ # import matplotlib.pyplot as plt
212
+ # import seaborn as sns
213
+
214
+ # def plot_violin_half(ax, data=None, x=None, y=None, hue=None, **kwargs):
215
+ # """
216
+ # Plot a half violin plot (showing only the left side of violins).
217
+
218
+ # Parameters
219
+ # ----------
220
+ # ax : matplotlib.axes.Axes
221
+ # The axes to plot on
222
+ # data : DataFrame
223
+ # The dataframe containing the data
224
+ # x : str
225
+ # Column name for x-axis variable
226
+ # y : str
227
+ # Column name for y-axis variable
228
+ # hue : str, optional
229
+ # Column name for hue variable
230
+ # **kwargs
231
+ # Additional keyword arguments passed to seaborn.violinplot
232
+
233
+ # Returns
234
+ # -------
235
+ # ax : matplotlib.axes.Axes
236
+ # The axes object with the plot
237
+ # """
238
+ # assert isinstance(
239
+ # ax, matplotlib.axes._axes.Axes
240
+ # ), "First argument must be a matplotlib axis"
241
+
242
+ # # Prepare data
243
+ # df = data.copy()
244
+ # if hue is None:
245
+ # df["_hue"] = "default"
246
+ # hue = "_hue"
247
+
248
+ # # Add fake hue for the right side
249
+ # df["_fake_hue"] = df[hue] + "_right"
250
+
251
+ # # Adjust hue_order and palette if provided
252
+ # if "hue_order" in kwargs:
253
+ # kwargs["hue_order"] = kwargs["hue_order"] + [
254
+ # h + "_right" for h in kwargs["hue_order"]
255
+ # ]
256
+ # if "palette" in kwargs:
257
+ # palette = kwargs["palette"]
258
+ # if isinstance(palette, dict):
259
+ # kwargs["palette"] = {
260
+ # **palette,
261
+ # **{k + "_right": v for k, v in palette.items()},
262
+ # }
263
+ # elif isinstance(palette, list):
264
+ # kwargs["palette"] = palette + palette
265
+
266
+ # # Plot
267
+ # sns.violinplot(
268
+ # data=df, x=x, y=y, hue="_fake_hue", split=True, ax=ax, **kwargs
269
+ # )
270
+
271
+ # # Remove right half of violins
272
+ # for collection in ax.collections:
273
+ # if isinstance(collection, matplotlib.collections.PolyCollection):
274
+ # collection.set_clip_path(None)
275
+
276
+ # # Adjust legend
277
+ # if ax.legend_ is not None:
278
+ # handles, labels = ax.get_legend_handles_labels()
279
+ # ax.legend(handles[: len(handles) // 2], labels[: len(labels) // 2])
280
+
281
+ # return ax
282
+
283
+
284
+ ## Probably working
285
+ def half_violin(ax, data=None, x=None, y=None, hue=None, **kwargs):
286
+ # Prepare data
287
+ df = data.copy()
288
+ if hue is None:
289
+ df["_hue"] = "default"
290
+ hue = "_hue"
291
+
292
+ # Add fake hue for the right side
293
+ df["_fake_hue"] = df[hue] + "_right"
294
+
295
+ # Adjust hue_order and palette if provided
296
+ if "hue_order" in kwargs:
297
+ kwargs["hue_order"] = kwargs["hue_order"] + [
298
+ h + "_right" for h in kwargs["hue_order"]
299
+ ]
300
+
301
+ if "palette" in kwargs:
302
+ palette = kwargs["palette"]
303
+ if isinstance(palette, dict):
304
+ kwargs["palette"] = {
305
+ **palette,
306
+ **{k + "_right": v for k, v in palette.items()},
307
+ }
308
+ elif isinstance(palette, list):
309
+ kwargs["palette"] = palette + palette
310
+
311
+ # Plot
312
+ sns.violinplot(data=df, x=x, y=y, hue="_fake_hue", split=True, ax=ax, **kwargs)
313
+
314
+ # Remove right half of violins
315
+ for collection in ax.collections:
316
+ if isinstance(collection, plt.matplotlib.collections.PolyCollection):
317
+ collection.set_clip_path(None)
318
+
319
+ # Adjust legend
320
+ if ax.legend_ is not None:
321
+ handles, labels = ax.get_legend_handles_labels()
322
+ ax.legend(handles[: len(handles) // 2], labels[: len(labels) // 2])
323
+
324
+ return ax
325
+
326
+
327
+ # import scitex
328
+ # import numpy as np
329
+ # fig, ax = scitex.plt.subplots()
330
+ # # Test with list data
331
+ # data_list = [
332
+ # np.random.normal(0, 1, 100),
333
+ # np.random.normal(2, 1.5, 100),
334
+ # np.random.normal(5, 0.8, 100),
335
+ # ]
336
+ # labels = ["x A", "x B", "x C"]
337
+ # colors = ["red", "blue", "green"]
338
+ # half = True
339
+ # ax = half_violin(
340
+ # ax, data_list, x=""
341
+ # )
342
+
343
+ # EOF
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-02 09:00:59 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_style/__init__.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_style/__init__.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ from ._add_marginal_ax import add_marginal_ax
13
+ from ._add_panel import add_panel
14
+ from ._extend import extend
15
+ from ._force_aspect import force_aspect
16
+ from ._format_label import format_label
17
+ from ._hide_spines import hide_spines
18
+ from ._map_ticks import map_ticks
19
+ from ._rotate_labels import rotate_labels
20
+ from ._sci_note import sci_note, OOMFormatter
21
+ from ._set_n_ticks import set_n_ticks
22
+ from ._set_size import set_size
23
+ from ._set_supxyt import set_supxyt, set_supxytc
24
+ from ._set_ticks import set_ticks
25
+ from ._set_xyt import set_xyt, set_xytc
26
+ from ._set_meta import set_meta, set_figure_meta, export_metadata_yaml
27
+ from ._share_axes import (
28
+ sharexy,
29
+ sharex,
30
+ sharey,
31
+ get_global_xlim,
32
+ get_global_ylim,
33
+ set_xlims,
34
+ set_ylims,
35
+ )
36
+ from ._shift import shift
37
+
38
+ # EOF
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-04-30 20:18:52 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_add_marginal_ax.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_add_marginal_ax.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import matplotlib
13
+ from mpl_toolkits.axes_grid1 import make_axes_locatable
14
+ from ....plt.utils import assert_valid_axis
15
+
16
+
17
+ def add_marginal_ax(axis, place, size=0.2, pad=0.1):
18
+ """
19
+ Add a marginal axis to the specified side of an existing axis.
20
+
21
+ Arguments:
22
+ axis (matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper): The axis to which a marginal axis will be added.
23
+ place (str): Where to place the marginal axis ('top', 'right', 'bottom', or 'left').
24
+ size (float, optional): Fractional size of the marginal axis relative to the main axis. Defaults to 0.2.
25
+ pad (float, optional): Padding between the axes. Defaults to 0.1.
26
+
27
+ Returns:
28
+ matplotlib.axes.Axes: The newly created marginal axis.
29
+ """
30
+ assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
31
+
32
+ divider = make_axes_locatable(axis)
33
+
34
+ size_perc_str = f"{size*100}%"
35
+ if place in ["left", "right"]:
36
+ size = 1.0 / size
37
+
38
+ axis_marginal = divider.append_axes(place, size=size_perc_str, pad=pad)
39
+ axis_marginal.set_box_aspect(size)
40
+
41
+ return axis_marginal
42
+
43
+
44
+ # EOF
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-04-30 21:24:49 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_panel.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_panel.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ # Time-stamp: "2024-02-03 15:34:08 (ywatanabe)"
13
+
14
+ import matplotlib.pyplot as plt
15
+ from scitex.decorators import deprecated
16
+
17
+
18
+ def add_panel(tgt_width_mm=40, tgt_height_mm=None):
19
+ """Creates a fixed-size ax figure for panels."""
20
+
21
+ H_TO_W_RATIO = 0.7
22
+ MM_TO_INCH_FACTOR = 1 / 25.4
23
+
24
+ if tgt_height_mm is None:
25
+ tgt_height_mm = H_TO_W_RATIO * tgt_width_mm
26
+
27
+ # Convert target dimensions from millimeters to inches
28
+ tgt_width_in = tgt_width_mm * MM_TO_INCH_FACTOR
29
+ tgt_height_in = tgt_height_mm * MM_TO_INCH_FACTOR
30
+
31
+ # Create a figure with the specified dimensions
32
+ fig = plt.figure(figsize=(tgt_width_in * 2, tgt_height_in * 2))
33
+
34
+ # Calculate the position and size of the axes in figure units (0 to 1)
35
+ left = (fig.get_figwidth() - tgt_width_in) / 2 / fig.get_figwidth()
36
+ bottom = (fig.get_figheight() - tgt_height_in) / 2 / fig.get_figheight()
37
+ ax = fig.add_axes(
38
+ [
39
+ left,
40
+ bottom,
41
+ tgt_width_in / fig.get_figwidth(),
42
+ tgt_height_in / fig.get_figheight(),
43
+ ]
44
+ )
45
+
46
+ return fig, ax
47
+
48
+
49
+ @deprecated("Use add_panel instead")
50
+ def panel(tgt_width_mm=40, tgt_height_mm=None):
51
+ """Create a figure panel with specified dimensions (deprecated).
52
+
53
+ This function is deprecated and maintained only for backward compatibility.
54
+ Please use `add_panel` instead.
55
+
56
+ Parameters
57
+ ----------
58
+ tgt_width_mm : float, optional
59
+ Target width in millimeters. Default is 40.
60
+ tgt_height_mm : float or None, optional
61
+ Target height in millimeters. If None, uses golden ratio.
62
+ Default is None.
63
+
64
+ Returns
65
+ -------
66
+ tuple
67
+ (fig, ax) - matplotlib figure and axes objects
68
+
69
+ See Also
70
+ --------
71
+ add_panel : The recommended function to use instead
72
+
73
+ Examples
74
+ --------
75
+ >>> # Deprecated usage
76
+ >>> fig, ax = panel(tgt_width_mm=40, tgt_height_mm=30)
77
+
78
+ >>> # Recommended alternative
79
+ >>> fig, ax = add_panel(tgt_width_mm=40, tgt_height_mm=30)
80
+ """
81
+ return add_panel(tgt_width_mm=40, tgt_height_mm=None)
82
+
83
+
84
+ if __name__ == "__main__":
85
+ # Example usage:
86
+ fig, ax = panel(tgt_width_mm=40, tgt_height_mm=40 * 0.7)
87
+ ax.plot([1, 2, 3], [4, 5, 6])
88
+ ax.scatter([1, 2, 3], [4, 5, 6])
89
+ # ... compatible with other ax plotting methods as well
90
+ plt.show()
91
+
92
+ # EOF
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-02 09:00:51 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_style/_extend.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_style/_extend.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import matplotlib
13
+ from ....plt.utils import assert_valid_axis
14
+
15
+
16
+ def extend(axis, x_ratio=1.0, y_ratio=1.0):
17
+ """
18
+ Extend or shrink a matplotlib axis or scitex axis wrapper while maintaining its center position.
19
+
20
+ Args:
21
+ axis (matplotlib.axes._axes.Axes or scitex.plt._subplots.AxisWrapper): The axis to be modified.
22
+ x_ratio (float, optional): The ratio to scale the width. Default is 1.0.
23
+ y_ratio (float, optional): The ratio to scale the height. Default is 1.0.
24
+
25
+ Returns:
26
+ matplotlib.axes._axes.Axes or scitex.plt._subplots.AxisWrapper: The modified axis.
27
+
28
+ Raises:
29
+ AssertionError: If the first argument is not a valid axis.
30
+ """
31
+
32
+ assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
33
+
34
+ assert x_ratio != 0, "x_ratio must not be 0."
35
+ assert y_ratio != 0, "y_ratio must not be 0."
36
+
37
+ ## Original coordinates
38
+ bbox = axis.get_position()
39
+ left_orig = bbox.x0
40
+ bottom_orig = bbox.y0
41
+ width_orig = bbox.x1 - bbox.x0
42
+ height_orig = bbox.y1 - bbox.y0
43
+ g_orig = (left_orig + width_orig / 2.0, bottom_orig + height_orig / 2.0)
44
+
45
+ ## Target coordinates
46
+ g_tgt = g_orig
47
+ width_tgt = width_orig * x_ratio
48
+ height_tgt = height_orig * y_ratio
49
+ left_tgt = g_tgt[0] - width_tgt / 2
50
+ bottom_tgt = g_tgt[1] - height_tgt / 2
51
+
52
+ # Extend the axis
53
+ axis.set_position(
54
+ [
55
+ left_tgt,
56
+ bottom_tgt,
57
+ width_tgt,
58
+ height_tgt,
59
+ ]
60
+ )
61
+ return axis
62
+
63
+
64
+ # EOF
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-05-02 09:00:52 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/plt/ax/_style/_force_aspect.py
5
+ # ----------------------------------------
6
+ import os
7
+
8
+ __FILE__ = "./src/scitex/plt/ax/_style/_force_aspect.py"
9
+ __DIR__ = os.path.dirname(__FILE__)
10
+ # ----------------------------------------
11
+
12
+ import matplotlib
13
+ from ....plt.utils import assert_valid_axis
14
+
15
+
16
+ def force_aspect(axis, aspect=1):
17
+ """
18
+ Forces aspect ratio of an axis based on the extent of the image.
19
+
20
+ Arguments:
21
+ axis (matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper): The axis to adjust.
22
+ aspect (float, optional): The aspect ratio to apply. Defaults to 1.
23
+
24
+ Returns:
25
+ matplotlib.axes.Axes or scitex.plt._subplots.AxisWrapper: The axis with adjusted aspect ratio.
26
+ """
27
+ assert_valid_axis(axis, "First argument must be a matplotlib axis or scitex axis wrapper")
28
+
29
+ im = axis.get_images()
30
+
31
+ extent = im[0].get_extent()
32
+
33
+ axis.set_aspect(abs((extent[1] - extent[0]) / (extent[3] - extent[2])) / aspect)
34
+ return axis
35
+
36
+
37
+ # EOF
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Time-stamp: "2024-09-15 09:39:02 (ywatanabe)"
4
+ # /home/ywatanabe/proj/_scitex_repo_openhands/src/scitex/plt/ax/_format_label.py
5
+
6
+
7
+ def format_label(label):
8
+ """
9
+ Format label by capitalizing first letter and replacing underscores with spaces.
10
+ """
11
+
12
+ # if isinstance(label, str):
13
+ # # Replace underscores with spaces
14
+ # label = label.replace("_", " ")
15
+
16
+ # # Capitalize first letter of each word
17
+ # label = " ".join(word.capitalize() for word in label.split())
18
+
19
+ # # Special case for abbreviations (all caps)
20
+ # if label.isupper():
21
+ # return label
22
+
23
+ return label