scitex 2.7.0__py3-none-any.whl → 2.7.3__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 (297) hide show
  1. scitex/__init__.py +6 -2
  2. scitex/__version__.py +1 -1
  3. scitex/audio/README.md +52 -0
  4. scitex/audio/__init__.py +384 -0
  5. scitex/audio/__main__.py +129 -0
  6. scitex/audio/_tts.py +334 -0
  7. scitex/audio/engines/__init__.py +44 -0
  8. scitex/audio/engines/base.py +275 -0
  9. scitex/audio/engines/elevenlabs_engine.py +143 -0
  10. scitex/audio/engines/gtts_engine.py +162 -0
  11. scitex/audio/engines/pyttsx3_engine.py +131 -0
  12. scitex/audio/mcp_server.py +757 -0
  13. scitex/bridge/_helpers.py +1 -1
  14. scitex/bridge/_plt_vis.py +1 -1
  15. scitex/bridge/_stats_vis.py +1 -1
  16. scitex/dev/plt/__init__.py +272 -0
  17. scitex/dev/plt/plot_mpl_axhline.py +28 -0
  18. scitex/dev/plt/plot_mpl_axhspan.py +28 -0
  19. scitex/dev/plt/plot_mpl_axvline.py +28 -0
  20. scitex/dev/plt/plot_mpl_axvspan.py +28 -0
  21. scitex/dev/plt/plot_mpl_bar.py +29 -0
  22. scitex/dev/plt/plot_mpl_barh.py +29 -0
  23. scitex/dev/plt/plot_mpl_boxplot.py +28 -0
  24. scitex/dev/plt/plot_mpl_contour.py +31 -0
  25. scitex/dev/plt/plot_mpl_contourf.py +31 -0
  26. scitex/dev/plt/plot_mpl_errorbar.py +30 -0
  27. scitex/dev/plt/plot_mpl_eventplot.py +28 -0
  28. scitex/dev/plt/plot_mpl_fill.py +30 -0
  29. scitex/dev/plt/plot_mpl_fill_between.py +31 -0
  30. scitex/dev/plt/plot_mpl_hexbin.py +28 -0
  31. scitex/dev/plt/plot_mpl_hist.py +28 -0
  32. scitex/dev/plt/plot_mpl_hist2d.py +28 -0
  33. scitex/dev/plt/plot_mpl_imshow.py +29 -0
  34. scitex/dev/plt/plot_mpl_pcolormesh.py +31 -0
  35. scitex/dev/plt/plot_mpl_pie.py +29 -0
  36. scitex/dev/plt/plot_mpl_plot.py +29 -0
  37. scitex/dev/plt/plot_mpl_quiver.py +31 -0
  38. scitex/dev/plt/plot_mpl_scatter.py +28 -0
  39. scitex/dev/plt/plot_mpl_stackplot.py +31 -0
  40. scitex/dev/plt/plot_mpl_stem.py +29 -0
  41. scitex/dev/plt/plot_mpl_step.py +29 -0
  42. scitex/dev/plt/plot_mpl_violinplot.py +28 -0
  43. scitex/dev/plt/plot_sns_barplot.py +29 -0
  44. scitex/dev/plt/plot_sns_boxplot.py +29 -0
  45. scitex/dev/plt/plot_sns_heatmap.py +28 -0
  46. scitex/dev/plt/plot_sns_histplot.py +29 -0
  47. scitex/dev/plt/plot_sns_kdeplot.py +29 -0
  48. scitex/dev/plt/plot_sns_lineplot.py +31 -0
  49. scitex/dev/plt/plot_sns_scatterplot.py +29 -0
  50. scitex/dev/plt/plot_sns_stripplot.py +29 -0
  51. scitex/dev/plt/plot_sns_swarmplot.py +29 -0
  52. scitex/dev/plt/plot_sns_violinplot.py +29 -0
  53. scitex/dev/plt/plot_stx_bar.py +29 -0
  54. scitex/dev/plt/plot_stx_barh.py +29 -0
  55. scitex/dev/plt/plot_stx_box.py +28 -0
  56. scitex/dev/plt/plot_stx_boxplot.py +28 -0
  57. scitex/dev/plt/plot_stx_conf_mat.py +28 -0
  58. scitex/dev/plt/plot_stx_contour.py +31 -0
  59. scitex/dev/plt/plot_stx_ecdf.py +28 -0
  60. scitex/dev/plt/plot_stx_errorbar.py +30 -0
  61. scitex/dev/plt/plot_stx_fill_between.py +31 -0
  62. scitex/dev/plt/plot_stx_fillv.py +28 -0
  63. scitex/dev/plt/plot_stx_heatmap.py +28 -0
  64. scitex/dev/plt/plot_stx_image.py +28 -0
  65. scitex/dev/plt/plot_stx_imshow.py +28 -0
  66. scitex/dev/plt/plot_stx_joyplot.py +28 -0
  67. scitex/dev/plt/plot_stx_kde.py +28 -0
  68. scitex/dev/plt/plot_stx_line.py +28 -0
  69. scitex/dev/plt/plot_stx_mean_ci.py +28 -0
  70. scitex/dev/plt/plot_stx_mean_std.py +28 -0
  71. scitex/dev/plt/plot_stx_median_iqr.py +28 -0
  72. scitex/dev/plt/plot_stx_raster.py +28 -0
  73. scitex/dev/plt/plot_stx_rectangle.py +28 -0
  74. scitex/dev/plt/plot_stx_scatter.py +29 -0
  75. scitex/dev/plt/plot_stx_shaded_line.py +29 -0
  76. scitex/dev/plt/plot_stx_violin.py +28 -0
  77. scitex/dev/plt/plot_stx_violinplot.py +28 -0
  78. scitex/fig/__init__.py +352 -0
  79. scitex/{vis → fig}/backend/_parser.py +1 -1
  80. scitex/{vis → fig}/canvas.py +1 -1
  81. scitex/{vis → fig}/editor/_defaults.py +70 -5
  82. scitex/fig/editor/_edit.py +751 -0
  83. scitex/{vis → fig}/editor/_qt_editor.py +181 -1
  84. scitex/fig/editor/flask_editor/_bbox.py +1276 -0
  85. scitex/fig/editor/flask_editor/_core.py +624 -0
  86. scitex/{vis → fig}/editor/flask_editor/_plotter.py +38 -4
  87. scitex/fig/editor/flask_editor/_renderer.py +739 -0
  88. scitex/{vis → fig}/editor/flask_editor/templates/__init__.py +1 -1
  89. scitex/fig/editor/flask_editor/templates/_html.py +834 -0
  90. scitex/fig/editor/flask_editor/templates/_scripts.py +3136 -0
  91. scitex/{vis → fig}/editor/flask_editor/templates/_styles.py +625 -18
  92. scitex/{vis → fig}/io/__init__.py +13 -1
  93. scitex/fig/io/_bundle.py +973 -0
  94. scitex/{vis → fig}/io/_canvas.py +1 -1
  95. scitex/{vis → fig}/io/_data.py +1 -1
  96. scitex/{vis → fig}/io/_export.py +1 -1
  97. scitex/{vis → fig}/io/_load.py +1 -1
  98. scitex/{vis → fig}/io/_panel.py +1 -1
  99. scitex/{vis → fig}/io/_save.py +1 -1
  100. scitex/{vis → fig}/model/__init__.py +1 -1
  101. scitex/{vis → fig}/model/_annotations.py +1 -1
  102. scitex/{vis → fig}/model/_axes.py +1 -1
  103. scitex/{vis → fig}/model/_figure.py +1 -1
  104. scitex/{vis → fig}/model/_guides.py +1 -1
  105. scitex/{vis → fig}/model/_plot.py +1 -1
  106. scitex/{vis → fig}/model/_styles.py +1 -1
  107. scitex/{vis → fig}/utils/__init__.py +1 -1
  108. scitex/io/__init__.py +10 -26
  109. scitex/io/_bundle.py +434 -0
  110. scitex/io/_flush.py +5 -2
  111. scitex/io/_load.py +98 -0
  112. scitex/io/_load_modules/_H5Explorer.py +5 -2
  113. scitex/io/_load_modules/_canvas.py +2 -2
  114. scitex/io/_load_modules/_image.py +3 -4
  115. scitex/io/_load_modules/_txt.py +4 -2
  116. scitex/io/_metadata.py +34 -324
  117. scitex/io/_metadata_modules/__init__.py +46 -0
  118. scitex/io/_metadata_modules/_embed.py +70 -0
  119. scitex/io/_metadata_modules/_read.py +64 -0
  120. scitex/io/_metadata_modules/_utils.py +79 -0
  121. scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
  122. scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
  123. scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
  124. scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
  125. scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
  126. scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
  127. scitex/io/_metadata_modules/read_metadata_png.py +39 -0
  128. scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
  129. scitex/io/_qr_utils.py +5 -3
  130. scitex/io/_save.py +548 -30
  131. scitex/io/_save_modules/_canvas.py +3 -3
  132. scitex/io/_save_modules/_image.py +5 -9
  133. scitex/io/_save_modules/_tex.py +7 -4
  134. scitex/io/utils/h5_to_zarr.py +11 -9
  135. scitex/msword/__init__.py +255 -0
  136. scitex/msword/profiles.py +357 -0
  137. scitex/msword/reader.py +753 -0
  138. scitex/msword/utils.py +289 -0
  139. scitex/msword/writer.py +362 -0
  140. scitex/plt/__init__.py +5 -2
  141. scitex/plt/_subplots/_AxesWrapper.py +6 -6
  142. scitex/plt/_subplots/_AxisWrapper.py +15 -9
  143. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
  144. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
  145. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
  146. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
  147. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
  148. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
  149. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
  150. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
  151. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
  152. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
  153. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
  154. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
  155. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
  156. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
  157. scitex/plt/_subplots/_FigWrapper.py +6 -6
  158. scitex/plt/_subplots/_SubplotsWrapper.py +28 -18
  159. scitex/plt/_subplots/_export_as_csv.py +35 -5
  160. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +8 -0
  161. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +10 -21
  162. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +18 -7
  163. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +28 -12
  164. scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +10 -4
  165. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +13 -1
  166. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +12 -2
  167. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +10 -3
  168. scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +10 -4
  169. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +18 -3
  170. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +44 -36
  171. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +14 -2
  172. scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +11 -5
  173. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
  174. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
  175. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +14 -3
  176. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
  177. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +14 -2
  178. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
  179. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +16 -6
  180. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +29 -19
  181. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
  182. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +22 -5
  183. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +18 -14
  184. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +18 -14
  185. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +18 -14
  186. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +10 -2
  187. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
  188. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +18 -9
  189. scitex/plt/ax/_plot/_stx_ecdf.py +4 -2
  190. scitex/plt/gallery/_generate.py +421 -14
  191. scitex/plt/io/__init__.py +53 -0
  192. scitex/plt/io/_bundle.py +490 -0
  193. scitex/plt/io/_layered_bundle.py +1343 -0
  194. scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
  195. scitex/plt/styles/__init__.py +14 -0
  196. scitex/plt/styles/presets.py +78 -0
  197. scitex/plt/utils/__init__.py +13 -1
  198. scitex/plt/utils/_collect_figure_metadata.py +10 -14
  199. scitex/plt/utils/_configure_mpl.py +6 -18
  200. scitex/plt/utils/_crop.py +32 -14
  201. scitex/plt/utils/_csv_column_naming.py +54 -0
  202. scitex/plt/utils/_figure_mm.py +116 -1
  203. scitex/plt/utils/_hitmap.py +1643 -0
  204. scitex/plt/utils/metadata/__init__.py +25 -0
  205. scitex/plt/utils/metadata/_core.py +9 -10
  206. scitex/plt/utils/metadata/_dimensions.py +6 -3
  207. scitex/plt/utils/metadata/_editable_export.py +405 -0
  208. scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
  209. scitex/schema/__init__.py +109 -16
  210. scitex/schema/_canvas.py +1 -1
  211. scitex/schema/_plot.py +1015 -0
  212. scitex/schema/_stats.py +2 -2
  213. scitex/stats/__init__.py +117 -0
  214. scitex/stats/io/__init__.py +29 -0
  215. scitex/stats/io/_bundle.py +156 -0
  216. scitex/tex/__init__.py +4 -0
  217. scitex/tex/_export.py +890 -0
  218. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/METADATA +11 -1
  219. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/RECORD +238 -170
  220. scitex/io/memo.md +0 -2827
  221. scitex/plt/REQUESTS.md +0 -191
  222. scitex/plt/_subplots/TODO.md +0 -53
  223. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -559
  224. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1609
  225. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -447
  226. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_between.json +0 -110
  227. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_betweenx.json +0 -88
  228. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fill_between.json +0 -103
  229. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fillv.json +0 -106
  230. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/bar.json +0 -92
  231. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/barh.json +0 -92
  232. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/boxplot.json +0 -92
  233. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_bar.json +0 -84
  234. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_barh.json +0 -84
  235. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_box.json +0 -83
  236. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_boxplot.json +0 -93
  237. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violin.json +0 -91
  238. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violinplot.json +0 -91
  239. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/violinplot.json +0 -91
  240. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contour.json +0 -97
  241. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contourf.json +0 -98
  242. scitex/plt/templates/research-master/scitex/vis/gallery/contour/stx_contour.json +0 -84
  243. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist.json +0 -101
  244. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist2d.json +0 -96
  245. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_ecdf.json +0 -95
  246. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_joyplot.json +0 -95
  247. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_kde.json +0 -93
  248. scitex/plt/templates/research-master/scitex/vis/gallery/grid/imshow.json +0 -95
  249. scitex/plt/templates/research-master/scitex/vis/gallery/grid/matshow.json +0 -95
  250. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_conf_mat.json +0 -83
  251. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_heatmap.json +0 -92
  252. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_image.json +0 -121
  253. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_imshow.json +0 -84
  254. scitex/plt/templates/research-master/scitex/vis/gallery/line/plot.json +0 -110
  255. scitex/plt/templates/research-master/scitex/vis/gallery/line/step.json +0 -92
  256. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_line.json +0 -95
  257. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_shaded_line.json +0 -96
  258. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/hexbin.json +0 -95
  259. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/scatter.json +0 -95
  260. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stem.json +0 -92
  261. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stx_scatter.json +0 -84
  262. scitex/plt/templates/research-master/scitex/vis/gallery/special/pie.json +0 -94
  263. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_raster.json +0 -109
  264. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_rectangle.json +0 -108
  265. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/errorbar.json +0 -93
  266. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_errorbar.json +0 -84
  267. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_ci.json +0 -96
  268. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_std.json +0 -96
  269. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_median_iqr.json +0 -96
  270. scitex/plt/templates/research-master/scitex/vis/gallery/vector/quiver.json +0 -99
  271. scitex/plt/templates/research-master/scitex/vis/gallery/vector/streamplot.json +0 -100
  272. scitex/vis/__init__.py +0 -177
  273. scitex/vis/editor/_edit.py +0 -390
  274. scitex/vis/editor/flask_editor/_bbox.py +0 -529
  275. scitex/vis/editor/flask_editor/_core.py +0 -168
  276. scitex/vis/editor/flask_editor/_renderer.py +0 -393
  277. scitex/vis/editor/flask_editor/templates/_html.py +0 -513
  278. scitex/vis/editor/flask_editor/templates/_scripts.py +0 -1261
  279. /scitex/{vis → fig}/README.md +0 -0
  280. /scitex/{vis → fig}/backend/__init__.py +0 -0
  281. /scitex/{vis → fig}/backend/_export.py +0 -0
  282. /scitex/{vis → fig}/backend/_render.py +0 -0
  283. /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
  284. /scitex/{vis → fig}/editor/__init__.py +0 -0
  285. /scitex/{vis → fig}/editor/_dearpygui_editor.py +0 -0
  286. /scitex/{vis → fig}/editor/_flask_editor.py +0 -0
  287. /scitex/{vis → fig}/editor/_mpl_editor.py +0 -0
  288. /scitex/{vis → fig}/editor/_tkinter_editor.py +0 -0
  289. /scitex/{vis → fig}/editor/flask_editor/__init__.py +0 -0
  290. /scitex/{vis → fig}/editor/flask_editor/_utils.py +0 -0
  291. /scitex/{vis → fig}/io/_directory.py +0 -0
  292. /scitex/{vis → fig}/model/_plot_types.py +0 -0
  293. /scitex/{vis → fig}/utils/_defaults.py +0 -0
  294. /scitex/{vis → fig}/utils/_validate.py +0 -0
  295. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/WHEEL +0 -0
  296. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/entry_points.txt +0 -0
  297. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,321 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-12-13 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py
