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
@@ -12,6 +12,9 @@ __DIR__ = os.path.dirname(__FILE__)
12
12
  import numpy as np
13
13
  import pandas as pd
14
14
 
15
+ from scitex.plt.utils._csv_column_naming import get_csv_column_name
16
+ from ._format_plot import _parse_tracking_id
17
+
15
18
 
16
19
  def _format_sns_jointplot(id, tracked_dict, kwargs):
17
20
  """Format data from a sns_jointplot call."""
@@ -19,6 +22,9 @@ def _format_sns_jointplot(id, tracked_dict, kwargs):
19
22
  if not tracked_dict or not isinstance(tracked_dict, dict):
20
23
  return pd.DataFrame()
21
24
 
25
+ # Parse tracking ID to extract axes position and trace ID
26
+ ax_row, ax_col, trace_id = _parse_tracking_id(id)
27
+
22
28
  # Get the args from tracked_dict
23
29
  args = tracked_dict.get("args", [])
24
30
 
@@ -37,7 +43,10 @@ def _format_sns_jointplot(id, tracked_dict, kwargs):
37
43
  y_data = data[y_var]
38
44
 
39
45
  result = pd.DataFrame(
40
- {f"{id}_joint_{x_var}": x_data, f"{id}_joint_{y_var}": y_data}
46
+ {
47
+ get_csv_column_name(f"joint_{x_var}", ax_row, ax_col, trace_id=trace_id): x_data,
48
+ get_csv_column_name(f"joint_{y_var}", ax_row, ax_col, trace_id=trace_id): y_data,
49
+ }
41
50
  )
42
51
  return result
43
52
 
@@ -46,7 +55,10 @@ def _format_sns_jointplot(id, tracked_dict, kwargs):
46
55
  # If no x, y specified, return the whole dataframe
47
56
  result = data.copy()
48
57
  if id is not None:
49
- result.columns = [f"{id}_joint_{col}" for col in result.columns]
58
+ result.columns = [
59
+ get_csv_column_name(f"joint_{col}", ax_row, ax_col, trace_id=trace_id)
60
+ for col in result.columns
61
+ ]
50
62
  return result
51
63
 
52
64
  # Handle numpy arrays directly
@@ -56,6 +68,9 @@ def _format_sns_jointplot(id, tracked_dict, kwargs):
56
68
  and isinstance(args[1], (np.ndarray, list))
57
69
  ):
58
70
  x_data, y_data = args[0], args[1]
59
- return pd.DataFrame({f"{id}_joint_x": x_data, f"{id}_joint_y": y_data})
71
+ return pd.DataFrame({
72
+ get_csv_column_name("joint_x", ax_row, ax_col, trace_id=trace_id): x_data,
73
+ get_csv_column_name("joint_y", ax_row, ax_col, trace_id=trace_id): y_data,
74
+ })
60
75
 
61
76
  return pd.DataFrame()
@@ -12,45 +12,53 @@ __DIR__ = os.path.dirname(__FILE__)
12
12
  import numpy as np
13
13
  import pandas as pd
14
14
 
15
+ from scitex.plt.utils._csv_column_naming import get_csv_column_name
16
+ from ._format_plot import _parse_tracking_id
17
+
15
18
 
16
19
  def _format_sns_lineplot(id, tracked_dict, kwargs):
17
20
  """Format data from a sns_lineplot call."""
18
- # Line plot with potential error bands from seaborn
19
- if len(args) >= 1:
21
+ # Check if tracked_dict is empty or not a dictionary
22
+ if not tracked_dict or not isinstance(tracked_dict, dict):
23
+ return pd.DataFrame()
24
+
25
+ # Parse the tracking ID to get axes position and trace ID
26
+ ax_row, ax_col, trace_id = _parse_tracking_id(id)
27
+
28
+ # Get data from tracked_dict - can be in "data" (from _sns_base_xyhue) or "args"
29
+ data = tracked_dict.get("data")
30
+ args = tracked_dict.get("args", [])
31
+
32
+ # If data is None, try to get it from args
33
+ if data is None and len(args) >= 1:
20
34
  data = args[0]
