scitex 2.7.0__py3-none-any.whl → 2.8.1__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 (355) 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/diagram/README.md +197 -0
  79. scitex/diagram/__init__.py +48 -0
  80. scitex/diagram/_compile.py +312 -0
  81. scitex/diagram/_diagram.py +355 -0
  82. scitex/diagram/_presets.py +173 -0
  83. scitex/diagram/_schema.py +182 -0
  84. scitex/diagram/_split.py +278 -0
  85. scitex/fig/__init__.py +352 -0
  86. scitex/{vis → fig}/backend/_parser.py +1 -1
  87. scitex/{vis → fig}/canvas.py +1 -1
  88. scitex/{vis → fig}/editor/__init__.py +5 -2
  89. scitex/{vis → fig}/editor/_dearpygui_editor.py +1 -1
  90. scitex/{vis → fig}/editor/_defaults.py +70 -5
  91. scitex/{vis → fig}/editor/_mpl_editor.py +1 -1
  92. scitex/{vis → fig}/editor/_qt_editor.py +182 -2
  93. scitex/{vis → fig}/editor/_tkinter_editor.py +1 -1
  94. scitex/fig/editor/edit/__init__.py +50 -0
  95. scitex/fig/editor/edit/backend_detector.py +109 -0
  96. scitex/fig/editor/edit/bundle_resolver.py +240 -0
  97. scitex/fig/editor/edit/editor_launcher.py +239 -0
  98. scitex/fig/editor/edit/manual_handler.py +53 -0
  99. scitex/fig/editor/edit/panel_loader.py +232 -0
  100. scitex/fig/editor/edit/path_resolver.py +67 -0
  101. scitex/fig/editor/flask_editor/_bbox.py +1299 -0
  102. scitex/fig/editor/flask_editor/_core.py +1429 -0
  103. scitex/{vis → fig}/editor/flask_editor/_plotter.py +38 -4
  104. scitex/fig/editor/flask_editor/_renderer.py +813 -0
  105. scitex/fig/editor/flask_editor/static/css/base/reset.css +41 -0
  106. scitex/fig/editor/flask_editor/static/css/base/typography.css +16 -0
  107. scitex/fig/editor/flask_editor/static/css/base/variables.css +85 -0
  108. scitex/fig/editor/flask_editor/static/css/components/buttons.css +217 -0
  109. scitex/fig/editor/flask_editor/static/css/components/context-menu.css +93 -0
  110. scitex/fig/editor/flask_editor/static/css/components/dropdown.css +57 -0
  111. scitex/fig/editor/flask_editor/static/css/components/forms.css +112 -0
  112. scitex/fig/editor/flask_editor/static/css/components/modal.css +59 -0
  113. scitex/fig/editor/flask_editor/static/css/components/sections.css +212 -0
  114. scitex/fig/editor/flask_editor/static/css/features/canvas.css +176 -0
  115. scitex/fig/editor/flask_editor/static/css/features/element-inspector.css +190 -0
  116. scitex/fig/editor/flask_editor/static/css/features/loading.css +59 -0
  117. scitex/fig/editor/flask_editor/static/css/features/overlay.css +45 -0
  118. scitex/fig/editor/flask_editor/static/css/features/panel-grid.css +95 -0
  119. scitex/fig/editor/flask_editor/static/css/features/selection.css +101 -0
  120. scitex/fig/editor/flask_editor/static/css/features/statistics.css +138 -0
  121. scitex/fig/editor/flask_editor/static/css/index.css +31 -0
  122. scitex/fig/editor/flask_editor/static/css/layout/container.css +7 -0
  123. scitex/fig/editor/flask_editor/static/css/layout/controls.css +56 -0
  124. scitex/fig/editor/flask_editor/static/css/layout/preview.css +78 -0
  125. scitex/fig/editor/flask_editor/static/js/alignment/axis.js +314 -0
  126. scitex/fig/editor/flask_editor/static/js/alignment/basic.js +107 -0
  127. scitex/fig/editor/flask_editor/static/js/alignment/distribute.js +54 -0
  128. scitex/fig/editor/flask_editor/static/js/canvas/canvas.js +172 -0
  129. scitex/fig/editor/flask_editor/static/js/canvas/dragging.js +258 -0
  130. scitex/fig/editor/flask_editor/static/js/canvas/resize.js +48 -0
  131. scitex/fig/editor/flask_editor/static/js/canvas/selection.js +71 -0
  132. scitex/fig/editor/flask_editor/static/js/core/api.js +288 -0
  133. scitex/fig/editor/flask_editor/static/js/core/state.js +143 -0
  134. scitex/fig/editor/flask_editor/static/js/core/utils.js +245 -0
  135. scitex/fig/editor/flask_editor/static/js/dev/element-inspector.js +992 -0
  136. scitex/fig/editor/flask_editor/static/js/editor/bbox.js +339 -0
  137. scitex/fig/editor/flask_editor/static/js/editor/element-drag.js +286 -0
  138. scitex/fig/editor/flask_editor/static/js/editor/overlay.js +371 -0
  139. scitex/fig/editor/flask_editor/static/js/editor/preview.js +293 -0
  140. scitex/fig/editor/flask_editor/static/js/main.js +426 -0
  141. scitex/fig/editor/flask_editor/static/js/shortcuts/context-menu.js +152 -0
  142. scitex/fig/editor/flask_editor/static/js/shortcuts/keyboard.js +265 -0
  143. scitex/fig/editor/flask_editor/static/js/ui/controls.js +184 -0
  144. scitex/fig/editor/flask_editor/static/js/ui/download.js +57 -0
  145. scitex/fig/editor/flask_editor/static/js/ui/help.js +100 -0
  146. scitex/fig/editor/flask_editor/static/js/ui/theme.js +34 -0
  147. scitex/fig/editor/flask_editor/templates/__init__.py +123 -0
  148. scitex/fig/editor/flask_editor/templates/_html.py +852 -0
  149. scitex/fig/editor/flask_editor/templates/_scripts.py +4933 -0
  150. scitex/fig/editor/flask_editor/templates/_styles.py +1658 -0
  151. scitex/{vis → fig}/io/__init__.py +13 -1
  152. scitex/fig/io/_bundle.py +1058 -0
  153. scitex/{vis → fig}/io/_canvas.py +1 -1
  154. scitex/{vis → fig}/io/_data.py +1 -1
  155. scitex/{vis → fig}/io/_export.py +1 -1
  156. scitex/{vis → fig}/io/_load.py +1 -1
  157. scitex/{vis → fig}/io/_panel.py +1 -1
  158. scitex/{vis → fig}/io/_save.py +1 -1
  159. scitex/{vis → fig}/model/__init__.py +1 -1
  160. scitex/{vis → fig}/model/_annotations.py +1 -1
  161. scitex/{vis → fig}/model/_axes.py +1 -1
  162. scitex/{vis → fig}/model/_figure.py +1 -1
  163. scitex/{vis → fig}/model/_guides.py +1 -1
  164. scitex/{vis → fig}/model/_plot.py +1 -1
  165. scitex/{vis → fig}/model/_styles.py +1 -1
  166. scitex/{vis → fig}/utils/__init__.py +1 -1
  167. scitex/io/__init__.py +22 -26
  168. scitex/io/_bundle.py +493 -0
  169. scitex/io/_flush.py +5 -2
  170. scitex/io/_load.py +98 -0
  171. scitex/io/_load_modules/_H5Explorer.py +5 -2
  172. scitex/io/_load_modules/_canvas.py +2 -2
  173. scitex/io/_load_modules/_image.py +3 -4
  174. scitex/io/_load_modules/_txt.py +4 -2
  175. scitex/io/_metadata.py +34 -324
  176. scitex/io/_metadata_modules/__init__.py +46 -0
  177. scitex/io/_metadata_modules/_embed.py +70 -0
  178. scitex/io/_metadata_modules/_read.py +64 -0
  179. scitex/io/_metadata_modules/_utils.py +79 -0
  180. scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
  181. scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
  182. scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
  183. scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
  184. scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
  185. scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
  186. scitex/io/_metadata_modules/read_metadata_png.py +39 -0
  187. scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
  188. scitex/io/_qr_utils.py +5 -3
  189. scitex/io/_save.py +548 -30
  190. scitex/io/_save_modules/_canvas.py +3 -3
  191. scitex/io/_save_modules/_image.py +5 -9
  192. scitex/io/_save_modules/_tex.py +7 -4
  193. scitex/io/_zip_bundle.py +439 -0
  194. scitex/io/utils/h5_to_zarr.py +11 -9
  195. scitex/msword/__init__.py +255 -0
  196. scitex/msword/profiles.py +357 -0
  197. scitex/msword/reader.py +753 -0
  198. scitex/msword/utils.py +289 -0
  199. scitex/msword/writer.py +362 -0
  200. scitex/plt/__init__.py +5 -2
  201. scitex/plt/_subplots/_AxesWrapper.py +6 -6
  202. scitex/plt/_subplots/_AxisWrapper.py +15 -9
  203. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
  204. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
  205. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
  206. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
  207. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
  208. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
  209. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
  210. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
  211. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
  212. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
  213. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
  214. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
  215. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
  216. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
  217. scitex/plt/_subplots/_FigWrapper.py +6 -6
  218. scitex/plt/_subplots/_SubplotsWrapper.py +28 -18
  219. scitex/plt/_subplots/_export_as_csv.py +35 -5
  220. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +8 -0
  221. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +10 -21
  222. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +18 -7
  223. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +28 -12
  224. scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +10 -4
  225. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +13 -1
  226. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +12 -2
  227. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +10 -3
  228. scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +10 -4
  229. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +18 -3
  230. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +44 -36
  231. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +14 -2
  232. scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +11 -5
  233. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
  234. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
  235. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +14 -3
  236. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
  237. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +14 -2
  238. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
  239. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +16 -6
  240. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +29 -19
  241. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
  242. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +22 -5
  243. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +18 -14
  244. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +18 -14
  245. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +18 -14
  246. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +10 -2
  247. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
  248. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +18 -9
  249. scitex/plt/ax/_plot/_stx_ecdf.py +4 -2
  250. scitex/plt/gallery/_generate.py +421 -14
  251. scitex/plt/io/__init__.py +53 -0
  252. scitex/plt/io/_bundle.py +490 -0
  253. scitex/plt/io/_layered_bundle.py +1343 -0
  254. scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
  255. scitex/plt/styles/__init__.py +14 -0
  256. scitex/plt/styles/presets.py +78 -0
  257. scitex/plt/utils/__init__.py +13 -1
  258. scitex/plt/utils/_collect_figure_metadata.py +10 -14
  259. scitex/plt/utils/_configure_mpl.py +6 -18
  260. scitex/plt/utils/_crop.py +32 -14
  261. scitex/plt/utils/_csv_column_naming.py +54 -0
  262. scitex/plt/utils/_figure_mm.py +116 -1
  263. scitex/plt/utils/_hitmap.py +1643 -0
  264. scitex/plt/utils/metadata/__init__.py +25 -0
  265. scitex/plt/utils/metadata/_core.py +9 -10
  266. scitex/plt/utils/metadata/_dimensions.py +6 -3
  267. scitex/plt/utils/metadata/_editable_export.py +405 -0
  268. scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
  269. scitex/schema/__init__.py +109 -16
  270. scitex/schema/_canvas.py +1 -1
  271. scitex/schema/_plot.py +1015 -0
  272. scitex/schema/_stats.py +2 -2
  273. scitex/stats/__init__.py +117 -0
  274. scitex/stats/io/__init__.py +29 -0
  275. scitex/stats/io/_bundle.py +156 -0
  276. scitex/tex/__init__.py +4 -0
  277. scitex/tex/_export.py +890 -0
  278. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/METADATA +11 -1
  279. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/RECORD +294 -170
  280. scitex/io/memo.md +0 -2827
  281. scitex/plt/REQUESTS.md +0 -191
  282. scitex/plt/_subplots/TODO.md +0 -53
  283. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -559
  284. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1609
  285. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -447
  286. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_between.json +0 -110
  287. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_betweenx.json +0 -88
  288. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fill_between.json +0 -103
  289. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fillv.json +0 -106
  290. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/bar.json +0 -92
  291. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/barh.json +0 -92
  292. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/boxplot.json +0 -92
  293. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_bar.json +0 -84
  294. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_barh.json +0 -84
  295. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_box.json +0 -83
  296. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_boxplot.json +0 -93
  297. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violin.json +0 -91
  298. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violinplot.json +0 -91
  299. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/violinplot.json +0 -91
  300. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contour.json +0 -97
  301. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contourf.json +0 -98
  302. scitex/plt/templates/research-master/scitex/vis/gallery/contour/stx_contour.json +0 -84
  303. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist.json +0 -101
  304. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist2d.json +0 -96
  305. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_ecdf.json +0 -95
  306. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_joyplot.json +0 -95
  307. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_kde.json +0 -93
  308. scitex/plt/templates/research-master/scitex/vis/gallery/grid/imshow.json +0 -95
  309. scitex/plt/templates/research-master/scitex/vis/gallery/grid/matshow.json +0 -95
  310. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_conf_mat.json +0 -83
  311. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_heatmap.json +0 -92
  312. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_image.json +0 -121
  313. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_imshow.json +0 -84
  314. scitex/plt/templates/research-master/scitex/vis/gallery/line/plot.json +0 -110
  315. scitex/plt/templates/research-master/scitex/vis/gallery/line/step.json +0 -92
  316. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_line.json +0 -95
  317. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_shaded_line.json +0 -96
  318. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/hexbin.json +0 -95
  319. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/scatter.json +0 -95
  320. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stem.json +0 -92
  321. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stx_scatter.json +0 -84
  322. scitex/plt/templates/research-master/scitex/vis/gallery/special/pie.json +0 -94
  323. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_raster.json +0 -109
  324. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_rectangle.json +0 -108
  325. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/errorbar.json +0 -93
  326. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_errorbar.json +0 -84
  327. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_ci.json +0 -96
  328. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_std.json +0 -96
  329. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_median_iqr.json +0 -96
  330. scitex/plt/templates/research-master/scitex/vis/gallery/vector/quiver.json +0 -99
  331. scitex/plt/templates/research-master/scitex/vis/gallery/vector/streamplot.json +0 -100
  332. scitex/vis/__init__.py +0 -177
  333. scitex/vis/editor/_edit.py +0 -390
  334. scitex/vis/editor/flask_editor/_bbox.py +0 -529
  335. scitex/vis/editor/flask_editor/_core.py +0 -168
  336. scitex/vis/editor/flask_editor/_renderer.py +0 -393
  337. scitex/vis/editor/flask_editor/templates/__init__.py +0 -33
  338. scitex/vis/editor/flask_editor/templates/_html.py +0 -513
  339. scitex/vis/editor/flask_editor/templates/_scripts.py +0 -1261
  340. scitex/vis/editor/flask_editor/templates/_styles.py +0 -739
  341. /scitex/{vis → fig}/README.md +0 -0
  342. /scitex/{vis → fig}/backend/__init__.py +0 -0
  343. /scitex/{vis → fig}/backend/_export.py +0 -0
  344. /scitex/{vis → fig}/backend/_render.py +0 -0
  345. /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
  346. /scitex/{vis → fig}/editor/_flask_editor.py +0 -0
  347. /scitex/{vis → fig}/editor/flask_editor/__init__.py +0 -0
  348. /scitex/{vis → fig}/editor/flask_editor/_utils.py +0 -0
  349. /scitex/{vis → fig}/io/_directory.py +0 -0
  350. /scitex/{vis → fig}/model/_plot_types.py +0 -0
  351. /scitex/{vis → fig}/utils/_defaults.py +0 -0
  352. /scitex/{vis → fig}/utils/_validate.py +0 -0
  353. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/WHEEL +0 -0
  354. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/entry_points.txt +0 -0
  355. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,559 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Timestamp: "2025-06-07 15:49:20 (ywatanabe)"