5
+
6
+ """
7
+ Matplotlib aliases (mpl_xxx) for explicit matplotlib-style API.
8
+
9
+ Provides consistent naming convention:
10
+ - stx_xxx: scitex-specific methods (ArrayLike input, tracked)
11
+ - sns_xxx: seaborn wrappers (DataFrame input, tracked)
12
+ - mpl_xxx: matplotlib methods (matplotlib-style input, tracked)
13
+
14
+ All three API layers track data for reproducibility.
15
+
16
+ Usage:
17
+ ax.stx_line(y) # ArrayLike input
18
+ ax.sns_boxplot(data=df, x="group", y="value") # DataFrame input
19
+ ax.mpl_plot(x, y) # matplotlib-style input
20
+ ax.plot(x, y) # Same as mpl_plot
21
+ """
22
+
23
+ import os
24
+
25
+ __FILE__ = __file__
26
+ __DIR__ = os.path.dirname(__FILE__)
27
+
28
+
29
+ class RawMatplotlibMixin:
30
+ """Mixin providing mpl_xxx aliases for matplotlib-style API.
31
+
32
+ These methods are identical to calling ax.plot(), ax.scatter(), etc.
33
+ They go through SciTeX's __getattr__ wrapper and are fully tracked.
34
+
35
+ The mpl_* prefix provides:
36
+ - Explicit naming convention (mpl_* vs stx_* vs sns_*)
37
+ - Programmatic access via MPL_METHODS registry
38
+ - Same tracking and styling as regular matplotlib calls
39
+ """
40
+
41
+ # =========================================================================
42
+ # Helper to call through __getattr__ wrapper (enables tracking)
43
+ # =========================================================================
44
+ def _mpl_call(self, method_name, *args, **kwargs):
45
+ """Call matplotlib method through __getattr__ wrapper for tracking."""
46
+ # Use object.__getattribute__ to get the __getattr__ from AxisWrapper
47
+ # Then call it with the method name to get the tracked wrapper
48
+ wrapper_class = type(self)
49
+ # Walk up MRO to find __getattr__ in AxisWrapper
50
+ for cls in wrapper_class.__mro__:
51
+ if "__getattr__" in cls.__dict__:
52
+ return cls.__getattr__(self, method_name)(*args, **kwargs)
53
+ # Fallback to direct call if no __getattr__ found
54
+ return getattr(self._axes_mpl, method_name)(*args, **kwargs)
55
+
56
+ # =========================================================================
57
+ # Line plots
58
+ # =========================================================================
59
+ def mpl_plot(self, *args, **kwargs):
60
+ """Matplotlib plot() - tracked, identical to ax.plot()."""
61
+ return self._mpl_call("plot", *args, **kwargs)
62
+
63
+ def mpl_step(self, *args, **kwargs):
64
+ """Matplotlib step() - tracked, identical to ax.step()."""
65
+ return self._mpl_call("step", *args, **kwargs)
66
+
67
+ def mpl_stem(self, *args, **kwargs):
68
+ """Matplotlib stem() - tracked, identical to ax.stem()."""
69
+ return self._mpl_call("stem", *args, **kwargs)
70
+
71
+ # =========================================================================
72
+ # Scatter plots
73
+ # =========================================================================
74
+ def mpl_scatter(self, *args, **kwargs):
75
+ """Matplotlib scatter() - tracked, identical to ax.scatter()."""
76
+ return self._mpl_call("scatter", *args, **kwargs)
77
+
78
+ # =========================================================================
79
+ # Bar plots
80
+ # =========================================================================
81
+ def mpl_bar(self, *args, **kwargs):
82
+ """Matplotlib bar() - tracked, identical to ax.bar()."""
83
+ return self._mpl_call("bar", *args, **kwargs)
84
+
85
+ def mpl_barh(self, *args, **kwargs):
86
+ """Matplotlib barh() - tracked, identical to ax.barh()."""
87
+ return self._mpl_call("barh", *args, **kwargs)
88
+
89
+ def mpl_bar3d(self, *args, **kwargs):
90
+ """Matplotlib bar3d() (3D axes) - tracked."""
91
+ return self._mpl_call("bar3d", *args, **kwargs)
92
+
93
+ # =========================================================================
94
+ # Histograms
95
+ # =========================================================================
96
+ def mpl_hist(self, *args, **kwargs):
97
+ """Matplotlib hist() - tracked, identical to ax.hist()."""
98
+ return self._mpl_call("hist", *args, **kwargs)
99
+
100
+ def mpl_hist2d(self, *args, **kwargs):
101
+ """Matplotlib hist2d() - tracked, identical to ax.hist2d()."""
102
+ return self._mpl_call("hist2d", *args, **kwargs)
103
+
104
+ def mpl_hexbin(self, *args, **kwargs):
105
+ """Matplotlib hexbin() - tracked, identical to ax.hexbin()."""
106
+ return self._mpl_call("hexbin", *args, **kwargs)
107
+
108
+ # =========================================================================
109
+ # Statistical plots
110
+ # =========================================================================
111
+ def mpl_boxplot(self, *args, **kwargs):
112
+ """Matplotlib boxplot() - tracked, identical to ax.boxplot()."""
113
+ return self._mpl_call("boxplot", *args, **kwargs)
114
+
115
+ def mpl_violinplot(self, *args, **kwargs):
116
+ """Matplotlib violinplot() - tracked, identical to ax.violinplot()."""
117
+ return self._mpl_call("violinplot", *args, **kwargs)
118
+
119
+ def mpl_errorbar(self, *args, **kwargs):
120
+ """Matplotlib errorbar() - tracked, identical to ax.errorbar()."""
121
+ return self._mpl_call("errorbar", *args, **kwargs)
122
+
123
+ def mpl_eventplot(self, *args, **kwargs):
124
+ """Matplotlib eventplot() - tracked, identical to ax.eventplot()."""
125
+ return self._mpl_call("eventplot", *args, **kwargs)
126
+
127
+ # =========================================================================
128
+ # Fill and area plots
129
+ # =========================================================================
130
+ def mpl_fill(self, *args, **kwargs):
131
+ """Matplotlib fill() - tracked, identical to ax.fill()."""
132
+ return self._mpl_call("fill", *args, **kwargs)
133
+
134
+ def mpl_fill_between(self, *args, **kwargs):
135
+ """Matplotlib fill_between() - tracked, identical to ax.fill_between()."""
136
+ return self._mpl_call("fill_between", *args, **kwargs)
137
+
138
+ def mpl_fill_betweenx(self, *args, **kwargs):
139
+ """Matplotlib fill_betweenx() - tracked, identical to ax.fill_betweenx()."""
140
+ return self._mpl_call("fill_betweenx", *args, **kwargs)
141
+
142
+ def mpl_stackplot(self, *args, **kwargs):
143
+ """Matplotlib stackplot() - tracked, identical to ax.stackplot()."""
144
+ return self._mpl_call("stackplot", *args, **kwargs)
145
+
146
+ # =========================================================================
147
+ # Contour and heatmap plots
148
+ # =========================================================================
149
+ def mpl_contour(self, *args, **kwargs):
150
+ """Matplotlib contour() - tracked, identical to ax.contour()."""
151
+ return self._mpl_call("contour", *args, **kwargs)
152
+
153
+ def mpl_contourf(self, *args, **kwargs):
154
+ """Matplotlib contourf() - tracked, identical to ax.contourf()."""
155
+ return self._mpl_call("contourf", *args, **kwargs)
156
+
157
+ def mpl_imshow(self, *args, **kwargs):
158
+ """Matplotlib imshow() - tracked, identical to ax.imshow()."""
159
+ return self._mpl_call("imshow", *args, **kwargs)
160
+
161
+ def mpl_pcolormesh(self, *args, **kwargs):
162
+ """Matplotlib pcolormesh() - tracked, identical to ax.pcolormesh()."""
163
+ return self._mpl_call("pcolormesh", *args, **kwargs)
164
+
165
+ def mpl_pcolor(self, *args, **kwargs):
166
+ """Matplotlib pcolor() - tracked, identical to ax.pcolor()."""
167
+ return self._mpl_call("pcolor", *args, **kwargs)
168
+
169
+ def mpl_matshow(self, *args, **kwargs):
170
+ """Matplotlib matshow() - tracked, identical to ax.matshow()."""
171
+ return self._mpl_call("matshow", *args, **kwargs)
172
+
173
+ # =========================================================================
174
+ # Vector field plots
175
+ # =========================================================================
176
+ def mpl_quiver(self, *args, **kwargs):
177
+ """Matplotlib quiver() - tracked, identical to ax.quiver()."""
178
+ return self._mpl_call("quiver", *args, **kwargs)
179
+
180
+ def mpl_streamplot(self, *args, **kwargs):
181
+ """Matplotlib streamplot() - tracked, identical to ax.streamplot()."""
182
+ return self._mpl_call("streamplot", *args, **kwargs)
183
+
184
+ def mpl_barbs(self, *args, **kwargs):
185
+ """Matplotlib barbs() - tracked, identical to ax.barbs()."""
186
+ return self._mpl_call("barbs", *args, **kwargs)
187
+
188
+ # =========================================================================
189
+ # Pie and polar plots
190
+ # =========================================================================
191
+ def mpl_pie(self, *args, **kwargs):
192
+ """Matplotlib pie() - tracked, identical to ax.pie()."""
193
+ return self._mpl_call("pie", *args, **kwargs)
194
+
195
+ # =========================================================================
196
+ # Text and annotations
197
+ # =========================================================================
198
+ def mpl_text(self, *args, **kwargs):
199
+ """Matplotlib text() - tracked, identical to ax.text()."""
200
+ return self._mpl_call("text", *args, **kwargs)
201
+
202
+ def mpl_annotate(self, *args, **kwargs):
203
+ """Matplotlib annotate() - tracked, identical to ax.annotate()."""
204
+ return self._mpl_call("annotate", *args, **kwargs)
205
+
206
+ # =========================================================================
207
+ # Lines and spans
208
+ # =========================================================================
209
+ def mpl_axhline(self, *args, **kwargs):
210
+ """Matplotlib axhline() - tracked, identical to ax.axhline()."""
211
+ return self._mpl_call("axhline", *args, **kwargs)
212
+
213
+ def mpl_axvline(self, *args, **kwargs):
214
+ """Matplotlib axvline() - tracked, identical to ax.axvline()."""
215
+ return self._mpl_call("axvline", *args, **kwargs)
216
+
217
+ def mpl_axhspan(self, *args, **kwargs):
218
+ """Matplotlib axhspan() - tracked, identical to ax.axhspan()."""
219
+ return self._mpl_call("axhspan", *args, **kwargs)
220
+
221
+ def mpl_axvspan(self, *args, **kwargs):
222
+ """Matplotlib axvspan() - tracked, identical to ax.axvspan()."""
223
+ return self._mpl_call("axvspan", *args, **kwargs)
224
+
225
+ # =========================================================================
226
+ # Patches and shapes
227
+ # =========================================================================
228
+ def mpl_add_patch(self, patch, **kwargs):
229
+ """Matplotlib add_patch() - tracked, identical to ax.add_patch()."""
230
+ return self._mpl_call("add_patch", patch, **kwargs)
231
+
232
+ def mpl_add_artist(self, artist, **kwargs):
233
+ """Matplotlib add_artist() - tracked, identical to ax.add_artist()."""
234
+ return self._mpl_call("add_artist", artist, **kwargs)
235
+
236
+ def mpl_add_collection(self, collection, **kwargs):
237
+ """Matplotlib add_collection() - tracked, identical to ax.add_collection()."""
238
+ return self._mpl_call("add_collection", collection, **kwargs)
239
+
240
+ # =========================================================================
241
+ # 3D plotting (if available)
242
+ # =========================================================================
243
+ def mpl_plot_surface(self, *args, **kwargs):
244
+ """Matplotlib plot_surface() (3D axes) - tracked."""
245
+ return self._mpl_call("plot_surface", *args, **kwargs)
246
+
247
+ def mpl_plot_wireframe(self, *args, **kwargs):
248
+ """Matplotlib plot_wireframe() (3D axes) - tracked."""
249
+ return self._mpl_call("plot_wireframe", *args, **kwargs)
250
+
251
+ def mpl_contour3D(self, *args, **kwargs):
252
+ """Matplotlib contour3D() (3D axes) - tracked."""
253
+ return self._mpl_call("contour3D", *args, **kwargs)
254
+
255
+ def mpl_scatter3D(self, *args, **kwargs):
256
+ """Matplotlib scatter3D() (3D axes) - tracked."""
257
+ return self._mpl_call("scatter3D", *args, **kwargs)
258
+
259
+ # =========================================================================
260
+ # Utility method to get raw axes
261
+ # =========================================================================
262
+ @property
263
+ def mpl_axes(self):
264
+ """Direct access to underlying matplotlib axes object."""
265
+ return self._axes_mpl
266
+
267
+ def mpl_raw(self, method_name, *args, **kwargs):
268
+ """Call any matplotlib method by name without scitex processing.
269
+
270
+ Parameters
271
+ ----------
272
+ method_name : str
273
+ Name of matplotlib axes method to call
274
+ *args, **kwargs
275
+ Arguments to pass to the method
276
+
277
+ Returns
278
+ -------
279
+ result
280
+ Result from matplotlib method
281
+
282
+ Example
283
+ -------
284
+ >>> ax.mpl_raw("tricontour", x, y, z, levels=10)
285
+ """
286
+ method = getattr(self._axes_mpl, method_name)
287
+ return method(*args, **kwargs)
288
+
289
+
290
+ # Registry of mpl_xxx methods for programmatic access
291
+ MPL_METHODS = [
292
+ # Line plots
293
+ "mpl_plot", "mpl_step", "mpl_stem",
294
+ # Scatter
295
+ "mpl_scatter",
296
+ # Bar
297
+ "mpl_bar", "mpl_barh", "mpl_bar3d",
298
+ # Histograms
299
+ "mpl_hist", "mpl_hist2d", "mpl_hexbin",
300
+ # Statistical
301
+ "mpl_boxplot", "mpl_violinplot", "mpl_errorbar", "mpl_eventplot",
302
+ # Fill/area
303
+ "mpl_fill", "mpl_fill_between", "mpl_fill_betweenx", "mpl_stackplot",
304
+ # Contour/heatmap
305
+ "mpl_contour", "mpl_contourf", "mpl_imshow", "mpl_pcolormesh", "mpl_pcolor", "mpl_matshow",
306
+ # Vector fields
307
+ "mpl_quiver", "mpl_streamplot", "mpl_barbs",
308
+ # Pie
309
+ "mpl_pie",
310
+ # Text/annotations
311
+ "mpl_text", "mpl_annotate",
312
+ # Lines/spans
313
+ "mpl_axhline", "mpl_axvline", "mpl_axhspan", "mpl_axvspan",
314
+ # Patches
315
+ "mpl_add_patch", "mpl_add_artist", "mpl_add_collection",
316
+ # 3D
317
+ "mpl_plot_surface", "mpl_plot_wireframe", "mpl_contour3D", "mpl_scatter3D",
318
+ ]
319
+
320
+
321
+ # EOF
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-12-13 (ywatanabe)"
4
+ # File: __init__.py - SeabornMixin package
5
+
6
+ """
7
+ SeabornMixin - Modular seaborn integration mixin for AxisWrapper.
8
+
9
+ This package provides seaborn plotting functionality:
10
+ - _base: Helper methods and data preparation
11
+ - _wrappers: Individual seaborn plot wrappers (sns_xxx)
12
+ """
13
+
14
+ import os
15
+
16
+ __FILE__ = __file__
17
+ __DIR__ = os.path.dirname(__FILE__)
18
+
19
+ from ._base import SeabornBaseMixin, sns_copy_doc
20
+ from ._wrappers import SeabornWrappersMixin
21
+
22
+
23
+ class SeabornMixin(SeabornBaseMixin, SeabornWrappersMixin):
24
+ """Mixin class for seaborn plotting integration.
25
+
26
+ Combines:
27
+ - SeabornBaseMixin: Helper methods for tracking and data preparation
28
+ - SeabornWrappersMixin: Individual sns_ prefixed seaborn wrappers
29
+ """
30
+ pass
31
+
32
+
33
+ # EOF
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-12-13 (ywatanabe)"
4
+ # File: _base.py - Base seaborn functionality
5
+
6
+ """Base seaborn mixin with helper methods for tracking and data preparation."""
7
+
8
+ import os
9
+ from functools import wraps
10
+
11
+ import scitex
12
+ import numpy as np
13
+ import pandas as pd
14
+ import seaborn as sns
15
+
16
+ __FILE__ = __file__
17
+ __DIR__ = os.path.dirname(__FILE__)
18
+
19
+
20
+ def sns_copy_doc(func):
21
+ """Decorator to copy docstring from seaborn function."""
22
+ @wraps(func)
23
+ def wrapper(self, *args, **kwargs):
24
+ return func(self, *args, **kwargs)
25
+
26
+ sns_method_name = func.__name__.split("sns_")[-1]
27
+ wrapper.__doc__ = getattr(sns, sns_method_name).__doc__
28
+ return wrapper
29
+
30
+
31
+ class SeabornBaseMixin:
32
+ """Base mixin for seaborn integration with tracking support."""
33
+
34
+ def _sns_base(
35
+ self, method_name, *args, track=True, track_obj=None, id=None, **kwargs
36
+ ):
37
+ """Execute seaborn plot method with tracking support."""
38
+ sns_method_name = method_name.split("sns_")[-1]
39
+
40
+ with self._no_tracking():
41
+ sns_plot_fn = getattr(sns, sns_method_name)
42
+
43
+ if kwargs.get("hue_colors"):
44
+ kwargs = scitex.gen.alternate_kwarg(
45
+ kwargs, primary_key="palette", alternate_key="hue_colors"
46
+ )
47
+
48
+ import warnings
49
+ from scitex import logging
50
+
51
+ mpl_logger = logging.getLogger("matplotlib")
52
+ original_level = mpl_logger.level
53
+ mpl_logger.setLevel(logging.WARNING)
54
+
55
+ try:
56
+ with warnings.catch_warnings():
57
+ warnings.filterwarnings(
58
+ "ignore",
59
+ message=".*categorical units.*parsable as floats or dates.*",
60
+ category=UserWarning,
61
+ )
62
+ warnings.filterwarnings(
63
+ "ignore",
64
+ message=".*Using categorical units.*",
65
+ module="matplotlib.*",
66
+ )
67
+ warnings.simplefilter("ignore", UserWarning)
68
+
69
+ self._axis_mpl = sns_plot_fn(ax=self._axis_mpl, *args, **kwargs)
70
+ finally:
71
+ mpl_logger.setLevel(original_level)
72
+
73
+ # Post-processing for histplot with kde=True
74
+ if sns_method_name == "histplot" and kwargs.get("kde", False):
75
+ from scitex.plt.utils import mm_to_pt
76
+ kde_lw = mm_to_pt(0.2)
77
+ for line in self._axis_mpl.get_lines():
78
+ line.set_linewidth(kde_lw)
79
+ line.set_color("black")
80
+ line.set_linestyle("--")
81
+
82
+ # Post-processing for histplot alpha
83
+ if sns_method_name == "histplot" and "alpha" not in kwargs:
84
+ for patch in self._axis_mpl.patches:
85
+ patch.set_alpha(1.0)
86
+
87
+ track_obj = track_obj if track_obj is not None else args
88
+ tracked_dict = {
89
+ "data": track_obj,
90
+ "args": args,
91
+ }
92
+ self._track(track, id, method_name, tracked_dict, kwargs)
93
+
94
+ def _sns_base_xyhue(self, method_name, *args, track=True, id=None, **kwargs):
95
+ """Execute seaborn plot with x/y/hue data preparation."""
96
+ df = kwargs.get("data")
97
+ x, y, hue = kwargs.get("x"), kwargs.get("y"), kwargs.get("hue")
98
+
99
+ track_obj = self._sns_prepare_xyhue(df, x, y, hue) if df is not None else None
100
+ self._sns_base(
101
+ method_name,
102
+ *args,
103
+ track=track,
104
+ track_obj=track_obj,
105
+ id=id,
106
+ **kwargs,
107
+ )
108
+
109
+ def _sns_prepare_xyhue(self, data=None, x=None, y=None, hue=None, **kwargs):
110
+ """Prepare data for tracking based on x/y/hue configuration."""
111
+ data = data.reset_index()
112
+
113
+ if hue is not None:
114
+ if x is None and y is None:
115
+ return data
116
+ elif x is None:
117
+ agg_dict = {}
118
+ for hh in data[hue].unique():
119
+ agg_dict[hh] = data.loc[data[hue] == hh, y]
120
+ df = scitex.pd.force_df(agg_dict)
121
+ return df
122
+ elif y is None:
123
+ df = pd.concat(
124
+ [data.loc[data[hue] == hh, x] for hh in data[hue].unique()],
125
+ axis=1,
126
+ )
127
+ return df
128
+ else:
129
+ pivoted_data = data.pivot_table(
130
+ values=y,
131
+ index=data.index,
132
+ columns=[x, hue],
133
+ aggfunc="first",
134
+ )
135
+ pivoted_data.columns = [
136
+ f"{col[0]}-{col[1]}" for col in pivoted_data.columns
137
+ ]
138
+ return pivoted_data
139
+ else:
140
+ if x is None and y is None:
141
+ return data
142
+ elif x is None:
143
+ return data[[y]]
144
+ elif y is None:
145
+ return data[[x]]
146
+ else:
147
+ return data.pivot_table(
148
+ values=y, index=data.index, columns=x, aggfunc="first"
149
+ )
150
+
151
+
152
+ # EOF