21
- x_var = kwtracked_dict.get("x")
22
- y_var = kwtracked_dict.get("y")
23
-
24
- # Handle DataFrame input with x, y variables
25
- if isinstance(data, pd.DataFrame) and x_var and y_var:
26
- result = pd.DataFrame(
27
- {
28
- f"{id}_line_{x_var}": data[x_var],
29
- f"{id}_line_{y_var}": data[y_var],
30
- }
31
- )
32
-
33
- # Add grouping variable if present
34
- hue_var = kwtracked_dict.get("hue")
35
- if hue_var and hue_var in data.columns:
36
- result[f"{id}_line_{hue_var}"] = data[hue_var]
37
-
38
- return result
39
-
40
- # Handle direct x, y data arrays
41
- elif (
42
- len(args) > 1
43
- and isinstance(args[0], (np.ndarray, list))
44
- and isinstance(args[1], (np.ndarray, list))
45
- ):
46
- x_data, y_data = args[0], args[1]
47
- return pd.DataFrame({f"{id}_line_x": x_data, f"{id}_line_y": y_data})
48
-
49
- # Handle DataFrame input without x, y specified
50
- elif isinstance(data, pd.DataFrame):
51
- result = data.copy()
52
- if id is not None:
53
- result.columns = [f"{id}_line_{col}" for col in result.columns]
54
- return result
35
+
36
+ x_var = kwargs.get("x")
37
+ y_var = kwargs.get("y")
38
+
39
+ # Handle DataFrame input with x, y variables
40
+ if isinstance(data, pd.DataFrame):
41
+ # If data has been pre-processed by _sns_prepare_xyhue, it may be pivoted
42
+ # Just export all columns with proper naming
43
+ if data.empty:
44
+ return pd.DataFrame()
45
+
46
+ result = {}
47
+ for col in data.columns:
48
+ col_name = str(col) if not isinstance(col, str) else col
49
+ result[get_csv_column_name(col_name, ax_row, ax_col, trace_id=trace_id)] = data[col].values
50
+ return pd.DataFrame(result)
51
+
52
+ # Handle direct x, y data arrays from args
53
+ elif (
54
+ len(args) > 1
55
+ and isinstance(args[0], (np.ndarray, list))
56
+ and isinstance(args[1], (np.ndarray, list))
57
+ ):
58
+ x_data, y_data = args[0], args[1]
59
+ return pd.DataFrame({
60
+ get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id): x_data,
61
+ get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id): y_data
62
+ })
55
63
 
56
64
  return pd.DataFrame()
@@ -11,6 +11,9 @@ __DIR__ = os.path.dirname(__FILE__)
11
11
 
12
12
  import pandas as pd
13
13
 
14
+ from scitex.plt.utils._csv_column_naming import get_csv_column_name
15
+ from ._format_plot import _parse_tracking_id
16
+
14
17
 
15
18
  def _format_sns_pairplot(id, tracked_dict, kwargs):
16
19
  """Format data from a sns_pairplot call."""
@@ -18,6 +21,9 @@ def _format_sns_pairplot(id, tracked_dict, kwargs):
18
21
  if not tracked_dict or not isinstance(tracked_dict, dict):
19
22
  return pd.DataFrame()
20
23
 
24
+ # Parse tracking ID to extract axes position and trace ID
25
+ ax_row, ax_col, trace_id = _parse_tracking_id(id)
26
+
21
27
  # Get the args from tracked_dict
22
28
  args = tracked_dict.get("args", [])
23
29
 
@@ -30,14 +36,20 @@ def _format_sns_pairplot(id, tracked_dict, kwargs):
30
36
  # For pairplot, just return the full DataFrame since it uses all variables
31
37
  result = data.copy()
32
38
  if id is not None:
33
- result.columns = [f"{id}_pair_{col}" for col in result.columns]
39
+ result.columns = [
40
+ get_csv_column_name(f"pair_{col}", ax_row, ax_col, trace_id=trace_id)
41
+ for col in result.columns
42
+ ]
34
43
 