4
- # File: /ssh:ywatanabe@sp:/home/ywatanabe/proj/.claude-worktree/scitex_repo/src/scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py
5
- # ----------------------------------------
6
- import os
7
-
8
- __FILE__ = __file__
9
- __DIR__ = os.path.dirname(__FILE__)
10
- # ----------------------------------------
11
-
12
- from typing import List, Optional, Union
13
-
14
- from ....plt import ax as ax_module
15
-
16
-
17
- class AdjustmentMixin:
18
- """Mixin class for matplotlib axis adjustments."""
19
-
20
- def rotate_labels(
21
- self,
22
- x: float = None,
23
- y: float = None,
24
- x_ha: str = None,
25
- y_ha: str = None,
26
- x_va: str = None,
27
- y_va: str = None,
28
- auto_adjust: bool = True,
29
- scientific_convention: bool = True,
30
- tight_layout: bool = False,
31
- ) -> None:
32
- """Rotate x and y axis labels with automatic positioning.
33
-
34
- Parameters
35
- ----------
36
- x : float or None, optional
37
- Rotation angle for x-axis labels in degrees.
38
- If None or 0, x-axis labels are not rotated. Default is None.
39
- y : float or None, optional
40
- Rotation angle for y-axis labels in degrees.
41
- If None or 0, y-axis labels are not rotated. Default is None.
42
- x_ha : str or None, optional
43
- Horizontal alignment for x-axis labels. If None, automatically determined.
44
- y_ha : str or None, optional
45
- Horizontal alignment for y-axis labels. If None, automatically determined.
46
- x_va : str or None, optional
47
- Vertical alignment for x-axis labels. If None, automatically determined.
48
- y_va : str or None, optional
49
- Vertical alignment for y-axis labels. If None, automatically determined.
50
- auto_adjust : bool, optional
51
- Whether to automatically adjust alignment. Default is True.
52
- scientific_convention : bool, optional
53
- Whether to follow scientific conventions. Default is True.
54
- tight_layout : bool, optional
55
- Whether to apply tight_layout to prevent overlapping. Default is False.
56
- """
57
- self._axis_mpl = ax_module.rotate_labels(
58
- self._axis_mpl,
59
- x=x,
60
- y=y,
61
- x_ha=x_ha,
62
- y_ha=y_ha,
63
- x_va=x_va,
64
- y_va=y_va,
65
- auto_adjust=auto_adjust,
66
- scientific_convention=scientific_convention,
67
- tight_layout=tight_layout,
68
- )
69
-
70
- def legend(
71
- self, *args, loc: str = "best", check_overlap: bool = False, **kwargs
72
- ) -> None:
73
- """Places legend at specified location, with support for outside positions.
74
-
75
- Parameters
76
- ----------
77
- *args : tuple
78
- Positional arguments (handles, labels) as in matplotlib
79
- loc : str
80
- Legend position. Default is "best" (matplotlib auto-placement).
81
- Standard matplotlib positions plus:
82
- - "best": Matplotlib automatic placement (default)
83
- - "outer": Automatically place legend outside plot area (right side)
84
- - "separate": Save legend as a separate figure file
85
- - upper/lower/center variants: e.g. "upper right out", "lower left out"
86
- - directional shortcuts: "right", "left", "upper", "lower"
87
- - center variants: "center right out", "center left out"
88
- - alternative formats: "right upper out", "left lower out" etc.
89
- check_overlap : bool
90
- If True, checks for overlap between legend and data after placement.
91
- Issues warning with suggestion if significant overlap detected.
92
- **kwargs : dict
93
- Additional keyword arguments passed to legend()
94
- For "separate": can include 'filename' (default: 'legend.png')
95
- """
96
- import matplotlib.pyplot as plt
97
-
98
- # Handle special cases
99
- if loc == "outer":
100
- # Place legend outside on the right, adjusting figure to make room
101
- legend = self._axis_mpl.legend(
102
- *args, loc="center left", bbox_to_anchor=(1.02, 0.5), **kwargs
103
- )
104
- # Adjust figure to prevent legend cutoff
105
- if hasattr(self, "_figure_wrapper") and self._figure_wrapper:
106
- self._figure_wrapper._fig_mpl.tight_layout()
107
- self._figure_wrapper._fig_mpl.subplots_adjust(right=0.85)
108
- return legend
109
-
110
- elif loc == "separate":
111
- # Set flag to save legend separately when figure is saved
112
- import warnings
113
-
114
- handles, labels = self._axis_mpl.get_legend_handles_labels()
115
- if not handles:
116
- warnings.warn(
117
- "No legend handles found. Create plots with labels first."
118
- )
119
- return None
120
-
121
- # Store legend params for later use during save
122
- fig = self._axis_mpl.get_figure()
123
- if not hasattr(fig, "_separate_legend_params"):
124
- fig._separate_legend_params = []
125
-
126
- # Extract separate-specific kwargs
127
- figsize = kwargs.pop("figsize", (4, 3))
128
- dpi = kwargs.pop("dpi", 150)
129
- frameon = kwargs.pop("frameon", True)
130
- fancybox = kwargs.pop("fancybox", True)
131
- shadow = kwargs.pop("shadow", True)
132
-
133
- # Store parameters for this axes
134
- # Include axis index or name for unique filenames
135
- axis_id = None
136
-
137
- # Try to find axis index in parent figure
138
- try:
139
- fig_axes = fig.get_axes()
140
- for idx, ax in enumerate(fig_axes):
141
- if ax is self._axis_mpl:
142
- axis_id = f"ax_{idx:02d}"
143
- break
144
- except:
145
- pass
146
-
147
- # If not found, try subplot spec
148
- if axis_id is None and hasattr(self._axis_mpl, "get_subplotspec"):
149
- try:
150
- spec = self._axis_mpl.get_subplotspec()
151
- if spec is not None:
152
- # Get grid shape and position
153
- gridspec = spec.get_gridspec()
154
- nrows, ncols = gridspec.get_geometry()
155
- rowspan = spec.rowspan
156
- colspan = spec.colspan
157
- # Calculate flat index from row/col position
158
- row_start = (
159
- rowspan.start if hasattr(rowspan, "start") else rowspan
160
- )
161
- col_start = (
162
- colspan.start if hasattr(colspan, "start") else colspan
163
- )
164
- flat_idx = row_start * ncols + col_start
165
- axis_id = f"ax_{flat_idx:02d}"
166
- except:
167
- pass
168
-
169
- # Fallback to sequential numbering
170
- if axis_id is None:
171
- axis_id = f"ax_{len(fig._separate_legend_params):02d}"
172
-
173
- fig._separate_legend_params.append(
174
- {
175
- "axis": self._axis_mpl,
176
- "axis_id": axis_id,
177
- "handles": handles,
178
- "labels": labels,
179
- "figsize": figsize,
180
- "dpi": dpi,
181
- "frameon": frameon,
182
- "fancybox": fancybox,
183
- "shadow": shadow,
184
- "kwargs": kwargs,
185
- }
186
- )
187
-
188
- # Remove legend from main figure immediately
189
- if self._axis_mpl.get_legend():
190
- self._axis_mpl.get_legend().remove()
191
-
192
- return None
193
-
194
- # Original outside positions
195
- outside_positions = {
196
- # Upper right variants
197
- "upper right out": ("center left", (1.15, 0.85)),
198
- "right upper out": ("center left", (1.15, 0.85)),
199
- # Center right variants
200
- "center right out": ("center left", (1.15, 0.5)),
201
- "right out": ("center left", (1.15, 0.5)),
202
- "right": ("center left", (1.05, 0.5)),
203
- # Lower right variants
204
- "lower right out": ("center left", (1.15, 0.15)),
205
- "right lower out": ("center left", (1.15, 0.15)),
206
- # Upper left variants
207
- "upper left out": ("center right", (-0.25, 0.85)),
208
- "left upper out": ("center right", (-0.25, 0.85)),
209
- # Center left variants
210
- "center left out": ("center right", (-0.25, 0.5)),
211
- "left out": ("center right", (-0.25, 0.5)),
212
- "left": ("center right", (-0.15, 0.5)),
213
- # Lower left variants
214
- "lower left out": ("center right", (-0.25, 0.15)),
215
- "left lower out": ("center right", (-0.25, 0.15)),
216
- # Upper center variants
217
- "upper center out": ("lower center", (0.5, 1.25)),
218
- "upper out": ("lower center", (0.5, 1.25)),
219
- # Lower center variants
220
- "lower center out": ("upper center", (0.5, -0.25)),
221
- "lower out": ("upper center", (0.5, -0.25)),
222
- }
223
-
224
- # Place the legend
225
- if loc in outside_positions:
226
- location, bbox = outside_positions[loc]
227
- legend_obj = self._axis_mpl.legend(
228
- *args, loc=location, bbox_to_anchor=bbox, **kwargs
229
- )
230
- else:
231
- legend_obj = self._axis_mpl.legend(*args, loc=loc, **kwargs)
232
-
233
- # Check for overlap if requested
234
- if check_overlap and legend_obj is not None:
235
- self._check_legend_overlap(legend_obj)
236
-
237
- return legend_obj
238
-
239
- def _check_legend_overlap(self, legend_obj):
240
- """Check if legend overlaps with plotted data and issue warning if needed.
241
-
242
- Parameters
243
- ----------
244
- legend_obj : matplotlib.legend.Legend
245
- The legend object to check for overlap
246
- """
247
- import warnings
248
- import matplotlib.transforms as transforms
249
-
250
- try:
251
- # Get the legend's bounding box in display coordinates
252
- fig = self._axis_mpl.get_figure()
253
- fig.canvas.draw() # Force draw to get accurate bounding boxes
254
-
255
- legend_bbox = legend_obj.get_window_extent(fig.canvas.get_renderer())
256
-
257
- # Convert to axis coordinates for easier comparison
258
- inv_transform = self._axis_mpl.transData.inverted()
259
- legend_bbox_data = legend_bbox.transformed(inv_transform)
260
-
261
- # Get data bounding boxes for all artists (lines, scatter, etc.)
262
- data_bboxes = []
263
-
264
- for line in self._axis_mpl.get_lines():
265
- if line.get_visible():
266
- try:
267
- data = line.get_xydata()
268
- if len(data) > 0:
269
- data_bboxes.append(data)
270
- except:
271
- pass
272
-
273
- for collection in self._axis_mpl.collections:
274
- if collection.get_visible():
275
- try:
276
- offsets = collection.get_offsets()
277
- if len(offsets) > 0:
278
- data_bboxes.append(offsets)
279
- except:
280
- pass
281
-
282
- # Check for overlap
283
- if data_bboxes:
284
- import numpy as np
285
-
286
- all_data = np.vstack(data_bboxes)
287
-
288
- # Count how many data points fall within legend bbox
289
- x_overlap = (all_data[:, 0] >= legend_bbox_data.x0) & (
290
- all_data[:, 0] <= legend_bbox_data.x1
291
- )
292
- y_overlap = (all_data[:, 1] >= legend_bbox_data.y0) & (
293
- all_data[:, 1] <= legend_bbox_data.y1
294
- )
295
- overlap_points = np.sum(x_overlap & y_overlap)
296
-
297
- # Calculate overlap percentage
298
- overlap_pct = (overlap_points / len(all_data)) * 100
299
-
300
- # Warn if significant overlap (>5% of data points)
301
- if overlap_pct > 5:
302
- warnings.warn(
303
- f"Legend overlaps with {overlap_pct:.1f}% of data points. "
304
- f"Consider using:\n"
305
- f" - ax.legend(loc='outer') # Place outside plot area\n"
306
- f" - ax.legend(loc='separate') # Save as separate file\n"
307
- f" - Manually adjust with loc='upper left', 'lower right', etc.",
308
- UserWarning,
309
- stacklevel=3,
310
- )
311
- return True # Overlap detected
312
-
313
- except Exception as e:
314
- # Silently fail if overlap detection doesn't work
315
- # (Some plot types may not support this)
316
- pass
317
-
318
- return False # No significant overlap
319
-
320
- def set_xyt(
321
- self,
322
- x: Optional[str] = None,
323
- y: Optional[str] = None,
324
- t: Optional[str] = None,
325
- format_labels: bool = True,
326
- ) -> None:
327
- self._axis_mpl = ax_module.set_xyt(
328
- self._axis_mpl,
329
- x=x,
330
- y=y,
331
- t=t,
332
- format_labels=format_labels,
333
- )
334
-
335
- def set_xytc(
336
- self,
337
- x: Optional[str] = None,
338
- y: Optional[str] = None,
339
- t: Optional[str] = None,
340
- c: Optional[str] = None,
341
- format_labels: bool = True,
342
- ) -> None:
343
- """Set xlabel, ylabel, title, and caption for automatic saving.
344
-
345
- Parameters
346
- ----------
347
- x : str, optional
348
- X-axis label
349
- y : str, optional
350
- Y-axis label
351
- t : str, optional
352
- Title
353
- c : str, optional
354
- Caption to be saved automatically with scitex.io.save()
355
- format_labels : bool, optional
356
- Whether to apply automatic formatting, by default True
357
- """
358
- self._axis_mpl = ax_module.set_xytc(
359
- self._axis_mpl,
360
- x=x,
361
- y=y,
362
- t=t,
363
- c=c,
364
- format_labels=format_labels,
365
- )
366
-
367
- # Store caption in this wrapper for easy access
368
- if c is not False and c is not None:
369
- self._scitex_caption = c
370
-
371
- def set_supxyt(
372
- self,
373
- xlabel: Optional[str] = None,
374
- ylabel: Optional[str] = None,
375
- title: Optional[str] = None,
376
- format_labels: bool = True,
377
- ) -> None:
378
- self._axis_mpl = ax_module.set_supxyt(
379
- self._axis_mpl,
380
- xlabel=xlabel,
381
- ylabel=ylabel,
382
- title=title,
383
- format_labels=format_labels,
384
- )
385
-
386
- def set_supxytc(
387
- self,
388
- xlabel: Optional[str] = None,
389
- ylabel: Optional[str] = None,
390
- title: Optional[str] = None,
391
- caption: Optional[str] = None,
392
- format_labels: bool = True,
393
- ) -> None:
394
- """Set figure-level xlabel, ylabel, title, and caption for automatic saving.
395
-
396
- Parameters
397
- ----------
398
- xlabel : str, optional
399
- Figure-level X-axis label
400
- ylabel : str, optional
401
- Figure-level Y-axis label
402
- title : str, optional
403
- Figure-level title (suptitle)
404
- caption : str, optional
405
- Figure-level caption to be saved automatically with scitex.io.save()
406
- format_labels : bool, optional
407
- Whether to apply automatic formatting, by default True
408
- """
409
- self._axis_mpl = ax_module.set_supxytc(
410
- self._axis_mpl,
411
- xlabel=xlabel,
412
- ylabel=ylabel,
413
- title=title,
414
- caption=caption,
415
- format_labels=format_labels,
416
- )
417
-
418
- # Store figure-level caption for easy access
419
- if caption is not False and caption is not None:
420
- fig = self._axis_mpl.get_figure()
421
- fig._scitex_main_caption = caption
422
-
423
- def set_meta(
424
- self,
425
- caption=None,
426
- methods=None,
427
- stats=None,
428
- keywords=None,
429
- experimental_details=None,
430
- journal_style=None,
431
- significance=None,
432
- **kwargs,
433
- ) -> None:
434
- """Set comprehensive scientific metadata with YAML export capability.
435
-
436
- Parameters
437
- ----------
438
- caption : str, optional
439
- Figure caption text
440
- methods : str, optional
441
- Experimental methods description
442
- stats : str, optional
443
- Statistical analysis details
444
- keywords : List[str], optional
445
- Keywords for categorization
446
- experimental_details : Dict[str, Any], optional
447
- Structured experimental parameters
448
- journal_style : str, optional
449
- Target journal style
450
- significance : str, optional
451
- Significance statement
452
- **kwargs : additional metadata
453
- Any additional metadata fields
454
- """
455
- self._axis_mpl = ax_module.set_meta(
456
- self._axis_mpl,
457
- caption=caption,
458
- methods=methods,
459
- stats=stats,
460
- keywords=keywords,
461
- experimental_details=experimental_details,
462
- journal_style=journal_style,
463
- significance=significance,
464
- **kwargs,
465
- )
466
-
467
- def set_figure_meta(
468
- self,
469
- caption=None,
470
- methods=None,
471
- stats=None,
472
- significance=None,
473
- funding=None,
474
- conflicts=None,
475
- data_availability=None,
476
- **kwargs,
477
- ) -> None:
478
- """Set figure-level metadata for multi-panel figures.
479
-
480
- Parameters
481
- ----------
482
- caption : str, optional
483
- Figure-level caption
484
- methods : str, optional
485
- Overall experimental methods
486
- stats : str, optional
487
- Overall statistical approach
488
- significance : str, optional
489
- Significance and implications
490
- funding : str, optional
491
- Funding acknowledgments
492
- conflicts : str, optional
493
- Conflict of interest statement
494
- data_availability : str, optional
495
- Data availability statement
496
- **kwargs : additional metadata
497
- Any additional figure-level metadata
498
- """
499
- self._axis_mpl = ax_module.set_figure_meta(
500
- self._axis_mpl,
501
- caption=caption,
502
- methods=methods,
503
- stats=stats,
504
- significance=significance,
505
- funding=funding,
506
- conflicts=conflicts,
507
- data_availability=data_availability,
508
- **kwargs,
509
- )
510
-
511
- def set_ticks(
512
- self,
513
- xvals: Optional[List[Union[int, float]]] = None,
514
- xticks: Optional[List[str]] = None,
515
- yvals: Optional[List[Union[int, float]]] = None,
516
- yticks: Optional[List[str]] = None,
517
- ) -> None:
518
- self._axis_mpl = ax_module.set_ticks(
519
- self._axis_mpl,
520
- xvals=xvals,
521
- xticks=xticks,
522
- yvals=yvals,
523
- yticks=yticks,
524
- )
525
-
526
- def set_n_ticks(self, n_xticks: int = 4, n_yticks: int = 4) -> None:
527
- self._axis_mpl = ax_module.set_n_ticks(
528
- self._axis_mpl, n_xticks=n_xticks, n_yticks=n_yticks
529
- )
530
-
531
- def hide_spines(
532
- self,
533
- top: bool = True,
534
- bottom: bool = False,
535
- left: bool = False,
536
- right: bool = True,
537
- ticks: bool = False,
538
- labels: bool = False,
539
- ) -> None:
540
- self._axis_mpl = ax_module.hide_spines(
541
- self._axis_mpl,
542
- top=top,
543
- bottom=bottom,
544
- left=left,
545
- right=right,
546
- ticks=ticks,
547
- labels=labels,
548
- )
549
-
550
- def extend(self, x_ratio: float = 1.0, y_ratio: float = 1.0) -> None:
551
- self._axis_mpl = ax_module.extend(
552
- self._axis_mpl, x_ratio=x_ratio, y_ratio=y_ratio
553
- )
554
-
555
- def shift(self, dx: float = 0, dy: float = 0) -> None:
556
- self._axis_mpl = ax_module.shift(self._axis_mpl, dx=dx, dy=dy)
557
-
558
-
559
- # EOF