35
44
  # Add vars or hue columns if specified
36
45
  vars_list = kwargs.get("vars")
37
46
  if vars_list and all(var in data.columns for var in vars_list):
38
47
  # Keep only the specified columns
39
48
  result = pd.DataFrame(
40
- {f"{id}_pair_{col}": data[col] for col in vars_list}
49
+ {
50
+ get_csv_column_name(f"pair_{col}", ax_row, ax_col, trace_id=trace_id): data[col]
51
+ for col in vars_list
52
+ }
41
53
  )
42
54
 
43
55
  return result
@@ -1,11 +1,14 @@
1
1
  #!/usr/bin/env python3
2
2
  # -*- coding: utf-8 -*-
3
- # Timestamp: "2025-12-01 12:20:00 (ywatanabe)"
3
+ # Timestamp: "2025-12-13 (ywatanabe)"
4
4
  # File: /home/ywatanabe/proj/scitex-code/src/scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py
5
5
 
6
6
  import numpy as np
7
7
  import pandas as pd
8
8
 
9
+ from scitex.plt.utils._csv_column_naming import get_csv_column_name
10
+ from ._format_plot import _parse_tracking_id
11
+
9
12
 
10
13
  def _format_streamplot(id, tracked_dict, kwargs):
11
14
  """Format data from a streamplot call.
@@ -21,6 +24,9 @@ def _format_streamplot(id, tracked_dict, kwargs):
21
24
  if not tracked_dict or not isinstance(tracked_dict, dict):
22
25
  return pd.DataFrame()
23
26
 
27
+ # Parse the tracking ID to get axes position and trace ID
28
+ ax_row, ax_col, trace_id = _parse_tracking_id(id)
29
+
24
30
  if "args" in tracked_dict:
25
31
  args = tracked_dict["args"]
26
32
  if isinstance(args, tuple) and len(args) >= 4:
@@ -36,10 +42,10 @@ def _format_streamplot(id, tracked_dict, kwargs):
36
42
 
37
43
  df = pd.DataFrame(
38
44
  {
39
- f"{id}_streamplot_x": X.flatten(),
40
- f"{id}_streamplot_y": Y.flatten(),
41
- f"{id}_streamplot_u": U.flatten(),
42
- f"{id}_streamplot_v": V.flatten(),
45
+ get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id): X.flatten(),
46
+ get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id): Y.flatten(),
47
+ get_csv_column_name("u", ax_row, ax_col, trace_id=trace_id): U.flatten(),
48
+ get_csv_column_name("v", ax_row, ax_col, trace_id=trace_id): V.flatten(),
43
49
  }
44
50
  )
45
51
  return df
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """CSV formatter for stx_bar() calls."""
4
+
5
+ import pandas as pd
6
+ import numpy as np
7
+ from scitex.plt.utils._csv_column_naming import get_csv_column_name
8
+ from ._format_plot import _parse_tracking_id
9
+
10
+
11
+ def _format_stx_bar(id, tracked_dict, kwargs):
12
+ """Format data from stx_bar call for CSV export.
13
+
14
+ Parameters
15
+ ----------
16
+ id : str
17
+ Tracking identifier
18
+ tracked_dict : dict
19
+ Dictionary containing tracked data with 'bar_df' key
20
+ kwargs : dict
21
+ Additional keyword arguments (may contain yerr)
22
+
23
+ Returns
24
+ -------
25
+ pd.DataFrame
26
+ Formatted bar data with standardized column names
27
+ """
28
+ if not tracked_dict or not isinstance(tracked_dict, dict):
29
+ return pd.DataFrame()
30
+
31
+ ax_row, ax_col, trace_id = _parse_tracking_id(id)
32
+
33
+ # Get bar_df from tracked data
34
+ bar_df = tracked_dict.get("bar_df")
35
+ if bar_df is not None and isinstance(bar_df, pd.DataFrame):
36
+ result = bar_df.copy()
37
+ renamed = {}
38
+ # Map 'x' and 'height' to standardized column names
39
+ for col in result.columns:
40
+ if col == "x":
41
+ renamed[col] = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
42
+ elif col == "height":
43
+ renamed[col] = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
44
+ else:
45
+ renamed[col] = get_csv_column_name(col, ax_row, ax_col, trace_id=trace_id)
46
+
47
+ result = result.rename(columns=renamed)
48
+
49
+ # Add yerr if present in kwargs
50
+ yerr = kwargs.get("yerr") if kwargs else None
51
+ if yerr is not None:
52
+ try:
53
+ yerr_array = np.asarray(yerr)
54
+ if len(yerr_array) == len(result):
55
+ col_yerr = get_csv_column_name("yerr", ax_row, ax_col, trace_id=trace_id)
56
+ result[col_yerr] = yerr_array
57
+ except (TypeError, ValueError):
58
+ pass
59
+
60
+ return result
61
+
62
+ # Fallback to args if bar_df not found
63
+ args = tracked_dict.get("args", [])
64
+ if len(args) >= 2:
65
+ col_x = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
66
+ col_y = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
67
+ data = {col_x: args[0], col_y: args[1]}
68
+
69
+ # Add yerr if present
70
+ yerr = kwargs.get("yerr") if kwargs else None
71
+ if yerr is not None:
72
+ try:
73
+ yerr_array = np.asarray(yerr)
74
+ col_yerr = get_csv_column_name("yerr", ax_row, ax_col, trace_id=trace_id)
75
+ data[col_yerr] = yerr_array
76
+ except (TypeError, ValueError):
77
+ pass
78
+
79
+ return pd.DataFrame(data)
80
+
81
+ return pd.DataFrame()
82
+
83
+
84
+ # EOF
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """CSV formatter for stx_barh() calls."""
4
+
5
+ import pandas as pd
6
+ import numpy as np
7
+ from scitex.plt.utils._csv_column_naming import get_csv_column_name
8
+ from ._format_plot import _parse_tracking_id
9
+
10
+
11
+ def _format_stx_barh(id, tracked_dict, kwargs):
12
+ """Format data from stx_barh call for CSV export.
13
+
14
+ Parameters
15
+ ----------
16
+ id : str
17
+ Tracking identifier
18
+ tracked_dict : dict
19
+ Dictionary containing tracked data with 'barh_df' key
20
+ kwargs : dict
21
+ Additional keyword arguments (may contain xerr)
22
+
23
+ Returns
24
+ -------
25
+ pd.DataFrame
26
+ Formatted barh data with standardized column names
27
+ """
28
+ if not tracked_dict or not isinstance(tracked_dict, dict):
29
+ return pd.DataFrame()
30
+
31
+ ax_row, ax_col, trace_id = _parse_tracking_id(id)
32
+
33
+ # Get barh_df from tracked data
34
+ barh_df = tracked_dict.get("barh_df")
35
+ if barh_df is not None and isinstance(barh_df, pd.DataFrame):
36
+ result = barh_df.copy()
37
+ renamed = {}
38
+ # Map 'y' and 'width' to standardized column names
39
+ for col in result.columns:
40
+ if col == "y":
41
+ renamed[col] = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
42
+ elif col == "width":
43
+ renamed[col] = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
44
+ else:
45
+ renamed[col] = get_csv_column_name(col, ax_row, ax_col, trace_id=trace_id)
46
+
47
+ result = result.rename(columns=renamed)
48
+
49
+ # Add xerr if present in kwargs
50
+ xerr = kwargs.get("xerr") if kwargs else None
51
+ if xerr is not None:
52
+ try:
53
+ xerr_array = np.asarray(xerr)
54
+ if len(xerr_array) == len(result):
55
+ col_xerr = get_csv_column_name("xerr", ax_row, ax_col, trace_id=trace_id)
56
+ result[col_xerr] = xerr_array
57
+ except (TypeError, ValueError):
58
+ pass
59
+
60
+ return result
61
+
62
+ # Fallback to args if barh_df not found
63
+ args = tracked_dict.get("args", [])
64
+ if len(args) >= 2:
65
+ # Note: in barh, first arg is y positions, second is widths (x values)
66
+ col_y = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
67
+ col_x = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
68
+ data = {col_y: args[0], col_x: args[1]}
69
+
70
+ # Add xerr if present
71
+ xerr = kwargs.get("xerr") if kwargs else None
72
+ if xerr is not None:
73
+ try:
74
+ xerr_array = np.asarray(xerr)
75
+ col_xerr = get_csv_column_name("xerr", ax_row, ax_col, trace_id=trace_id)
76
+ data[col_xerr] = xerr_array
77
+ except (TypeError, ValueError):
78
+ pass
79
+
80
+ return pd.DataFrame(data)
81
+
82
+ return pd.DataFrame()
83
+
84
+
85
+ # EOF
@@ -11,6 +11,8 @@ __DIR__ = os.path.dirname(__FILE__)
11
11
 
12
12
  import numpy as np
13
13
  import pandas as pd
14
+ from scitex.plt.utils._csv_column_naming import get_csv_column_name
15
+ from ._format_plot import _parse_tracking_id
14
16
 
15
17
 
16
18
  def _format_plot_conf_mat(id, tracked_dict, kwargs):
@@ -28,6 +30,9 @@ def _format_plot_conf_mat(id, tracked_dict, kwargs):
28
30
  if not tracked_dict or not isinstance(tracked_dict, dict):
29
31
  return pd.DataFrame()
30
32
 
33
+ # Parse tracking ID to get axes position and trace ID
34
+ ax_row, ax_col, trace_id = _parse_tracking_id(id)
35
+
31
36
  # Get the args from tracked_dict
32
37
  args = tracked_dict.get("args", [])
33
38
 
@@ -48,8 +53,11 @@ def _format_plot_conf_mat(id, tracked_dict, kwargs):
48
53
  # Reset index to make it a regular column
49
54
  df = df.reset_index().rename(columns={"index": "True_Class"})
50
55
 
51
- # Add prefix to all columns
52
- df.columns = [f"{id}_conf_mat_{col}" for col in df.columns]
56
+ # Add prefix to all columns using single source of truth
57
+ df.columns = [
58
+ get_csv_column_name(f"conf-mat-{col}", ax_row, ax_col, trace_id=trace_id)
59
+ for col in df.columns
60
+ ]
53
61
 
54
62
  return df
55
63
 
@@ -58,7 +66,10 @@ def _format_plot_conf_mat(id, tracked_dict, kwargs):
58
66
 
59
67
  # Create DataFrame with the balanced accuracy
60
68
  if bacc is not None:
61
- df = pd.DataFrame({f"{id}_conf_mat_balanced_accuracy": [bacc]})
69
+ col_name = get_csv_column_name(
70
+ "conf-mat-balanced-accuracy", ax_row, ax_col, trace_id=trace_id
71
+ )
72
+ df = pd.DataFrame({col_name: [bacc]})
62
73
  return df
63
74
 
64
75
  return pd.DataFrame()
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """CSV formatter for stx_contour() calls."""
4
+
5
+ import pandas as pd
6
+ from scitex.plt.utils._csv_column_naming import get_csv_column_name
7
+ from ._format_plot import _parse_tracking_id
8
+
9
+
10
+ def _format_stx_contour(id, tracked_dict, kwargs):
11
+ """Format data from stx_contour call for CSV export.
12
+
13
+ Parameters
14
+ ----------
15
+ id : str
16
+ Identifier for the plot
17
+ tracked_dict : dict
18
+ Dictionary containing tracked data with 'contour_df'
19
+ kwargs : dict
20
+ Keyword arguments passed to stx_contour
21
+
22
+ Returns
23
+ -------
24
+ pd.DataFrame
25
+ Formatted contour data with X, Y, Z columns
26
+ """
27
+ if not tracked_dict or not isinstance(tracked_dict, dict):
28
+ return pd.DataFrame()
29
+
30
+ ax_row, ax_col, trace_id = _parse_tracking_id(id)
31
+
32
+ # Get contour_df from tracked_dict
33
+ contour_df = tracked_dict.get("contour_df")
34
+ if contour_df is not None and isinstance(contour_df, pd.DataFrame):
35
+ result = contour_df.copy()
36
+
37
+ # Rename columns using single source of truth
38
+ renamed = {}
39
+ for col in result.columns:
40
+ if col == "X":
41
+ renamed[col] = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
42
+ elif col == "Y":
43
+ renamed[col] = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
44
+ elif col == "Z":
45
+ renamed[col] = get_csv_column_name("z", ax_row, ax_col, trace_id=trace_id)
46
+ else:
47
+ renamed[col] = get_csv_column_name(col.lower(), ax_row, ax_col, trace_id=trace_id)
48
+
49
+ return result.rename(columns=renamed)
50
+
51
+ return pd.DataFrame()
52
+
53
+
54
+ # EOF
@@ -6,6 +6,9 @@
6
6
  import os
7
7
  import pandas as pd
8
8
 
9
+ from scitex.plt.utils._csv_column_naming import get_csv_column_name
10
+ from ._format_plot import _parse_tracking_id
11
+
9
12
  __FILE__ = __file__
10
13
  __DIR__ = os.path.dirname(__FILE__)
11
14
  # ----------------------------------------
@@ -37,7 +40,16 @@ def _format_plot_ecdf(id, tracked_dict, kwargs):
37
40
 
38
41
  # Add prefix to column names if ID is provided
39
42
  if id is not None:
40
- # Rename columns with ID prefix
41
- result.columns = [f"{id}_ecdf_{col}" for col in result.columns]
43
+ # Parse the tracking ID to get axes position and trace ID
44
+ ax_row, ax_col, trace_id = _parse_tracking_id(id)
45
+
46
+ # Rename columns using single source of truth
47
+ renamed = {}
48
+ for col in result.columns:
49
+ # Use the original column name as the variable (e.g., "ecdf_value", "ecdf_prob")
50
+ renamed[col] = get_csv_column_name(
51
+ f"ecdf_{col}", ax_row, ax_col, trace_id=trace_id
52
+ )
53
+ result = result.rename(columns=renamed)
42
54
 
43
55
  return result
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """CSV formatter for stx_errorbar() calls."""
4
+
5
+ import pandas as pd
6
+ import numpy as np
7
+ from scitex.plt.utils._csv_column_naming import get_csv_column_name
8
+ from ._format_plot import _parse_tracking_id
9
+
10
+
11
+ def _format_stx_errorbar(id, tracked_dict, kwargs):
12
+ """Format data from stx_errorbar call for CSV export.
13
+
14
+ Parameters
15
+ ----------
16
+ id : str
17
+ Tracking identifier
18
+ tracked_dict : dict
19
+ Dictionary containing tracked data with 'errorbar_df' key
20
+ kwargs : dict
21
+ Additional keyword arguments (may contain yerr, xerr)
22
+
23
+ Returns
24
+ -------
25
+ pd.DataFrame
26
+ Formatted errorbar data with standardized column names
27
+ """
28
+ if not tracked_dict or not isinstance(tracked_dict, dict):
29
+ return pd.DataFrame()
30
+
31
+ ax_row, ax_col, trace_id = _parse_tracking_id(id)
32
+
33
+ # Get errorbar_df from tracked data
34
+ errorbar_df = tracked_dict.get("errorbar_df")
35
+ if errorbar_df is not None and isinstance(errorbar_df, pd.DataFrame):
36
+ result = errorbar_df.copy()
37
+ renamed = {}
38
+
39
+ # Map columns to standardized names
40
+ for col in result.columns:
41
+ if col == "x":
42
+ renamed[col] = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
43
+ elif col == "y":
44
+ renamed[col] = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
45
+ elif col == "yerr":
46
+ # Check if yerr is asymmetric (tuple/list of 2)
47
+ yerr_value = result[col].iloc[0] if len(result) > 0 else None
48
+ if isinstance(yerr_value, (list, tuple)) and len(yerr_value) == 2:
49
+ # Handle asymmetric yerr separately below
50
+ continue
51
+ else:
52
+ renamed[col] = get_csv_column_name("yerr", ax_row, ax_col, trace_id=trace_id)
53
+ elif col == "xerr":
54
+ # Check if xerr is asymmetric (tuple/list of 2)
55
+ xerr_value = result[col].iloc[0] if len(result) > 0 else None
56
+ if isinstance(xerr_value, (list, tuple)) and len(xerr_value) == 2:
57
+ # Handle asymmetric xerr separately below
58
+ continue
59
+ else:
60
+ renamed[col] = get_csv_column_name("xerr", ax_row, ax_col, trace_id=trace_id)
61
+ else:
62
+ renamed[col] = get_csv_column_name(col, ax_row, ax_col, trace_id=trace_id)
63
+
64
+ result = result.rename(columns=renamed)
65
+
66
+ # Handle asymmetric error bars if needed from kwargs
67
+ yerr = kwargs.get("yerr") if kwargs else None
68
+ xerr = kwargs.get("xerr") if kwargs else None
69
+
70
+ if yerr is not None and isinstance(yerr, (list, tuple)) and len(yerr) == 2:
71
+ col_yerr_neg = get_csv_column_name("yerr-neg", ax_row, ax_col, trace_id=trace_id)
72
+ col_yerr_pos = get_csv_column_name("yerr-pos", ax_row, ax_col, trace_id=trace_id)
73
+ result[col_yerr_neg] = yerr[0]
74
+ result[col_yerr_pos] = yerr[1]
75
+
76
+ if xerr is not None and isinstance(xerr, (list, tuple)) and len(xerr) == 2:
77
+ col_xerr_neg = get_csv_column_name("xerr-neg", ax_row, ax_col, trace_id=trace_id)
78
+ col_xerr_pos = get_csv_column_name("xerr-pos", ax_row, ax_col, trace_id=trace_id)
79
+ result[col_xerr_neg] = xerr[0]
80
+ result[col_xerr_pos] = xerr[1]
81
+
82
+ return result
83
+
84
+ # Fallback to args if errorbar_df not found
85
+ args = tracked_dict.get("args", [])
86
+ if len(args) >= 2:
87
+ col_x = get_csv_column_name("x", ax_row, ax_col, trace_id=trace_id)
88
+ col_y = get_csv_column_name("y", ax_row, ax_col, trace_id=trace_id)
89
+ data = {col_x: args[0], col_y: args[1]}
90
+
91
+ # Add error bars if present
92
+ yerr = kwargs.get("yerr") if kwargs else None
93
+ xerr = kwargs.get("xerr") if kwargs else None
94
+
95
+ if yerr is not None:
96
+ if isinstance(yerr, (list, tuple)) and len(yerr) == 2:
97
+ col_yerr_neg = get_csv_column_name("yerr-neg", ax_row, ax_col, trace_id=trace_id)
98
+ col_yerr_pos = get_csv_column_name("yerr-pos", ax_row, ax_col, trace_id=trace_id)
99
+ data[col_yerr_neg] = yerr[0]
100
+ data[col_yerr_pos] = yerr[1]
101
+ else:
102
+ col_yerr = get_csv_column_name("yerr", ax_row, ax_col, trace_id=trace_id)
103
+ data[col_yerr] = yerr
104
+
105
+ if xerr is not None:
106
+ if isinstance(xerr, (list, tuple)) and len(xerr) == 2:
107
+ col_xerr_neg = get_csv_column_name("xerr-neg", ax_row, ax_col, trace_id=trace_id)
108
+ col_xerr_pos = get_csv_column_name("xerr-pos", ax_row, ax_col, trace_id=trace_id)
109
+ data[col_xerr_neg] = xerr[0]
110
+ data[col_xerr_pos] = xerr[1]
111
+ else:
112
+ col_xerr = get_csv_column_name("xerr", ax_row, ax_col, trace_id=trace_id)
113
+ data[col_xerr] = xerr
114
+
115
+ return pd.DataFrame(data)
116
+
117
+ return pd.DataFrame()
118
+
119
+
120
+ # EOF